コード例 #1
0
        Uri BuildUrl(AppLink appLink, Uri targetUrl, JsonObject extras, RefererAppLink refererAppLink = null)
        {
            var appLinkDataJson = JsonSerializeAppLinkData(appLink, extras);
            var builder         = new UriBuilder(targetUrl);
            var query           = Utility.ParseQueryString(builder.Query);

            query[KEY_APP_LINK_DATA] = appLinkDataJson;

            if (refererAppLink != null)
            {
                var refererAppLinkJson = JsonSerializeRefererAppLink(refererAppLink);

                if (!string.IsNullOrEmpty(refererAppLinkJson))
                {
                    query[KEY_REFERER_DATA] = refererAppLinkJson;
                }
            }

            var querystr = new StringBuilder();

            foreach (var key in query.Keys)
            {
                querystr.Append(Utility.UrlEncode(key));
                querystr.Append("=");
                querystr.Append(Utility.UrlEncode(query[key]));
                querystr.Append("&");
            }

            builder.Query = querystr.ToString().TrimEnd('&');

            return(builder.Uri);
        }
コード例 #2
0
        string JsonSerializeAppLinkData(AppLink appLink, JsonObject extras)
        {
            var j = new JsonObject();

            j ["target_url"] = appLink.SourceUrl.ToString();
            j ["version"]    = AppLinks.Version;
            j ["user_agent"] = AppLinks.UserAgent;
            j ["extras"]     = extras;

            return(j.ToString());
        }
コード例 #3
0
        public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
        {
            try
            {
                // Find the first eligible/launchable target in the BFAppLink.
                foreach (var target in appLink.Targets)
                {
                    var wpTarget = target as WindowsPhoneAppLinkTarget;

                    if (wpTarget == null)
                    {
                        continue;
                    }

                    var url      = BuildUrl(appLink, wpTarget.Url, extras);
                    var launched = await Windows.System.Launcher.LaunchUriAsync(url);

                    if (launched)
                    {
                        return(NavigationResult.App);
                    }
                }

                // Fall back to opening the url in the browser if available.
                if (appLink.WebUrl != null)
                {
                    var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras);

                    var handled = RaiseWillNavigateToWebUrl(navigateUrl);
                    if (handled)
                    {
                        return(NavigationResult.Web);
                    }

                    var launched = await Windows.System.Launcher.LaunchUriAsync(navigateUrl);

                    if (launched)
                    {
                        return(NavigationResult.Web);
                    }
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }

            // Otherwise, navigation fails.
            return(NavigationResult.Failed);
        }
コード例 #4
0
        async Task OpenRefererAppLink(AppLink refererAppLink)
        {
            if (refererAppLink != null)
            {
                Remove();

                var result = await AppLinks.Navigator.Navigate(refererAppLink);

                var evt2 = OnNavigatedToAppLink;
                if (evt2 != null)
                {
                    evt2(refererAppLink, result);
                }
            }
        }
コード例 #5
0
        public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
        {
            if (appLink.WebUrl != null)
            {
                var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras);

                var handled = RaiseWillNavigateToWebUrl(navigateUrl);
                if (handled)
                {
                    return(NavigationResult.Web);
                }

                System.Diagnostics.Process.Start(navigateUrl.ToString());
                return(NavigationResult.Web);
            }

            return(NavigationResult.Failed);
        }
