IOS 9 safari iframe src с настраиваемой схемой URL не работает

Я использую это решение https://gist.github.com/davidwkeith/2662899 для перенаправления с веб-страницы в мое приложение, если оно установлено. Но он не работает на iOS 9. Он все еще работает в Google-Chrome. Но iframe с пользовательской схемой URL не может запустить приложение из Safari.

Если я заменю

document.getElementById('loader').src = 'custom-protocol://my-app'

(где загрузчик - это iframe) с помощью

window.location = 'custom-protocol://my-app'

это будет работать.

ОС: iOS 9 beta4 и beta5

Кто-нибудь знает эту проблему? Это бета-версия iOS 9? Или это не будет исправлено?

Ответ 1

Предыдущий ответ - это частичная реализация Universal Links, в которой отсутствуют важные детали и нет запасного варианта в App Store.

Во-первых, вы больше не можете устанавливать iframe src для запуска схемы URI. Вы правильно определили эту проблему. Как вы заметили, вы все же можете установить window.location = 'custom-protocol://my-app';. Поэтому, если вы знаете, что у пользователя есть ваше приложение, потому что вы ранее открыли его приложение из браузера и сохранили файл cookie, который можно найти на вашем бэкэнде, вы все равно можете безопасно запустить custom-protocol://.

Во-вторых, вы можете обнаружить строку агента пользователя, используя navigator.userAgent. До iOS 9 вы все еще можете использовать iframe для запуска схемы URI, а затем использовать запасной после истечения времени ожидания. В iOS 9 вы можете выбрать, использовать ли схему URI или нет на основе файлов cookie, а затем отправить пользователя в App Store. Я работаю над этим в Branch и использую куки, чтобы вспомнить, есть ли у пользователя приложение, которое мы реализовали. Не стесняйтесь обращаться, если у вас есть дополнительные вопросы об этом, или напрямую использовать наше решение.


Реализация универсальных ссылок не так проста, как описывает другой ответ. На самом деле сложностей гораздо больше. Вот полный список шагов (я помогал нескольким приложениям интегрироваться в последние недели, используя эти шаги):

1. Настройте свое приложение для регистрации утвержденных доменов

я. Зарегистрируйте свое приложение на developer.apple.com, если у вас нет

II. Включите ‘Связанные домены в идентификаторе вашего приложения на developer.apple.com

III. Включить ‘Связанный домен в вашем проекте XCode

entitlements

внутривенно Добавьте правильное право домена applinks:yourdomain.com в свое приложение

applinks

2. Настройте свой веб-сайт для размещения файла ‘apple-app-site-association

я. Купите доменное имя или выберите из существующего

II. Получить SSL-сертификат для доменного имени (для этого вы можете использовать CloudFlare!)

III. Создать структурированный файл JSON SON apple-app-site-Ассоциации

{
   "applinks": {
       "apps": [ ],
       "details": {
           "TEAM-IDENTIFIER.YOUR.BUNDLE.IDENTIFIER": {
               "paths": [
                   "*"
               ]
           }
       }
   }
}

IV. Подпишите файл JSON с сертификатом SSL


v. Настройте файловый сервер

Файл apple-app-site-association: - должен быть отправлен с заголовком ‘application/pkcs7-mime - должен быть отправлен с конечной точки youdomain.com/apple-app-site-association - должен вернуть код http 200.

Пример Express + Node:

var aasa = fs.readFileSync(__dirname + '/static/apple-app-site-association');
app.get('/apple-app-site-association', function(req, res, next) {
     res.set('Content-Type', 'application/pkcs7-mime');
     res.status(200).send(aasa);
});

кредит: заимствовано из этого сообщения в блоге

Ответ 2

Да, с iOS9 теперь вы можете глубоко связать. Проверьте ссылку для подробного объяснения, но я изложил основы.

http://blog.hokolinks.com/how-to-implement-apple-universal-links-on-ios-9/

сначала вы должны перейти к своим целевым и щелчкам. Добавьте связанный домен.

Затем вы должны загрузить файл ассоциации apple-app-site-association.

В основном открыть редактор JSON и построить что-то вроде этого

{
  "applinks": {
"apps": [],
"details": {
  "TBEJCS6FFP.com.domain.App": {
    "paths":[ "*" ]
  }
}
  }
}

Затем вы должны поддерживать Univeral-ссылки в своем приложении. Вам необходимо реализовать

extension AppDelegate {
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        let webpageURL = userActivity.webpageURL! // Always exists
        if !handleUniversalLink(URL: webpageURL) {
            UIApplication.sharedApplication().openURL(webpageURL)
        }
    }
    return true
}

private func handleUniversalLink(URL url: NSURL) -> Bool {
    if let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: true), let host = components.host, let pathComponents = components.path?.pathComponents {
        switch host {
        case "domain.com":
            if pathComponents.count >= 4 {
                switch (pathComponents[0], pathComponents[1], pathComponents[2], pathComponents[3]) {
                case ("/", "path", "to", let something):
                    if validateSomething(something) {
                        presentSomethingViewController(something)
                        return true
                    }
                default:
                    return false
                }