Как поддержать Universal Links в iOS App и настроить сервер для него?

Как я могу поддержать Universal Links в моем iOS приложение и настройка моего сервера для поддержки Universal Links?

3 ответа

Решение

Поддержка универсальных ссылок

Когда вы поддерживаете универсальные ссылки, пользователи iOS 9 могут нажать на ссылку на ваш веб-сайт и без проблем перейти в установленное приложение, не заходя в Safari. Если ваше приложение не установлено, при нажатии ссылки на ваш веб-сайт откроется веб-сайт в Safari.

Здесь, как настроить свой собственный сервер и обрабатывать соответствующие ссылки в вашем приложении.


Настройка сервера

Вам нужно, чтобы сервер работал в сети. Чтобы надежно связать ваше приложение iOS с сервером, Apple требует, чтобы вы предоставили доступ к файлу конфигурации, который называется apple-app-site-association, Это JSON файл, который описывает домен и поддерживаемые маршруты.

apple-app-site-association файл должен быть доступен через HTTPS без каких-либо перенаправлений по адресу https: // {domain} / apple-app-site-association.

Файл выглядит так:

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}

ПРИМЕЧАНИЕ. - Не добавлять .json к apple-app-site-association имя файла.

Ключи следующие:
apps: Должен иметь пустой массив в качестве значения, и он должен присутствовать. Вот как Apple хочет этого.
details: Представляет собой массив словарей, по одному для каждого приложения iOS, поддерживаемого веб-сайтом. Каждый словарь содержит информацию о приложении, команде и идентификаторах пакетов.

