无法使新的AppLink在iOS或Android上运行

最新更新下面更新#5

我试图为我的iOS和Android应用程序实现AppLink: http ://applinks.org

我做了以下:

  1. 为我的应用程序设置一个自定义urlscheme:inacho://
  2. 安装在我的应用程序委托: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  3. 将元标记添加到我的网站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" /> 

我已经validation了,通过在inacho:// default这样的链接中inputNotes并点击它创build的链接,urlscheme效果很好。 WA-LA! 它打开我的应用程序。

但是当我尝试点击从Facebook或Quip到www.nachorater.com的链接时,这两个应用程序自动似乎都不会自动注意到该网站已经设置了这些应用程序链接,而只是在浏览器中加载网站而不是尝试打开我的应用程序。

有没有人得到这个工作?

更新:

我有一些元标记不在我的模板的<head>部分,我修好了。

现在链接:从iOS的Facebook应用程序http://www.nachorater.com添加一个很好的小popup,让你打开iNacho应用程序中的URL像这样:

截图

但是我的dynamic评论的链接似乎没有工作,但Ming指出的debugging应用程序显示meta标签看起来是正确的。

例如, http://www.nachorater.com/getReview?reviewID=6396169718595584

元标记debugging时使用https://developers.facebook.com/tools/debug/og/object?q=http%3A%2F%2Fwww.nachorater.com%2FgetReview%3FreviewID%3D6396169718595584 :

元标记

更新#2:

我发布了一个新的烤干酪辣味玉米片审查链接到我的iNacho Facebook的时间表,然后尝试点击它从Facebook手机应用程序。

它开始加载页面,并popup方便的指标,让你打开在iNacho的应用程序,但一旦加载页面,指标走了(我可以点击它之前)。

更新#3:

从Facebook应用程序,我现在可以触发我的评论inachourl,但它是唯一的,如果我点击小popup在iNacho中打开之前,它消失。 如果我让页面完全加载到Facebook的内置Web视图中,那么popup窗口仍然会消失。

这是Applinks的问题吗? 或Facebook应用程序的问题? 或通过devise,为什么?

更新#4:

我可能知道问题是什么。 审查页面反过来加载了一个dynamic的图像,为烤干酪辣味玉米片审查。 所以通过加载页面,它有一个img src标签,它指向一个加载图像的dynamicurl。 这被误认为是某种“redirect”行为?

img标记(呈现)的示例: <img width="300" src="/getReviewImage?imageID=6125868501958656"></img>

注意:还有一些其他脚本/ ajax也会被dynamic地加载(Facebook和twitter小部件等)。

这是AppLinks或Facebook移动应用程序中的错误吗? 不应该不关心像Ajax和dynamic图像的背景加载对象吗?

更新#5

2014年7月15日 – 这仍然是最新的Facebook应用程序发生。 当我点击从我的iNacho Facebook页面到我的iNacho网站的链接时,它会popup选项,在页面完成加载之前,在应用程序中打开它。 然后它隐藏它。

至于twitter应用程序,它甚至不给我popup一秒钟。 它似乎并没有认识到这个链接是启用appslink的。

Quip另一方面,我粘贴了一个烤干酪辣味玉米片链接,第一次点击它,它去了它的内置Safari浏览器,没有select在我的应用程序中打开。 但第二次点击它,它直接打开我的应用程序。

总结:到目前为止,似乎有些应用程序可能会错误地执行AppLinks导航部分。 奎普似乎工作,但即使是Facebook自己的应用程序似乎不工作。

Solutions Collecting From Web of "无法使新的AppLink在iOS或Android上运行"

我与AppLink有同样的问题,并决定完全放弃他们,只是使用Facebook的应用程序链接主机: https : //developers.facebook.com/docs/applinks/hosting-api

我的应用程序只是真正的移动,我误解了AppLinks是如何工作的。 我以为我可以把al_ios_* meta标签放在一个单一的通用网页上,但这是错误的。 对于我网站上的每个内容,都需要一个单独的页面,每个页面都需要有自己的AppLinks元标记,以便将特定内容的URL发送回我的应用程序。

当我做错了,当我在Facebook上点击我的OpenGraph故事时,它会在networking浏览器中打开我的网站,在底部工具栏中有一个动作图标,我可以点击并可以select打开我的应用程序。 或者我将不得不在OpenGraph故事中精确地点击我的应用程序的名称。 这些快速切换到我的应用程序,但URL不会特定于我希望我的应用程序导航到的内容。 而且,这两个选项都很糟糕 – 我只是想挖掘故事中的任何地方,直接进入我的应用程序,这就是为什么我们都在这里。

解决scheme

我将以共享对话框为例,使用OpenGraph的故事。

首先,您需要在服务器上创build托pipe应用程序链接,而不是在应用程序中。 在创build您的OpenGraph故事或任何被共享之前,打电话给您的服务器来完成2件事情:

1.)创build一个API调用来创build一个新的Facebook应用程序链接,它会给你一个ID

2.)使用该ID进行第二次API调用,以获取托pipe应用程序链接的URL

这必须在服务器上完成,因为这些API调用需要应用程序访问令牌,而不是用户访问令牌。 此令牌具有应用程序级别权限,而不具有用户级别权限 你不能也不应该在你的移动应用程序的任何地方存储你的Facebook应用程序的秘密,因为有人可以反编译你的应用程序,并更改你的Facebook应用程序。 不好。 使用您的服务器,因为它可以安全地知道你的应用程序秘密

