Невозможно заставить новые AppLinks работать на iOS или Android
Последнее обновление ниже при обновлении # 5
Я пытаюсь внедрить AppLinks для ОБОИХ приложений iOS и Android: 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" />
Я проверил, что схема URL отлично работает, введя ссылку, например inacho://default, в Notes и нажав на ссылку, которую она создает. Wa-ла! Он открывает мое приложение.
Но когда я пытаюсь щелкнуть ссылку на www.nachorater.com из Facebook или Quip, ни одно приложение автоматически не обращает внимания на то, что сайт установил эти ссылки на приложения, и он просто загружает веб-сайт в свой браузер вместо того, чтобы пытаться открыть мое приложение.
Кто-нибудь получил эту работу?
Update:
У меня была проблема с некоторыми метатегами, которые не были в <head> часть моих шаблонов, и я исправил ее.
Теперь ссылка: http://www.nachorater.com из приложения iOS Facebook добавляет приятное небольшое всплывающее окно, которое позволяет вам открыть URL-адрес в приложении iNacho, например так:
![screenshot]()
Но мои ссылки на мои динамические обзоры, похоже, не работают, но приложение Debug, которое указывал Минг, показывает, что метатеги выглядят правильно для них.
Например, http://www.nachorater.com/getReview?reviewID=6396169718595584
метатеги при отладке https://developers.facebook.com/tools/debug/og/object?q=http%3A%2F%2Fwww.nachorater.com%2FgetReview%3FreviewID%3D6396169718595584:
![meta tags]()
Обновление # 2:
Я разместил новую ссылку для просмотра nacho на моей временной шкале iNacho Facebook, а затем попытался щелкнуть ее в приложении Facebook Mobile.
Он начал загружать страницу и вытащил удобный индикатор, который позволяет вам открыть приложение в iNacho, но после загрузки страницы индикатор погас (до того, как я его кликнул).
Обновление # 3:
Из приложения Facebook я могу теперь запустить URL-адрес inacho для своих обзоров, но он ТОЛЬКО, если я нажму маленькое всплывающее окно, чтобы открыть его в iNacho, прежде чем оно исчезнет. Если я позволяю странице полностью загружать встроенный веб-просмотр Facebook, небольшое всплывающее окно все еще исчезает.
Это проблема с Applinks? Или проблема с приложением Facebook? Или по дизайну и почему?
Обновление # 4:
Я знаю, в чем проблема. Страница обзора, в свою очередь, загружает динамическое изображение для обзора nacho. Таким образом, загружая страницу, у нее есть тег img src, который указывает на динамический url, который загружает изображение. Это ошибочно принимается за какое-то действие "перенаправления"?
Пример тега img (rendered): <img width="300" src="/getReviewImage?imageID=6125868501958656"></img>
Примечание. Существует множество других скриптов /ajax, которые загружаются динамически, хотя (видят Facebook и твиттер и т.д.).
Является ли это ошибкой в AppLinks или приложении Facebook для мобильных устройств? Разве это не должно волноваться о загрузке объектов фона, таких как ajax и динамические изображения?
Обновление # 5
7/15/14 - Это все еще происходит с последним приложением Facebook. Когда я нажимаю ссылку с моей страницы iNacho Facebook на мой сайт iNacho, появляется всплывающее окно, чтобы открыть его в приложении за долю секунды до того, как страница закончит загрузку. Затем он скрывает его.
Что касается приложения twitter, оно даже не дает мне всплывающее окно в течение секунды. Похоже, что он не распознает, что ссылка включена в приложении.
С другой стороны, Quip, я вставил ссылку nacho, и в первый раз, когда я нажал на нее, она перешла на встроенное сафари без возможности открытия в моем приложении. НО во второй раз, когда я щелкнул по нему, он открыл приложение прямо.
Резюме. До сих пор кажется, что, возможно, некоторые приложения неправильно используют часть навигации AppLinks или что-то в этом роде. Кажется, что Quip работает, но даже собственное приложение Facebook похоже, что оно не работает.
Ответы
Ответ 1
У меня была такая же проблема с AppLinks и я решил просто отказаться от них вообще и просто использовать хост ссылки на facebook: https://developers.facebook.com/docs/applinks/hosting-api p >
Мое приложение действительно мобильное, и я неправильно понял, как работает AppLinks. Я думал, что могу просто разместить метатеги al_ios_*
на единой универсальной веб-странице, но это неправильно. Для каждого фрагмента контента на моем сайте должна быть отдельная страница, и каждый из этих страниц должен иметь свои собственные метатеги AppLinks, чтобы отправить URL-адрес для этого конкретного контента обратно в мое приложение.
Когда я делал это неправильно, когда я постучал по моей истории OpenGraph в facebook, он открыл мой сайт в веб-браузере, и на нижней панели инструментов появился значок действия, который я мог бы использовать, и у меня есть возможность открыть мой приложение. Или мне нужно было бы точно указать имя моего приложения в истории OpenGraph. Любой из тех, кто быстро переключится на мое приложение, но URL-адрес не будет определен для контента, к которому я хочу, чтобы мое приложение перемещалось. Кроме того, оба этих варианта сосать - я просто хочу использовать любую информацию в истории и перейти прямо к моему приложению, поэтому мы все здесь.
Решение
В качестве примера я расскажу об истории OpenGraph с диалоговым окном share.
Во-первых, вам нужно создать ссылку на хостинг-приложение на вашем сервере, а не в приложении.. Прежде чем создавать свою историю OpenGraph или что-то еще, позвоните на ваш сервер, чтобы выполнить 2 вещи
1.) Сделайте вызов API для создания новой ссылки приложения facebook, которая вернет вам идентификатор
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, она переходит прямо в ваше приложение. Нет веб-бессмыслицы.
// 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...
Ответ 2
Когда я работал над своим приложением, Sweep, я положил плату за оплату/долю после определенного количества времени, проведенного в приложении. Я столкнулся с той же проблемой, когда AppLinks действительно засасывал на самом деле связь Facebook, несмотря на обещание. Исходя из этой проблемы, я построил службу под названием branch.io, на которой размещены ссылки для меня, плюс автоматически вставляет правильные метатеги AppLinks для Android/iOS, Ссылки действительно работают так, как ожидалось, такие же сумасшедшие, как это. Он использует комбинацию JS на стороне клиента с AppLinks, чтобы сделать их должным образом перенаправленными в каждом веб-браузере и в собственном браузере.
Здесь вы найдете руководство высокого уровня по созданию ссылок на iOS:
-
Чтобы начать работу, вам просто нужно настроить расположение своего приложения в любом хранилище на панели управления на странице dashboard.branch.io. Как только все будет установлено, вы получите ключ приложения ветки.
-
pod "Branch" или вы можете клонировать репозиторий с открытым исходным кодом здесь:
https://github.com/BranchMetrics/Branch-iOS-SDK
-
Добавьте ключ Branch в свой файл plist как строку с ключом "branch_key"
-
Добавьте следующий код в AppDelegate в соответствующие методы
В файле doneFinishLaunchingWithOptions:
- (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 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
}
}];
}
В openUrl для обработки вызовов URI:
- (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;
}
- Наконец, для создания размещенных ссылок это очень просто. Вам просто нужно вызвать getShortUrl для динамического создания. Вы можете поместить как можно больше ключей и значений в ссылки (чтобы их получить в обратном вызове initSession)
Вы можете поместить этот фрагмент в любом месте, где хотите создать ссылку:
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 MyApp Referral" forKey:@"$og_title"];
[params setObject:@"url.to.picture/mypic.png" forKey:@"$og_image_url"];
[params setObject:@"Join Joe in MyApp - it 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 очень похож на вызовы и функции метода и может быть найден на сайте.
Ответ 3
Извините, если мой ответ не совсем то, что вы ожидаете, а просто чтобы поделиться тем, что мы сделали на наших сайтах и приложениях.
Например, я знаю, что нам нужно было добавить больше тегов, чтобы они работали с картами 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=""
у нас также есть метафорическая метафора, определенная как fb: app_id. Я упоминаю об этом, потому что, когда вы получаете debplink в своем приложении, у вас также есть идентификатор приложения facebook в ссылке на приложения.
И из того, что мы тестировали:
-
facebook не открывает deeplink прямо на iOS, тогда как Android дает вам выбор приложения. Иногда появляется синее всплывающее окно в нижней части экрана, и иногда у вас есть ссылка, добавленная в листе действий, который вы используете, когда вы нажимаете кнопку совместного доступа в веб-просмотре facebook (сафари) (только при первой загрузке) → эта презентация ссылки зависит от того, как содержимое было передано на facebook.
-
twitter добавляет ссылку на приложение внутри карты на iOS.
Не знаю, что я могу добавить.
Надеюсь, что это поможет.