Не удается заставить новые AppLinks работать на iOS или Android

Последнее обновление под обновлением № 5

Я пытаюсь реализовать AppLinks для ОСОБЕННОСТИ моих приложений iOS и Android: http://applinks.org

Я сделал следующее:

  1. Настроить пользовательскую схему URL для моего приложения: inacho: //
  2. Установка в приложении App-приложения: - (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" /> 

Я проверил, что схема URL отлично работает, введя ссылку, например inacho: // default, в Notes и нажав на ссылку, которую она создает. Wa-ла! Это открывает мое приложение.

Но когда я пытаюсь щелкнуть ссылку на www.nachorater.com из Facebook или Quip, ни одно приложение автоматически не замечает, что сайт имеет эти ссылки для ссылок на приложения, и он просто загружает веб-сайт в своих браузерах, а не пытается Чтобы открыть мое приложение.

Кто-нибудь получил эту работу?

Обновить:

У меня была проблема с некоторыми мета-тегами, которые не были в разделе <head> моих шаблонов, и я исправил его.

Теперь ссылка: http://www.nachorater.com из приложения iOS Facebook добавляет приятное небольшое всплывающее окно, которое позволяет вам открыть URL-адрес в приложении iNacho, например:

Скриншот

Но мои ссылки на мои динамические обзоры, похоже, не работают, но приложение 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 :

Мета-теги

Обновление № 2:

Я опубликовал новую ссылку для просмотра nacho на мою временную шкалу iNacho Facebook, а затем попытался щелкнуть ее в приложении Facebook Mobile.

Он начал загружать страницу и вытащил удобный индикатор, который позволяет открыть приложение в iNacho, но после загрузки страницы индикатор погас (до того, как я щелкнул по нему).

Обновление № 3:

Из приложения Facebook я могу теперь запустить URL-адрес inacho для своих обзоров, но он ТОЛЬКО, если я нажму маленькое всплывающее окно, чтобы открыть его в iNacho, прежде чем оно исчезнет. Если я позволяю странице полностью загружать встроенный веб-просмотр Facebook, небольшое всплывающее окно все еще исчезает.

Это проблема с Applinks? Или проблема с приложением Facebook? Или по дизайну и почему?

Обновление № 4:

Я знаю, в чем проблема. Страница обзора, в свою очередь, загружает динамическое изображение для обзора nacho. Таким образом, загружая страницу, у нее есть тег img src, который указывает на динамический URL-адрес, который загружает изображение. Это ошибочно принимается за какое-то действие «перенаправления»?

Пример img tag (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 похоже, что оно не работает.

Solutions Collecting From Web of "Не удается заставить новые AppLinks работать на iOS или Android"

У меня была такая же проблема с AppLinks, и я решил просто отказаться от них вообще и просто использовать хостинг ссылок на facebook: https://developers.facebook.com/docs/applinks/hosting-api

Мое приложение действительно мобильное, и я неправильно понял, как работает AppLinks. Я думал, что могу просто поставить al_ios_* на единой универсальной веб-странице, но это неправильно. Для каждого фрагмента контента на моем сайте должна быть отдельная страница, и каждый из этих страниц должен иметь свои собственные метатеги AppLinks, чтобы отправить URL-адрес для этого конкретного контента обратно в мое приложение.

Когда я делал это неправильно, когда я постучал по моей истории OpenGraph в facebook, он открыл бы мой сайт в веб-браузере, и на нижней панели инструментов появился значок действия, который я мог бы использовать, и у меня есть возможность открыть мое приложение. Или мне нужно было бы точно указать имя моего приложения в истории OpenGraph. Любой из тех, кто быстро переключится на мое приложение, но URL-адрес не будет определен для содержимого, на которое я хочу, чтобы мое приложение перемещалось. Кроме того, оба этих варианта сосать – я просто хочу использовать любую информацию в истории и перейти прямо к моему приложению, поэтому мы все здесь.

Решение

В качестве примера я собираюсь использовать историю OpenGraph с диалоговым окном share.

Во-первых, вам нужно создать размещенную ссылку на вашем сервере, а не в приложении. Прежде чем создавать историю OpenGraph или что-то еще, позвоните на сервер, чтобы выполнить две вещи:

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-адрес, который вы [FBGraphObject openGraphObjectForPostWithType: в качестве параметра 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... 

Когда я работал над своим приложением, Sweep, я положил плату за оплату / долю после определенного количества времени, проведенного в приложении. Я столкнулся с той же проблемой, когда AppLinks действительно сосала на самом деле увязывание Facebook, несмотря на обещание. Исходя из этой проблемы, я построил службу под названием branch.io, в которой размещены ссылки для меня, а также автоматически вставляет правильные метатеги AppLinks для Android / iOS. Ссылки действительно работают так, как ожидалось, как сумасшедшие. Он использует комбинацию JS на стороне клиента с AppLinks, чтобы сделать их должным образом перенаправленными в каждом веб-браузере и в собственном браузере

Ниже приведено руководство по созданию ссылок на iOS:

  1. Чтобы начать работу, вам просто нужно настроить расположение своего приложения в любом хранилище на панели управления на dashboard.branch.io. Как только все будет установлено, вы получите ключ приложения филиала.

  2. Pod «Branch» или вы можете клонировать репозиторий с открытым исходным кодом здесь: https://github.com/BranchMetrics/Branch-iOS-SDK

  3. Добавьте ключ Branch в свой файл plist как строку с ключом «branch_key»,

  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 } }]; } 

В 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; } 
  1. Наконец, для создания размещенных ссылок это очень просто. Вам просто нужно вызвать 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'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 очень похож на вызовы и функциональные возможности метода и может быть найден на сайте.

Извините, если мой ответ не совсем то, что вы ожидаете, а просто чтобы поделиться тем, что мы сделали на наших сайтах и ​​приложениях.

Например, я знаю, что нам нужно добавить больше тегов, чтобы они работали с картами 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="" 

У нас также есть метафайла opengraph meta, например fb: app_id. Я упоминаю об этом, потому что, когда вы получаете debplink в своем приложении, у вас также есть идентификатор приложения facebook в ссылке на приложения.

И из того, что мы тестировали:

  • Facebook не открывает deeplink прямо на iOS, тогда как Android дает вам выбор приложения. Он иногда показывает синее всплывающее окно в нижней части экрана, и иногда у вас есть ссылка, добавленная в листе действий, который вы используете, когда вы нажимаете кнопку совместного доступа в веб-просмотре facebook (safari) (только при первой загрузке) -> эта презентация Ссылки зависит от того, как контент был распространен на facebook.

  • Twitter добавляет ссылку на приложение внутри карты на iOS.

Не знаю, что я могу добавить.

Надеюсь, это поможет.