コード例 #6
0
        public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
        {
            try {
                // Find the first eligible/launchable target in the BFAppLink.
                var eligibleTarget = appLink.Targets.FirstOrDefault(t =>
                                                                    UIApplication.SharedApplication.CanOpenUrl(t.Url));

                if (eligibleTarget != null)
                {
                    var appLinkUrl = BuildUrl(appLink, eligibleTarget.Url, extras, refererAppLink);

                    // Attempt to navigate
                    if (UIApplication.SharedApplication.OpenUrl(appLinkUrl))
                    {
                        return(NavigationResult.App);
                    }
                }

                // Fall back to opening the url in the browser if available.
                if (appLink.WebUrl != null)
                {
                    var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras, refererAppLink);

                    var handled = RaiseWillNavigateToWebUrl(navigateUrl);

                    if (handled)
                    {
                        return(NavigationResult.Web);
                    }

                    // Attempt to navigate
                    if (UIApplication.SharedApplication.OpenUrl(navigateUrl))
                    {
                        return(NavigationResult.Web);
                    }
                }
            }
            catch (Exception ex) {
                Console.WriteLine(ex);
            }

            // Otherwise, navigation fails.
            return(NavigationResult.Failed);
        }
コード例 #7
0
        public void ShowRefererOverlay(AppLink refererLink)
        {
            RefererLink = refererLink;

            if (RefererLink != null)
            {
                if (RefererLink.Targets == null)
                {
                    lblText = "Tap to return to previous app";
                }
                else
                {
                    var target = RefererLink.Targets.FirstOrDefault();
                    if (target != null)
                    {
                        lblText = "Tap to return to " + (target.AppName ?? " previous app");
                    }
                }

                Layout();
            }
        }
コード例 #8
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
        public async Task<NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
        {
            try
            {
                // Find the first eligible/launchable target in the BFAppLink.
                foreach (var target in appLink.Targets)
                {
                    var wpTarget = target as WindowsPhoneAppLinkTarget;

                    if (wpTarget == null)
                        continue;

                    var url = BuildUrl(appLink, wpTarget.Url, extras);
                    var launched = await Windows.System.Launcher.LaunchUriAsync(url);

                    if (launched)
                        return NavigationResult.App;
                }

                // Fall back to opening the url in the browser if available.
                if (appLink.WebUrl != null)
                {
                    var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras);

					var handled = RaiseWillNavigateToWebUrl(navigateUrl);
					if (handled)
						return NavigationResult.Web

                    var launched = await Windows.System.Launcher.LaunchUriAsync(navigateUrl);

                    if (launched)
                        return NavigationResult.Web;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            // Otherwise, navigation fails.
            return NavigationResult.Failed;
        }
コード例 #9
0
 public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
 {
     throw new NotSupportedException("You can't run this from the Portable Library.  Reference a platform Specific Library Instead");
 }
コード例 #10
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras)
		{
			return await Navigate (appLink, extras, null);
		}
コード例 #11
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate(AppLink appLink, RefererAppLink refererAppLink)
		{
			return await Navigate (appLink, null, refererAppLink);
		}
コード例 #12
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate(AppLink appLink)
		{
			return await Navigate (appLink, null, null);
		}
