我在 AppLinks 上遇到了同样的问题,并决定完全放弃它们,只使用 facebook 的应用程序链接主机:https ://developers.facebook.com/docs/applinks/hosting-api
我的应用程序实际上只是移动应用程序,我最初误解了 AppLinks 的工作方式。我以为我可以将al_ios_*
元标记放在一个通用的网页上,但这是错误的。我的网站上的每条内容都需要有一个单独的页面,并且这些页面中的每一个都需要有自己的 AppLinks 元标记,以将该特定内容的 URL 发送回我的应用程序。
当我做错了,当我在 facebook 中点击我的 OpenGraph 故事时,它会在网络浏览器中打开我的网站,并且底部工具栏中有一个操作图标,我可以点击它并选择打开我的应用程序。或者我必须在 OpenGraph 故事中精确点击我的应用程序的名称。其中任何一个都可以快速切换到我的应用程序,但 URL 不会特定于我希望我的应用程序导航到的内容。此外,这两个选项都很糟糕——我只想点击故事的任何地方并直接进入我的应用程序,这就是我们都在这里的原因。
解决方案
我将使用带有共享对话框的 OpenGraph 故事作为示例。
首先,您需要在您的服务器上创建一个托管应用程序链接,而不是在应用程序中。在创建您的 OpenGraph 故事或任何要共享的内容之前,请调用您的服务器以完成 2 件事:
1.) 调用 API 来创建一个新的 facebook 应用链接,这会给你一个 ID
2.) 使用该 ID 进行第二次 API 调用以获取托管应用程序链接的 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:
下面。现在,当您在 facebook 应用程序中单击您的故事时,它将直接进入您的应用程序。没有网络废话。
// 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...