Подтвердить что ты не робот

Невозможно заставить новые 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 похоже, что оно не работает.

4b9b3361

Ответ 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;
}
  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 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.

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

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