コード例 #13
0
ファイル: AppLinkUrl.cs プロジェクト: Redth/Rivets
        void Initialize(Uri url, string appLinkDataJson)
        {
            #if __ANDROID__
            if (string.IsNullOrEmpty(appLinkDataJson))
                throw new ArgumentNullException("apLinkDataJson", "On Android you should pass the 'Intent.GetStringExtra(\"ap_applink_data\")' contents into the ctor");
            #endif

            InputUrl = url;
            TargetUrl = url;

            TargetQueryParameters = Utility.ParseQueryString(url.Query);
            InputQueryParameters = Utility.ParseQueryString(url.Query);

            var appLinkData = string.Empty;

            if (!string.IsNullOrEmpty (appLinkDataJson)) {
                appLinkData = appLinkDataJson;
            } else {
                if (InputQueryParameters.ContainsKey ("al_applink_data"))
                    appLinkData = InputQueryParameters ["al_applink_data"];
            }

            if (!string.IsNullOrEmpty (appLinkData)) {

                JsonValue json = null;

                try {
                    json = JsonObject.Parse(appLinkData);
                } catch (Exception ex) {
                    Debug.WriteLine (ex);
                }

                if (json != null) {

                    if (json.ContainsKey("version"))
                        AppLinksVersion = (string)json ["version"];

                    if (json.ContainsKey ("extras"))
                        Extras = json ["extras"] ?? new JsonObject();

                    if (json.ContainsKey ("user_agent"))
                        UserAgent = (string)json ["user_agent"];

                    // Try to get the target url from the applink data
                    try {
                        TargetUrl = new Uri((string)json["target_url"]);
                        TargetQueryParameters = Utility.ParseQueryString(TargetUrl.Query);
                    }
                    catch {
                        TargetUrl = url;
                        TargetQueryParameters = InputQueryParameters;
                    }

                    var refererData = string.Empty;
                    if (InputQueryParameters.ContainsKey("referer_app_link"))
                        refererData = InputQueryParameters ["referer_app_link"];

                    if (!string.IsNullOrEmpty (refererData)) {

                        try {
                            var jsonReferer = JsonObject.Parse(refererData);

                            var referrerUrl = new Uri((string)jsonReferer["url"]);
                            var referrerAppName = (string)jsonReferer["app_name"];
                            // According to specs, the app store id shouldn't get passed in the referrer
                            //var referrerAppStoreId = jsonReferer["app_store_id"].ToString();

                            // Create a new AppLink object with the target set to the referrer info
                            Referrer = new AppLink {
                                SourceUrl = referrerUrl,
                                Targets = new List<IAppLinkTarget> {
                                    new IOSAppLinkTarget {
                                        AppName = referrerAppName,
                                        Url = referrerUrl
                                    }
                                }
                            };
                        } catch (Exception ex) {
                            Debug.WriteLine (ex);
                        }
                    }
                }
            }
        }
コード例 #14
0
ファイル: RefererViewBar.cs プロジェクト: Redth/Rivets
		public void ShowRefererOverlay(AppLink refererLink)
		{
			RefererLink = refererLink;

			if (RefererLink != null) {
				if (RefererLink.Targets == null) {
					lblText = "Tap to return to previous app";
				} else {
					var target = RefererLink.Targets.FirstOrDefault ();
					if (target != null)
						lblText = "Tap to return to " + (target.AppName ?? " previous app");
				}

				Layout ();
			}
		}
コード例 #15
0
ファイル: RefererViewBar.cs プロジェクト: Redth/Rivets
		async Task OpenRefererAppLink (AppLink refererAppLink)
		{
			if (refererAppLink != null) {

				Remove ();

				var result = await AppLinks.Navigator.Navigate (refererAppLink);

				var evt2 = OnNavigatedToAppLink;
				if (evt2 != null)
					evt2 (refererAppLink, result);
			}
		}
コード例 #16
0
        public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
        {
            var context = Android.App.Application.Context;
            var pm      = context.PackageManager;

            var appLinkDataJson = JsonSerializeAppLinkData(appLink, extras);

            Intent eligibleTargetIntent = null;

            foreach (var t in appLink.Targets)
            {
                var target = t as AndroidAppLinkTarget;

                if (target == null)
                {
                    continue;
                }

                var targetIntent = new Intent(Intent.ActionView);

                if (target.Url != null)
                {
                    targetIntent.SetData(Android.Net.Uri.Parse(target.Url.ToString()));
                }
                else
                {
                    targetIntent.SetData(Android.Net.Uri.Parse(appLink.SourceUrl.ToString()));
                }

                targetIntent.SetPackage(target.Package);

                if (target.Class != null)
                {
                    targetIntent.SetClassName(target.Package, target.Class);
                }

                targetIntent.PutExtra(KEY_APP_LINK_DATA, appLinkDataJson);

                var resolved = pm.ResolveActivity(targetIntent, Android.Content.PM.PackageInfoFlags.MatchDefaultOnly);
                if (resolved != null)
                {
                    eligibleTargetIntent = targetIntent;
                    break;
                }
            }

            if (eligibleTargetIntent != null)
            {
                eligibleTargetIntent.AddFlags(ActivityFlags.NewTask);
                context.StartActivity(eligibleTargetIntent);

                return(NavigationResult.App);
            }

            // Fall back to the web if it's available
            if (appLink.WebUrl != null)
            {
                var webUrl = BuildUrl(appLink, appLink.WebUrl, extras);

                var handled = RaiseWillNavigateToWebUrl(webUrl);

                if (!handled)
                {
                    Intent launchBrowserIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(webUrl.ToString()));
                    launchBrowserIntent.AddFlags(ActivityFlags.NewTask);
                    context.StartActivity(launchBrowserIntent);
                }

                return(NavigationResult.Web);
            }

            return(NavigationResult.Failed);
        }
