最新のアップデートはアップデート#5をご覧ください
iOS アプリと Android アプリの両方に AppLinks を実装しようとしています:http://applinks.org
私は次のことを行いました:
- アプリのカスタム URL スキームを設定します: inacho://
- アプリデリゲートでの設定:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- 私のウェブサイトにメタタグを追加する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" />
Notes に inacho://default のようなリンクを入力し、作成されたリンクをクリックすることで、URL スキームが適切に機能することを確認しました。わあ!アプリが開きます。
しかし、Facebook または Quip から www.nachorater.com へのリンクをクリックしようとすると、どちらのアプリも、サイトにこれらのアプリ リンクが設定されていることに自動的には気づかず、アプリを開こうとせず、ブラウザーに Web サイトを読み込むだけです。
誰かこれを動作させた人はいますか?
アップデート:
いくつかのメタタグがテンプレートの < head > 部分に存在しないという問題があったので、修正しました。
リンクはこちら:http://www.nachorater.comiOS Facebook アプリからは、次のように iNacho アプリで URL を開くことができる素敵な小さなポップアップが追加されます。
しかし、動的レビューへのリンクは機能していないようですが、Ming が指摘したデバッグ アプリでは、メタ タグが正しく表示されていることが示されています。
例えば、http://www.nachorater.com/getReview?reviewID=6396169718595584
アップデート#2:
iNacho の Facebook タイムラインに新しいナチョのレビュー リンクを投稿し、Facebook モバイル アプリからそれをクリックしようとしました。
ページの読み込みが開始され、iNacho でアプリを開くことができる便利なインジケーターがポップアップ表示されましたが、ページが読み込まれると、インジケーターは消えてしまいました (クリックする前に)。
アップデート#3:
Facebook アプリから、レビュー用の iNacho URL をトリガーできるようになりました。ただし、小さなポップアップが消える前に iNacho で開くようにクリックした場合のみです。Facebook の組み込み Web ビューでページを完全に読み込んだ場合、小さなポップアップは消えます。
これは Applinks の問題ですか? それとも Facebook アプリの問題ですか? それとも仕様上の問題ですか? またその理由は何ですか?
アップデート#4:
何が問題なのかはわかっているかもしれません。レビュー ページは、ナチョのレビューの動的画像をロードします。そのため、ページをロードすると、画像をロードする動的 URL を指す img src タグが設定されます。これは、何らかの「リダイレクト」アクションと誤解されているのでしょうか?
img タグの例 (レンダリング):<img width="300" src="/getReviewImage?imageID=6125868501958656"></img>
注: ただし、動的に読み込まれる他のスクリプト/Ajax も多数あります (Facebook や Twitter ウィジェットなど)。
これは AppLinks または Facebook モバイル アプリのバグでしょうか? Ajax や動的画像などのオブジェクトのバックグラウンド読み込みは気にする必要はないのでしょうか?
アップデート#5
2014 年 7 月 15 日 - 最新の Facebook アプリでもこの問題が引き続き発生します。iNacho Facebook ページから iNacho Web サイトへのリンクをクリックすると、ページの読み込みが完了する前に、アプリで開くオプションが一瞬ポップアップ表示されます。その後、オプションは非表示になります。
Twitter アプリに関しては、一瞬もポップアップが表示されません。リンクがアプリリンク対応であることをまったく認識していないようです。
一方、Quip では、ナチョスのリンクを貼り付け、最初にクリックしたときには、アプリで開くオプションがなく、組み込みの Safari に移動しました。しかし、2 回目にクリックしたときには、代わりにアプリが直接開きました。
要約: これまでのところ、一部のアプリは AppLinks ナビゲーション部分を誤って実装しているようです。Quip は動作しているようですが、Facebook 独自のアプリでさえ動作していないようです。
ベストアンサー1
私は AppLinks でも同じ問題を抱えていたので、AppLinks を完全に放棄して、Facebook のアプリ リンク ホストを使用することにしました。https://developers.facebook.com/docs/applinks/hosting-api
私のアプリは実際にはモバイル専用で、最初は AppLinks の仕組みを誤解していました。al_ios_*
メタ タグを単一のユニバーサル Web ページに配置できると思っていましたが、これは間違いでした。サイト上のコンテンツごとに個別のページが必要になり、各ページに独自の AppLinks メタ タグを設定して、その特定のコンテンツの URL をアプリに返す必要があります。
間違ったやり方をしていたときは、Facebook で OpenGraph ストーリーをタップすると、Web ブラウザーで自分のサイトが開き、下部のツールバーにアクション アイコンがあり、それをタップしてアプリを開くオプションが表示されました。または、OpenGraph ストーリーでアプリの名前を正確にタップする必要がありました。どちらもアプリにすばやく切り替えられますが、URL はアプリで移動したいコンテンツに固有のものではありません。また、これらのオプションはどちらも役に立ちません。ストーリーの任意の場所をタップしてアプリに直接移動したいだけなので、私たち全員がここにいるのはそのためです。
ソリューション
例として、共有ダイアログを含む OpenGraph ストーリーを使用します。
まず、ホストされたアプリリンクを作成する必要がありますアプリ内ではなく、サーバー上で行われます。OpenGraph ストーリーや共有するものを作成する前に、サーバーを呼び出して次の 2 つのことを行います。
1.) API呼び出しを行って新しいFacebookアプリリンクを作成し、IDを返します。
2.) そのIDを使用して2回目の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 アプリでストーリーをクリックすると、アプリに直接移動します。Web の煩わしさはありません。
// 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...