web-dev-qa-db-fra.com

iOS 9 Safari iframe src avec un schéma d'URL personnalisé ne fonctionne pas

J'utilise cette solution https://Gist.github.com/davidwkeith/2662899 pour rediriger vers mon application à partir du Web si l'application est installée. Mais il a été cassé dans iOS 9. Il fonctionne toujours dans Google Chrome, mais iframe avec un schéma d'URL personnalisé ne lance pas l'application en safari.

Si je remplace

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

(où le chargeur est iframe) avec

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

ce sera du travail.

os: iOS 9 beta4 et beta5

Quelqu'un connaît ce problème? Est-ce un bug bêta d'ios 9? Ou ce ne sera pas réparé?

32
Kirill

La réponse précédente est une implémentation partielle de Universal Links à laquelle il manque des détails critiques et qui n'inclut pas de repli sur l'App Store.

Tout d'abord, vous ne pouvez plus définir iframe src afin de déclencher un schéma d'URI. Vous avez correctement identifié ce problème. Comme vous l'avez noté, vous pouvez toutefois définir window.location = 'custom-protocol://my-app';. Donc, si vous savez qu'un utilisateur possède votre application parce que vous avez déjà ouvert son application depuis le navigateur et que vous avez enregistré un cookie qui peut être recherché sur votre backend, vous pouvez toujours lancer en toute sécurité custom-protocol://.

Deuxièmement, vous pouvez détecter la chaîne d'agent utilisateur à l'aide de navigator.userAgent. Avant iOS 9, vous pouvez toujours utiliser l'iframe pour déclencher un schéma d'URI, puis revenir en arrière après un délai d'expiration. Sur iOS 9, vous pouvez choisir de déclencher le schéma d'URI ou non en fonction des cookies, puis de diriger l'utilisateur vers l'App Store. J'y travaille sur Branch et j'utilise des cookies pour me rappeler si un utilisateur a probablement l'application est quelque chose que nous avons implémenté. N'hésitez pas à nous contacter si vous avez d'autres questions à ce sujet ou utilisez directement notre solution.


L'implémentation de liens universels n'est pas aussi simple que l'autre réponse le décrit. En réalité, il y a beaucoup plus de complexité. Voici une liste complète des étapes (j'ai aidé plusieurs applications à s'intégrer ces dernières semaines en utilisant ces étapes):

1. Configurez votre application pour enregistrer des domaines approuvés

je. Enregistrez votre application sur developer.Apple.com si vous ne l'avez pas encore fait

ii. Activez "Domaines associés" sur l'identifiant de votre application sur developer.Apple.com

iii. Activez ‘Associated Domain’ dans votre projet Xcode

entitlements

iv. Ajoutez le droit de domaine approprié, applinks:yourdomain.com, dans votre application

applinks

2. Configurez votre site Web pour héberger le fichier "Apple-app-site-association"

je. Achetez un nom de domaine ou choisissez parmi votre existant

ii. Acquérir la certification SSL pour le nom de domaine (vous pouvez utiliser CloudFlare pour cela!)

iii. Créer un fichier JSON structuré "Apple-app-site-association"

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

iv. Signez le fichier JSON avec la certification SSL

cat Apple-app-site-association-unsigned | openssl smime -sign -inkey yourdomain.com.key -signer yourdomain.com.cert -certfile digicertintermediate.cert -noattr -nodetach -outform DER > Apple-app-site-association

v. Configurer le serveur de fichiers

Le fichier Apple-app-site-association: - doit être envoyé avec l'en-tête "application/pkcs7-mime" - doit être envoyé à partir du noeud final youdomain.com/Apple-app-site-association - doit renvoyer un code http 200.

Exemple 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);
});

crédit: emprunté généreusement à cet article de blog

17
st.derrick

Oui, avec iOS9, vous pouvez désormais créer un lien profond. Vérifiez le lien pour une explication détaillée, mais j'ai exposé les bases.

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

vous devez d'abord aller à votre cible et cliquer sur les capacités. Ajoutez le domaine associé.

Ensuite, vous devez télécharger le fichier d'association Apple-app-site-association.

Fondamentalement, ouvrez un éditeur JSON et construisez quelque chose comme ça

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

Ensuite, vous devez prendre en charge les liens Univeral dans votre application. Vous devez implémenter

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
                }
1
mKane