我的服务器端是在PHP中,所以这里是一个如何完成这个的例子。 处理API并不是特别愉快的经历,所以我会分享,希望能帮助其他人格式化请求:

 # 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 

回到你的应用程序,一旦你确认了一个好的回应,把你得到的规范URL作为url参数在[FBGraphObject openGraphObjectForPostWithType: below。 现在,当您在Facebook应用程序中点击您的故事时,它将直接进入您的应用程序。 没有networking废话。

 // 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... 

当我在开发我的应用程序Sweep时,我花了一段时间在应用程序上花费了一个薪水/分享墙。 尽pipe有这个承诺,但我仍然面临着AppLink真的在Facebook上实际连接的问题。 基于这个问题,我构build了一个名为branch.io的服务,它为我托pipe链接,并自动为Android / iOS插入正确的AppLinks元标记。 链接实际上按预期工作,就像那样疯狂。 它使用客户端JS与AppLinks的组合,使它们在每个webview和本地浏览器中正确redirect

以下是在iOS上创build共享链接的高级指南:

  1. 要开始使用,只需在dashboard.branch.io的仪表板上的任一商店中configuration应用程序的位置即可。 完成所有设置后,您将获得分支机构应用程序密钥。

  2. 荚“科”或者你可以在这里克隆开源的回购: https : //github.com/BranchMetrics/Branch-iOS-SDK

  3. 使用键'branch_key'将分支键添加到您的plist文件中作为string

  4. 将下面的代码添加到您的AppDelegate在适当的方法

在didFinishLaunchingWithOptions中:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // your other init code Branch *branch = [Branch getInstance]; [branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) { // previously initUserSessionWithCallback:withLaunchOptions: if (!error) { // params are the deep linked params associated with the link that the user clicked before showing up // params will be empty if no data found // here is the data from the example below if a new user clicked on Joe's link and installed the app NSString *name = [params objectForKey:@"user"]; // returns Joe NSString *profileUrl = [params objectForKey:@"profile_pic"]; // returns https://s3-us-west-1.amazonaws.com/myapp/joes_pic.jpg NSString *description = [params objectForKey:@"description"]; // returns Joe likes long walks on the beach... // route to a profile page in the app for Joe // show a customer welcome } }]; } 

在处理URI调用的openUrl中:

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // pass the url to the handle deep link call // if handleDeepLink returns YES, and you registered a callback in initSessionAndRegisterDeepLinkHandler, the callback will be called with the data associated with the deep link if (![[Branch getInstance] handleDeepLink:url]) { // do other deep link routing for the Facebook SDK, Pinterest SDK, etc } return YES; } 
  1. 最后,要创build托pipe链接,这非常简单。 你只需要调用getShortUrl来dynamic创build一个。 你可以在链接中放置尽可能多的键和值(可以在initSessioncallback中获取)

你可以把这个片段放在任何你想创build链接的地方:

 NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; [params setObject:@"Joe" forKey:@"user"]; [params setObject:@"url.to.picture/mypic.png" forKey:@"profile_pic"]; [params setObject:@"Joe likes long walks on the beach..." forKey:@"description"]; // Customize the display of the link [params setObject:@"Joe's MyApp Referral" forKey:@"$og_title"]; [params setObject:@"url.to.picture/mypic.png" forKey:@"$og_image_url"]; [params setObject:@"Join Joe in MyApp - it's awesome" forKey:@"$og_description"]; // Customize the redirect performance [params setObject:@"http://myapp.com/desktop_splash" forKey:@"$desktop_url"]; Branch *branch = [Branch getInstance]; [branch getShortURLWithParams:params andCallback:^(NSString *url, NSError *error) { // show the link to the user or share it immediately }]; 

Android在方法调用和function方面非常相似,可以在网站上find。

对不起,如果我的答案不是你所期望的,而只是分享我们在我们的网站和应用程序上所做的。

例如,我知道我们必须添加更多标签才能使用twitter卡,下面是我们页面中的元属性列表:

 meta property="twitter:card" content="" meta property="twitter:title" content="" meta property="twitter:description" content="" meta property="twitter:image:src" content="" meta property="twitter:app:id:iphone" content="" meta property="twitter:app:name:iphone" content="Marmiton" meta property="twitter:app:url:iphone" content="" meta property="twitter:app:id:googleplay" content="" meta property="twitter:app:name:googleplay" content="" meta property="twitter:app:url:googleplay" content="" 

和你也有:

 meta property="al:iphone:app_store_id" content="" meta property="al:iphone:app_name" content="" meta property="al:iphone:url" content="" meta property="al:android:package" content="" meta property="al:android:app_name" content="" meta property="al:android:url" content="" 

我们也有facebook opengraph meta定义,如fb:app_id。 我提到,因为当你收到应用程序的深层链接时,你也在applinks链接中有facebook应用程序id。

从我们testing的结果来看:

  • Facebook不直接在iOS上打开深层链接,而Android则为您提供应用程序select。 它有时会在屏幕底部显示蓝色的popup窗口,有时你只需要在facebook(safari)webview中的分享button(仅在第一次载入时)点击分享button时在动作表中添加了一个链接。的链接取决于内容如何在Facebook上分享。

  • 叽叽喳喳iOS上添加一个链接到卡内的应用程序。

不知道我可以添加更多。

希望它有一点帮助。