Есть 3 способа определения путей:
Static: Весь поддерживаемый путь жестко задан для идентификации конкретной ссылки, например, /static/term
Wildcards: A * может использоваться для сопоставления с динамическими путями, например, /books/* может соответствовать пути к любой странице автора.? внутри конкретных компонентов пути, например, книги /1? можно использовать для сопоставления с любыми книгами, чей идентификатор начинается с 1.
Exclusions: Добавление пути к NOT исключает совпадение этого пути.

Порядок, в котором пути упоминаются в массиве, важен. Более ранние индексы имеют более высокий приоритет. Как только путь совпадает, оценка останавливается, а другие пути игнорируются. Каждый путь чувствителен к регистру.

Поддержка нескольких доменов

Каждый домен, поддерживаемый в приложении, должен сделать доступным свой собственный файл apple-app-site-association. Если содержимое, обслуживаемое каждым доменом, отличается, то содержимое файла также изменится для поддержки соответствующих путей. В противном случае можно использовать один и тот же файл, но он должен быть доступен в каждом поддерживаемом домене.

Подписание файла приложения-сайта-ассоциации

Примечание: вы можете пропустить эту часть, если ваш сервер использует HTTPS чтобы обслуживать контент и перейти к руководству по установке приложения.

Если ваше приложение предназначено для iOS 9, а ваш сервер использует HTTPS чтобы обслуживать контент, вам не нужно подписывать файл. Если нет (например, при поддержке Handoff в iOS 8), его необходимо подписать, используя SSL сертификат от признанного центра сертификации.

Примечание. Это не сертификат, предоставленный Apple для отправки вашего приложения в App Store. Он должен быть предоставлен третьей стороной, и рекомендуется использовать тот же сертификат, который вы используете для вашего HTTPS сервер (хотя это и не обязательно).

Чтобы подписать файл, сначала создайте и сохраните его простую.txt версию. Далее в терминале выполните следующую команду:

cat <unsigned_file>.txt | openssl smime -sign -inkey example.com.key -signer example.com.pem -certfile intermediate.pem -noattr -nodetach -outform DER > apple-app-site-association

Это выведет подписанный файл в текущий каталог. example.com.key, example.com.pem, а также intermediate.pem являются файлами, которые были бы доступны для вас вашим сертифицирующим органом.

Примечание. Если файл не подписан, он должен иметь Content-Type из application/json, В противном случае это должно быть application/pkcs7-mime,

Подтвердите свой сервер с помощью инструмента проверки поиска Apple App
Проверьте свою веб-страницу для iOS 9 API поиска. Введите URL, и Applebot будет сканировать вашу веб-страницу и покажет, как вы можете оптимизировать ее для достижения наилучших результатов https://search.developer.apple.com/appsearch-validation-tool/

Код сайта

Код сайта можно найти на странице gh-pages по https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages


Настройка приложения iOS

Приложение будет ориентировано на iOS 9 и будет использовать Xcode 7.2 с Objective-C,

Включение универсальных ссылок

Настройка на стороне приложения требует двух вещей:
1. Настройка права приложения и включение универсальных ссылок.
2. Обработка входящих ссылок в вашем AppDelegate,

1. Настройка права приложения и включение универсальных ссылок.
Первым шагом в настройке прав вашего приложения является включение его для вашего идентификатора приложения. Сделайте это в Центре разработчиков Apple. Нажмите на Сертификаты, Идентификаторы и Профили, а затем Идентификаторы. Выберите идентификатор приложения (сначала создайте его, если необходимо), нажмите "Изменить" и включите право "Связанные домены".

Затем получите префикс и суффикс идентификатора приложения, щелкнув соответствующий идентификатор приложения.

Префикс и суффикс идентификатора приложения должны совпадать с теми, которые указаны в файле apple-app-site-association.

Далее в Xcodeвыберите цель вашего приложения, нажмите "Возможности" и переключите связанные домены на "Вкл". Добавьте запись для каждого домена, который поддерживает ваше приложение, с префиксом applink:.

Например: applinks: vineetchoudhary.github.io

Что выглядит следующим образом для примера приложения:

Примечание. Убедитесь, что вы выбрали ту же группу и ввели тот же идентификатор пакета, что и зарегистрированный идентификатор приложения в Центре участников. Также гарантируйте, что файл разрешений включен XCode, выбирая файл и в Инспекторе Файлов, гарантируйте, что ваша цель проверена.

Обработка входящих ссылок в вашем AppDelegate

[UIApplicationDelegate application: continueUserActivity: restorationHandler:] метод в AppDelegate.m обрабатывает входящие ссылки. Вы анализируете этот URL, чтобы определить правильное действие в приложении.

Например, в примере приложения:

Objective-C

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
        NSURL *url = userActivity.webpageURL;
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UINavigationController *navigationController = (UINavigationController *)_window.rootViewController;
        if ([url.pathComponents containsObject:@"home"]) {
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"HomeScreenId"] animated:YES];
        }else if ([url.pathComponents containsObject:@"about"]){
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"AboutScreenId"] animated:YES];
        }
    }
    return YES;
}  

Свифт:

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          let url = userActivity.webpageURL!
          //handle url
      }
      return true
  }

Код приложения iOS

Код приложения можно найти в главной ветке на https://github.com/vineetchoudhary/iOS-Universal-Links/

Замечания:

  1. Как правило, любая поддерживаемая ссылка, нажимаемая в Safari или в случаях UIWebView/WKWebView, должна открывать приложение.
  2. Для iOS 9.2 и менее, это будет работать только на устройстве. iOS 9.3 (еще на момент написания бета-версии) также поддерживает симулятор.
  3. iOS запоминает выбор пользователя при открытии Universal Links. Если они нажмут верхнюю правую крошку, чтобы открыть ссылку в Safari, все дальнейшие щелчки перенесут их в Safari, а не в приложение. Они могут вернуться к открытию приложения по умолчанию, выбрав "Открыть" в баннере приложения на веб-сайте.

Готово. Это все о Universal Links.


Рекомендации

  1. Поддержка универсальных ссылок в вашем приложении для iOS

Вот код для обработки универсальных ссылок в Swift 3+, основанный на ответе Vineet Choudhary:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL {
        //handle URL
    }

    return true
}

Если вы заполнили весь пост Vineet, но он все еще не работает, попробуйте использовать профиль обеспечения распространения. Я сделал все из поста выше, но должен был выпустить профиль распространения, чтобы заставить его работать.

Благодаря профилю разработки приложение успешно загрузило файл AASA, но оно никогда не открывало мое приложение, когда я нажимал на ссылки.

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

Другие вопросы по тегам