我遇到了与AppLinks相关的同样问题,所以我决定完全放弃它们,只使用Facebook的应用链接主机:
https://developers.facebook.com/docs/applinks/hosting-api
我的应用程序只适用于移动设备,一开始我误解了AppLinks的工作原理。我以为我只需要在一个通用的网页上放置
al_ios_*
元标签就可以了,但这是错误的。对于我网站上的每一项内容都需要单独的页面,并且每个页面都需要有自己的AppLinks元标签,以将特定内容的URL发送回我的应用程序。
当我做错了时,在Facebook中点击我的OpenGraph故事时,它会在Web浏览器中打开我的网站,并且底部工具栏中会有一个操作图标,我可以点击该图标并选择打开我的应用程序,或者我需要精确地点击OpenGraph故事中我的应用程序名称。任何一种方式都可以快速切换到我的应用程序,但URL不会针对我想要导航到的内容进行指定。而且,这两个选项都很糟糕——我只想点击故事的任何位置并直接进入我的应用程序,这就是我们在这里的原因。
解决方案
我将使用OpenGraph故事和共享对话框作为示例。
首先,您需要在服务器上创建一个托管的应用链接,而不是在应用程序中创建。在创建OpenGraph故事或任何要共享的内容之前,请调用您的服务器以完成以下两个操作:
1. 调用API以创建新的Facebook应用链接,这将返回一个ID。
2. 使用该ID调用第二个API以获取指向托管应用链接的URL。
这必须在服务器上完成,因为这些API调用需要一个应用程序访问令牌,而不是用户访问令牌。此令牌具有应用程序级别权限,而不是用户级别权限。您不能也不应该在移动应用程序中存储您的Facebook应用程序密钥,因为某些人可以反编译您的应用程序并更改您的Facebook应用程序。没有好处。使用服务器,因为它可以安全地知道您的应用程序密钥。
我的服务器端是PHP,所以这是如何完成此操作的示例。与API打交道并不是一件特别愉快的事情,所以我想分享一下希望能帮助其他人格式化请求:
$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);
$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)
);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $formQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$responseJson = curl_exec($ch);
curl_close($ch);
$jsonResponse = json_decode($responseJson, true);
$appLinkId = "";
foreach ($jsonResponse as $key => $val) {
if($key == "id") {
$appLinkId = $val;
}
}
$errorMessage = "";
$canonicalUrl = "";
if(!empty($appLinkId)) {
$getAppLinkUrl = "https://graph.facebook.com/" . $appLinkId;
$ch2 = curl_init();
$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);
$urlResponseJson = curl_exec($ch2);
curl_close($ch2);
$urlJsonResponse = json_decode($urlResponseJson, true);
foreach ($urlJsonResponse as $key => $val) {
if($key == "canonical_url") {
$canonicalUrl = $val;
}
}
if(empty($canonicalUrl)) {
$errorMessage = "Unable to retreive URL.";
}
} else {
$errorMessage = "Unable to publish appLink.";
}
if(empty($errorMessage)) {
$response = json_encode(array("result" => "success",
"canonical_url" => $canonicalUrl));
} else {
$response = json_encode(array("result" => "failed",
"errorMessage" => $errorMessage));
}
回到你的应用程序中,一旦确认获得了良好的响应,请将你收到的规范化URL作为[FBGraphObject openGraphObjectForPostWithType:
下面的url
参数。现在,当你在Facebook应用程序中点击你的故事时,它将直接转到你的应用程序,没有网页上的繁琐操作。
id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
id<FBGraphObject> object;
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...