コード例 #17
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
		{
			var context = Android.App.Application.Context;
			var pm = context.PackageManager;

			var appLinkDataJson = JsonSerializeAppLinkData (appLink, extras);

			Intent eligibleTargetIntent = null;

			foreach (var t in appLink.Targets) {
				var target = t as AndroidAppLinkTarget;

				if (target == null)
					continue;

				var targetIntent = new Intent (Intent.ActionView);

				if (target.Url != null)
					targetIntent.SetData (Android.Net.Uri.Parse(target.Url.ToString()));
				else
					targetIntent.SetData (Android.Net.Uri.Parse(appLink.SourceUrl.ToString()));

				targetIntent.SetPackage (target.Package);

				if (target.Class != null)
					targetIntent.SetClassName (target.Package, target.Class);

				targetIntent.PutExtra (KEY_APP_LINK_DATA, appLinkDataJson);

				var resolved = pm.ResolveActivity (targetIntent, Android.Content.PM.PackageInfoFlags.MatchDefaultOnly);
				if (resolved != null) {
					eligibleTargetIntent = targetIntent;
					break;
				}
			}

			if (eligibleTargetIntent != null) {
			
				eligibleTargetIntent.AddFlags (ActivityFlags.NewTask);
				context.StartActivity (eligibleTargetIntent);

				return NavigationResult.App;
			}

			// Fall back to the web if it's available
			if (appLink.WebUrl != null) {

                var webUrl = BuildUrl(appLink, appLink.WebUrl, extras);

				var handled = RaiseWillNavigateToWebUrl (webUrl);

				if (!handled) {
					Intent launchBrowserIntent = new Intent (Intent.ActionView, Android.Net.Uri.Parse (webUrl.ToString ()));
					launchBrowserIntent.AddFlags (ActivityFlags.NewTask);
					context.StartActivity (launchBrowserIntent);
				}

				return NavigationResult.Web;
			}

			return NavigationResult.Failed;
		}
コード例 #18
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
		{
			try {
				// Find the first eligible/launchable target in the BFAppLink.
				var eligibleTarget = appLink.Targets.FirstOrDefault(t => 
					UIApplication.SharedApplication.CanOpenUrl(t.Url));

				if (eligibleTarget != null) {
					var appLinkUrl = BuildUrl(appLink, eligibleTarget.Url, extras, refererAppLink);
					
					// Attempt to navigate
					if (UIApplication.SharedApplication.OpenUrl(appLinkUrl))
						return NavigationResult.App;
				}

				// Fall back to opening the url in the browser if available.
				if (appLink.WebUrl != null) {
					var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras, refererAppLink);

					var handled = RaiseWillNavigateToWebUrl(navigateUrl);

					if (handled)
						return NavigationResult.Web;

					// Attempt to navigate
					if (UIApplication.SharedApplication.OpenUrl(navigateUrl))
						return NavigationResult.Web;		
				}
			}
			catch (Exception ex) {
				Console.WriteLine(ex);
			}

			// Otherwise, navigation fails.
			return NavigationResult.Failed;
		}
コード例 #19
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
		{
			throw new NotSupportedException ("You can't run this from the Portable Library.  Reference a platform Specific Library Instead");
		}
