Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot get the new AppLinks to work on iOS or Android

Latest Update Below at Update #5

I'm trying to implement AppLinks for BOTH my iOS AND Android apps : http://applinks.org

I've done the following:

  1. setup a custom url scheme for my app: inacho://
  2. Setup in my App Delegate: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  3. Add meta tags to my website at http://www.nachorater.com :

<meta property="al:ios:app_store_id" content="581815579"/> <meta property="al:ios:app_name" content="iNacho" /> <meta property="al:ios:url" content="inacho://default" /> 

I've verified that the url scheme works great by typing in a link like inacho://default into Notes and clicking the link it creates. Wa-la! It opens my app.

But when I try clicking on a link to www.nachorater.com from Facebook or Quip, neither app automatically seems to take any notice that the site has these app links setup and it just loads the website in their browser(s) instead of trying to open my app.

Has anyone got this working?

Update:

I had an issue with some meta tags not being in the < head > portion of my templates and I fixed it.

Now the link: http://www.nachorater.com from the iOS Facebook app adds a nice little popup that lets you open the url in the iNacho app like so:

screenshot

But my links to my dynamic reviews do not seem to be working, yet the Debug app that Ming pointed out shows that the meta tags look correct for them.

For example, http://www.nachorater.com/getReview?reviewID=6396169718595584

meta tags when debugging with https://developers.facebook.com/tools/debug/og/object?q=http%3A%2F%2Fwww.nachorater.com%2FgetReview%3FreviewID%3D6396169718595584 :

meta tags

Update #2:

I posted a new nacho review link to my iNacho Facebook timeline and then tried to click on it from the Facebook Mobile app.

It started to load the page and popped up the handy indicator that lets you open the app in iNacho but then once the page loaded, the indicator went away (before I could click it).

Update #3:

From the Facebook app, I can now trigger an inacho URL for my reviews BUT it's ONLY if I click the little popup to open in iNacho before it disappears. If I let the page completely load in Facebook's built-in web view, the little popup disappears still.

Is this a problem with Applinks? Or a problem with the Facebook app? Or by design and why?

Update #4:

I may know what the problem is. The review page in turn loads up a dynamic image for the nacho review. So by loading the page, it has an img src tag that points to a dynamic url that loads the image. Is this being mistaken for a 'redirect' action of some sort?

Example of img tag (rendered): <img width="300" src="/getReviewImage?imageID=6125868501958656"></img>

Note: There are a bunch of other scripts/ajax that gets loaded dynamically too though (Facebook and twitter widgets and the like).

Is this a bug in AppLinks or the Facebook Mobile app? Shouldn't it not care about background loading objects like ajax and dynamic images?

Update #5

7/15/14 - This is still happening with latest Facebook app. When I click a link from my iNacho Facebook page to my iNacho website, it pops up the option to open it in the app for a split second before the page finishes loading. Then it hides it.

As for the twitter app, it does not even give me the popup for a split second. It doesn't seem to recognize the link is appslink enabled at all.

Quip on the other hand, I pasted a nacho link in and the first time I clicked on it, it went to its built-in safari with no option to open in my app. BUT the second time I clicked it, it directly opened my app instead.

Summary: So far, it seems like maybe some apps are implementing the AppLinks Navigation portion incorrectly or something. Quip seems to work but even Facebook's own app seems like it's not working.

like image 637
valheru Avatar asked May 09 '14 07:05

valheru


People also ask

Does Android support universal links?

How do Universal Links work in Android? Android App Links (sometimes referred to as Universal links) are HTTP URLs available on Android 6.0 and higher, that help in bringing your users directly to your Android app. It contains the autoVerify attribute that allows your app to designate itself as a given type of link.

How do I test universal link?

TEST THE UNIVERSAL LINKSRun the application on the simulator once to make sure the application is installed and running fine. 2. Keep the same simulator launched and running. Go to your simulator browser and open type the ngrok domain address i.e., https://1bd39880fbad.ngrok.io in my case.

What are universal links?

Universal links are Apple's way of launching apps on their operating system from a website, also known as a web view. They link to content inside an app or website, giving iOS users an integrated mobile experience. Broadly, there aren't many differences between universal links and traditional deep links.

Why choose Android app links?

Secure and specific: Android App Links use HTTP URLs that link to a website domain you own, so no other app can use your links. One of the requirements for Android App Links is that you verify ownership of your domain through one of our website association methods.

How do I add a link to my Android app?

Add Android App Links. The general steps for creating Android App Links are as follows: Create deep links to specific content in your app: In your app manifest, create intent filters for your website URIs and configure your app to use data from the intents to send users to the right content in your app.

What are the different types of links in Android app links?

Before you implement Android App Links, it's important to understand the different types of links you can create in your Android app: deep links, web links, and Android App Links. Figure 1 shows the relationship among these types of links, and the following sections describe each type of link in more detail.

Is there an alternative to the documentation for Android app links?

As an alternative to the documentation linked above, the Android App Links Assistant is a tool in Android Studio that guides you through each of the steps required to create Android App Links. For additional information, see the following resources: Content and code samples on this page are subject to the licenses described in the Content License.


