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); }
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()); }
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); }
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); } } }
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); }
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); }
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(); } }
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; }
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"); }
public async Task<NavigationResult> Navigate (AppLink appLink, JsonObject extras) { return await Navigate (appLink, extras, null); }
public async Task<NavigationResult> Navigate(AppLink appLink, RefererAppLink refererAppLink) { return await Navigate (appLink, null, refererAppLink); }
public async Task<NavigationResult> Navigate(AppLink appLink) { return await Navigate (appLink, null, null); }
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); } } } } }
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 (); } }
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); } }
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); }
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; }
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; }
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"); }
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); }
public async Task <NavigationResult> Navigate(AppLink appLink) { return(await Navigate(appLink, null, null)); }
public async Task <NavigationResult> Navigate(AppLink appLink, RefererAppLink refererAppLink) { return(await Navigate(appLink, null, refererAppLink)); }
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; }
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; }
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; }
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 (); }
public async Task <NavigationResult> Navigate(AppLink appLink, JsonObject extras) { return(await Navigate(appLink, extras, null)); }
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); } } } } }