コード例 #20
0
        public async System.Threading.Tasks.Task <Dictionary <Uri, AppLink> > ResolveMultipleAppLinks(params Uri[] urls)
        {
                        #if PORTABLE
            throw new NotImplementedException("You can't call this method from the PCL assembly, please reference a platform specific assembly instead");
                        #endif

            var results = new Dictionary <Uri, AppLink> ();

            var builder = new StringBuilder();
            builder.Append(GRAPH_API_URL);
            builder.Append("/?ids=");

            var ids = string.Join(",", from u in urls select u.ToString());

            builder.Append(Utility.UrlEncode(ids));
            builder.Append("&type=al");
            builder.Append("&access_token=");
            builder.Append(Utility.UrlEncode(AppId + "|" + ClientToken));

                        #if PORTABLE
            var data = string.Empty;
                        #else
            System.Diagnostics.Debug.WriteLine(builder.ToString());
            var data = await http.GetStringAsync(builder.ToString());
                        #endif

            var json = JsonObject.Parse(data);


            foreach (var uri in urls)
            {
                if (!json.ContainsKey(uri.ToString()))
                {
                    continue;
                }

                var aljson = json [uri.ToString()];

                var al = new AppLink {
                    Targets   = new List <IAppLinkTarget>(),
                    SourceUrl = uri
                };

                if (aljson.ContainsKey("web") && aljson["web"].ContainsKey("url"))
                {
                    al.WebUrl = new Uri((string)aljson ["web"] ["url"]);
                }

                if (aljson.ContainsKey("ios"))
                {
                    var items = (JsonArray)aljson ["ios"];
                    al.Targets.AddRange(parseiOSTargets(items, () => new IOSAppLinkTarget()));
                }

                if (aljson.ContainsKey("iphone"))
                {
                    var items = (JsonArray)aljson ["iphone"];
                    al.Targets.AddRange(parseiOSTargets(items, () => new IPhoneAppLinkTarget()));
                }

                if (aljson.ContainsKey("ipad"))
                {
                    var items = (JsonArray)aljson ["ipad"];
                    al.Targets.AddRange(parseiOSTargets(items, () => new IPadAppLinkTarget()));
                }

                if (aljson.ContainsKey("android"))
                {
                    var items = (JsonArray)aljson ["android"];
                    al.Targets.AddRange(parseAndroidTargets(items));
                }

                if (aljson.ContainsKey("windows"))
                {
                    var items = (JsonArray)aljson ["windows"];
                    al.Targets.AddRange(parseWindowsTargets(items, () => new WindowsAppLinkTarget()));
                }

                if (aljson.ContainsKey("windows_phone"))
                {
                    var items = (JsonArray)aljson ["windows_phone"];
                    al.Targets.AddRange(parseWindowsTargets(items, () => new WindowsPhoneAppLinkTarget()));
                }

                if (aljson.ContainsKey("windows_universal"))
                {
                    var items = (JsonArray)aljson ["windows_universal"];
                    al.Targets.AddRange(parseWindowsTargets(items, () => new WindowsUniversalAppLinkTarget()));
                }

                results.Add(uri, al);
            }

            return(results);
        }
コード例 #21
0
 public async Task <NavigationResult> Navigate(AppLink appLink)
 {
     return(await Navigate(appLink, null, null));
 }
コード例 #22
0
 public async Task <NavigationResult> Navigate(AppLink appLink, RefererAppLink refererAppLink)
 {
     return(await Navigate(appLink, null, refererAppLink));
 }
コード例 #23
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras, RefererAppLink refererAppLink)
		{
			if (appLink.WebUrl != null) {
				
				var navigateUrl = BuildUrl(appLink, appLink.WebUrl, extras);

				var handled = RaiseWillNavigateToWebUrl(navigateUrl);
				if (handled)
					return NavigationResult.Web;
				
				System.Diagnostics.Process.Start(navigateUrl.ToString());
				return NavigationResult.Web;
			}
			
			return NavigationResult.Failed;
		}