1 Answers

I was having the same problem with AppLinks and decided to just forego them altogether and just use facebook's app link host: https://developers.facebook.com/docs/applinks/hosting-api

My app is really mobile only, and I misunderstood how AppLinks worked at first. I thought I could just put the al_ios_* meta tags on a single, universal web page but this is wrong. There would need to be a separate page for every piece of content on my site, and each one of those pages needs to have its own AppLinks meta tags to send a URL for that specific content back to my app.

When I was doing it wrong, when I tapped on my OpenGraph story in facebook, it would open my site in the web browser and there was an action icon in the bottom toolbar that I could tap and have the option to open my app. Or I would have to precision-tap the name of my app in the OpenGraph story. Either of those fast-switch to my app, but the URL would not be specific to the content I want my app to navigate to. Also, both of those options suck -- I just want to tap anywhere on the story and go straight to my app, which is why we're all here.

The solution

I am going to use an OpenGraph story with the share dialog as an example.

First, you need to create a hosted app link on your server, not in the app. Before creating your OpenGraph story or whatever is being shared, make a call to your server to accomplish 2 things:

1.) Make an API call to create a new facebook app link, which will give you back an ID

2.) Use that ID to make a 2nd API call to get the URL to your hosted app link

This has to be done on the server because these API calls require an app access token, not a user access token. This token has app level permissions, not user level permissions. You cannot and should not store your facebook app secret anywhere in your mobile application because someone could decompile your app and make changes to your facebook app. No good. Use your server because it can safely know your app secret.

My server side is in PHP so here is an example of how to accomplish this. Dealing with the API wasn't a particularly pleasant experience, so I'll share in hopes that it helps someone else with formatting the requests:

# create a new facebook app link using cURL $metadata = <what to handle in AppDelegate application:openURL:sourceApplication:annotation>; $url = "https://graph.facebook.com/v2.1/app/app_link_hosts"; $ch = curl_init($url);  # create form post data $deepLinkURL = "<myApp>://" . $metadata; $iosArray = json_encode(array(array("url"          => $deepLinkURL,                                     "app_store_id" => <appStoreId (number)>,                                     "app_name"     => "<myAppName>")                               )                        ); $webFallbackArray = json_encode(array("should_fallback" => false));  $formQuery = http_build_query(array("access_token" => "<appId>|<appSecret>",                                     "name"         => $metadata,                                     "ios"          => $iosArray,                                     "web"          => $webFallbackArray)                               );  # options curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $formQuery); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  # get response $responseJson = curl_exec($ch); curl_close($ch);  # decode response from facebook $jsonResponse = json_decode($responseJson, true); $appLinkId = "";  # get appLinkId foreach ($jsonResponse as $key => $val) {      # get status     if($key == "id") {         $appLinkId = $val;     } }  # if response is good, need to request canonical URL from appLinkId $errorMessage = ""; $canonicalUrl = "";  if(!empty($appLinkId)) {      # create another instance of cURL to get the appLink object from facebook using the ID generated by the previous post request     $getAppLinkUrl = "https://graph.facebook.com/" . $appLinkId;     $ch2 = curl_init();      # cURL options     $queryString = http_build_query(array("access_token" => "<appId>|<appSecret>",                                           "fields"       => "canonical_url",                                           "pretty"       => true)                                     );     curl_setopt($ch2, CURLOPT_URL, $getAppLinkUrl . "?" . $queryString);     curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);      # get response     $urlResponseJson = curl_exec($ch2);     curl_close($ch2);      # decode response from facebook     $urlJsonResponse = json_decode($urlResponseJson, true);      # parse response to get canonical URL     foreach ($urlJsonResponse as $key => $val) {         # get canonical URL         if($key == "canonical_url") {             $canonicalUrl = $val;         }     }      # check for result     if(empty($canonicalUrl)) {         $errorMessage = "Unable to retreive URL.";     }  } else {     $errorMessage = "Unable to publish appLink."; }  # encode response back to your app if(empty($errorMessage)) {     $response = json_encode(array("result"        => "success",                                   "canonical_url" => $canonicalUrl)); } else {     $response = json_encode(array("result" => "failed",                                   "errorMessage" => $errorMessage)); }  #send response back to your app 

Back in your app, once you confirm a good response, put the canonical URL you get back as the url parameter in [FBGraphObject openGraphObjectForPostWithType: below. Now when you click on your story in the facebook app, it will go straight to your app. No web nonsense.

// Create an action id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];  // Create an object id<FBGraphObject> object;  // set shareDialog parameters FBOpenGraphActionParams *params = [[FBOpenGraphActionParams alloc] init]; params.action = action; params.actionType = @"<myApp>:<myAction>"; params.previewPropertyName = @"<key>"; object = [FBGraphObject openGraphObjectForPostWithType:@"<myApp>:<myObject>"                                                  title:<title>                                                  image:<urlToPic>                                                    url:<fb.me/xyz canonical URL>                                            description:<someDescription>];  [action setObject:object forKey:@"<key>"];  etc... 
like image 84
jday Avatar answered Oct 06 '22 18:10

jday