コード例 #24
0
		public async System.Threading.Tasks.Task<Dictionary<Uri, AppLink>> ResolveMultipleAppLinks (params Uri[] urls)
		{
			#if PORTABLE
			throw new NotImplementedException("You can't call this method from the PCL assembly, please reference a platform specific assembly instead");
			#endif

			var results = new Dictionary<Uri, AppLink> ();

			var builder = new StringBuilder ();
			builder.Append (GRAPH_API_URL);
			builder.Append ("/?ids=");
		
			var ids = string.Join(",", from u in urls select u.ToString());

			builder.Append (Utility.UrlEncode (ids));
			builder.Append ("&type=al");
			builder.Append ("&access_token=");
			builder.Append (Utility.UrlEncode (AppId + "|" + ClientToken));

			#if PORTABLE
			var data = string.Empty;
			#else
			Console.WriteLine (builder.ToString ());
			var data = await http.GetStringAsync (builder.ToString ());
			#endif

			var json = JsonObject.Parse (data);


			foreach (var uri in urls) {

				if (!json.ContainsKey (uri.ToString ()))
					continue;

				var aljson = json [uri.ToString ()];

				var al = new AppLink {
					Targets = new List<IAppLinkTarget>(),
					SourceUrl = uri
				};

				if (aljson.ContainsKey ("web") && aljson["web"].ContainsKey("url"))
					al.WebUrl = new Uri ((string)aljson ["web"] ["url"]);

				if (aljson.ContainsKey ("ios")) {
					var items = (JsonArray)aljson ["ios"];
					al.Targets.AddRange(parseiOSTargets (items, () => new IOSAppLinkTarget()));
				}

				if (aljson.ContainsKey ("iphone")) {
					var items = (JsonArray)aljson ["iphone"];
					al.Targets.AddRange(parseiOSTargets (items, () => new IPhoneAppLinkTarget()));
				}

				if (aljson.ContainsKey ("ipad")) {
					var items = (JsonArray)aljson ["ipad"];
					al.Targets.AddRange(parseiOSTargets (items, () => new IPadAppLinkTarget()));
				}

				if (aljson.ContainsKey ("android")) {
					var items = (JsonArray)aljson ["android"];
					al.Targets.AddRange (parseAndroidTargets (items));
				}

				if (aljson.ContainsKey ("windows")) {
					var items = (JsonArray)aljson ["windows"];
					al.Targets.AddRange (parseWindowsTargets (items, () => new WindowsAppLinkTarget ()));
				}

				if (aljson.ContainsKey ("windows_phone")) {
					var items = (JsonArray)aljson ["windows_phone"];
					al.Targets.AddRange (parseWindowsTargets (items, () => new WindowsPhoneAppLinkTarget ()));
				}

				if (aljson.ContainsKey ("windows_universal")) {
					var items = (JsonArray)aljson ["windows_universal"];
					al.Targets.AddRange (parseWindowsTargets (items, () => new WindowsUniversalAppLinkTarget ()));
				}

				results.Add (uri, al);
			}

			return results;
		}
コード例 #25
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
        Uri BuildUrl(AppLink appLink, Uri targetUrl, JsonObject extras, RefererAppLink refererAppLink = null)
        {
            var appLinkDataJson = JsonSerializeAppLinkData(appLink, extras);
            var builder = new UriBuilder(targetUrl);
			var query = Utility.ParseQueryString(builder.Query);
            query[KEY_APP_LINK_DATA] = appLinkDataJson;

            if (refererAppLink != null)
            {

                var refererAppLinkJson = JsonSerializeRefererAppLink(refererAppLink);

                if (!string.IsNullOrEmpty(refererAppLinkJson))
                    query[KEY_REFERER_DATA] = refererAppLinkJson;
            }

            var querystr = new StringBuilder();
            
            foreach (var key in query.Keys)
            {
                querystr.Append(Utility.UrlEncode(key));
                querystr.Append("=");
                querystr.Append(Utility.UrlEncode(query[key]));
                querystr.Append("&");
            }

            builder.Query = querystr.ToString().TrimEnd('&');

            return builder.Uri;
        }
コード例 #26
0
ファイル: AppLinkNavigator.cs プロジェクト: Redth/Rivets
		string JsonSerializeAppLinkData(AppLink appLink, JsonObject extras)
		{
			var j = new JsonObject ();
			j ["target_url"] = appLink.SourceUrl.ToString ();
			j ["version"] = AppLinks.Version;
			j ["user_agent"] = AppLinks.UserAgent;
			j ["extras"] = extras;

			return j.ToString ();
		}
コード例 #27
0
 public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras)
 {
     return(await Navigate(appLink, extras, null));
 }
コード例 #28
0
        void Initialize(Uri url, string appLinkDataJson)
        {
                        #if __ANDROID__
            if (string.IsNullOrEmpty(appLinkDataJson))
            {
                throw new ArgumentNullException("apLinkDataJson", "On Android you should pass the 'Intent.GetStringExtra(\"ap_applink_data\")' contents into the ctor");
            }
                        #endif

            InputUrl  = url;
            TargetUrl = url;

            TargetQueryParameters = Utility.ParseQueryString(url.Query);
            InputQueryParameters  = Utility.ParseQueryString(url.Query);

            var appLinkData = string.Empty;

            if (!string.IsNullOrEmpty(appLinkDataJson))
            {
                appLinkData = appLinkDataJson;
            }
            else
            {
                if (InputQueryParameters.ContainsKey("al_applink_data"))
                {
                    appLinkData = InputQueryParameters ["al_applink_data"];
                }
            }

            if (!string.IsNullOrEmpty(appLinkData))
            {
                JsonValue json = null;

                try {
                    json = JsonObject.Parse(appLinkData);
                } catch (Exception ex) {
                    Debug.WriteLine(ex);
                }

                if (json != null)
                {
                    if (json.ContainsKey("version"))
                    {
                        AppLinksVersion = (string)json ["version"];
                    }

                    if (json.ContainsKey("extras"))
                    {
                        Extras = json ["extras"] ?? new JsonObject();
                    }

                    if (json.ContainsKey("user_agent"))
                    {
                        UserAgent = (string)json ["user_agent"];
                    }

                    // Try to get the target url from the applink data
                    try {
                        TargetUrl             = new Uri((string)json["target_url"]);
                        TargetQueryParameters = Utility.ParseQueryString(TargetUrl.Query);
                    }
                    catch {
                        TargetUrl             = url;
                        TargetQueryParameters = InputQueryParameters;
                    }

                    var refererData = string.Empty;
                    if (InputQueryParameters.ContainsKey("referer_app_link"))
                    {
                        refererData = InputQueryParameters ["referer_app_link"];
                    }

                    if (!string.IsNullOrEmpty(refererData))
                    {
                        try {
                            var jsonReferer = JsonObject.Parse(refererData);

                            var referrerUrl     = new Uri((string)jsonReferer["url"]);
                            var referrerAppName = (string)jsonReferer["app_name"];
                            // According to specs, the app store id shouldn't get passed in the referrer
                            //var referrerAppStoreId = jsonReferer["app_store_id"].ToString();

                            // Create a new AppLink object with the target set to the referrer info
                            Referrer = new AppLink {
                                SourceUrl = referrerUrl,
                                Targets   = new List <IAppLinkTarget> {
                                    new IOSAppLinkTarget {
                                        AppName = referrerAppName,
                                        Url     = referrerUrl
                                    }
                                }
                            };
                        } catch (Exception ex) {
                            Debug.WriteLine(ex);
                        }
                    }
                }
            }
        }