Depuis iOS 9, les applications tierces ne sont plus en mesure d'interroger des modèles d'URL arbitraires. Plusieurs applications tierces, notamment Twitter, ont mal utilisé le logiciel canOpenURL (_ :)
méthode du UIApplication
classe pour savoir quelles applications sont installées sur un périphérique particulier.
Apple a mis en place un certain nombre de restrictions pour protéger la vie privée de ses clients. Dans cette astuce, je vous explique ce que vous devez savoir sur ces modifications et je vous explique comment mettre à jour vos applications..
Je suppose que vous savez déjà qu'une application iOS peut demander au système d'exploitation de lancer une autre application à l'aide d'un schéma d'URL. Dans sa forme la plus simple, cela fonctionne à peu près comme ceci.
let URLAsString = "tweetbot: // _ bartjacobs / timeline" si let URL = NSURL.init (string: URLAsString) UIApplication.sharedApplication (). openURL (URL)
Parfois, il est utile de demander au système d’exploitation si une URL peut être ouverte avant de l’ouvrir. Ceci est particulièrement utile si vous souhaitez mettre à jour l'interface utilisateur en fonction des applications installées par l'utilisateur et avec lesquelles votre application peut interagir. Dans l'exemple ci-dessus, ouvrir le lien(_:)
ne réussira pas si Tweetbot n'est pas installé sur le périphérique de l'utilisateur. Pour demander au système d’exploitation si une URL peut être ouverte, vous pouvez utiliser le canOpenURL (_ :)
méthode du UIApplication
classe.
let URLAsString = "tweetbot: // _ bartjacobs / timeline" si let URL = NSURL.init (string: URLAsString) if UIApplication.sharedApplication (). canOpenURL (URL) UIApplication.sharedApplication (). openURL (URL) else print ("Impossible d'ouvrir l'URL")
Malheureusement, certaines applications, notamment Twitter, ont mal utilisé canOpenURL (_ :)
pour détecter les applications installées sur le périphérique de l'utilisateur. Selon Apple, cela porte atteinte à la vie privée de l'utilisateur. En conséquence, Apple ne tolère plus ce type d'utilisation abusive dans iOS 9 en imposant deux restrictions.
canOpenURL (_ :)
échoue si l'URL n'est pas ajoutée à une liste blanche dans l'application Info.plist.faux
et jette une erreur. La documentation souligne que cette limitation est réinitialisée lorsque l'utilisateur réinstalle ou met à niveau l'application..Laissez-moi vous montrer ce que cela signifie concrètement en créant une application simple qui ouvre Tweetbot, mon client Twitter préféré. Créez un nouveau projet dans Xcode 7 et choisissez le Application à vue unique modèle. Nommez le projet Schémas Et mettre La langue à Rapide.
Avant de jeter un regard sur les schémas d'URL, je souhaite configurer l'interface utilisateur. Ouvrir ViewController.swift et ajouter une action, openTweetbot (_ :)
, au ViewController
classe. Vous pouvez laisser son implémentation vide pour l'instant.
// MARK: - Actions @IBAction func openTweetbot (expéditeur: AnyObject)
Ouvrir Tableau principal et ajouter un bouton au Voir la scène du contrôleur. Définissez le titre du bouton sur Ouvrir Tweetbot et connectez le bouton avec le contrôleur de vue openTweetbot (_ :)
action que nous avons créée plus tôt.
Nous ne ferons rien de trop compliqué. Quand je tape le Ouvrir Tweetbot bouton, le système d'exploitation ouvre Tweetbot, me montrant mon calendrier. Vous pouvez en savoir plus sur les schémas d'URL pour Tweetbot sur le site Web Tapbots.
Avant qu'Apple n'impose les restrictions susmentionnées à l'interrogation de modèles d'URL, vous pouvez effectuer les opérations suivantes:
@IBAction func openTweetbot (expéditeur: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard garde URL = NSURL.init (string: URLAsString) else retour garde application.canOpenUR (URL) else return // Ouvrir l'URL application.openURL (URL)
Nous demandons au système d'exploitation s'il peut ouvrir l'URL à laquelle nous passons. canOpenURL (_ :)
. Si cette méthode retourne faux
sur iOS 8 et inférieur, nous savons que l'application qui nous intéresse n'est pas installée sur le périphérique de l'utilisateur, en supposant que le schéma d'URL se rapporte à une autre application. Cela peut être très utile, mais Apple veut imposer des restrictions à l'API pour éviter les abus.
Si vous construisez l'application dans Xcode 7 et appuyez sur le bouton Ouvrir Tweetbot bouton, canOpenURL (_ :)
résultats faux
et le système d'exploitation renvoie une erreur qui ressemble à ceci:
Schemes [9227: 3539016] -canOpenURL: échec de l'URL: "tweetbot: // _ bartjacobs / timeline" - erreur: "Cette application n'est pas autorisée à interroger le schéma tweetbot"
Le système d'exploitation nous informe explicitement que l'application n'est pas autorisée à savoir s'il peut ouvrir l'URL que nous passons à canOpenURL (_ :)
. Cela ne signifie pas que l'application n'est pas autorisée à ouvrir l'URL que nous avons transmise ouvrir le lien(_:)
, bien que.
Si vous mettez à jour l'implémentation de openTweetbot (_ :)
Comme indiqué ci-dessous et que vous avez installé Tweetbot, l'application peut ouvrir Tweetbot lorsque vous appuyez sur le bouton. Cela souligne que Apple veut limiter la (mauvaise) utilisation de canOpenURL (_ :)
, ne pas ouvrir le lien(_:)
.
@IBAction func openTweetbot (expéditeur: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard let URL = NSURL.init (string: URLAsString) else return // Open URL application.openURL (URL)
Heureusement, il existe une solution facile à ce problème. À partir d'iOS 9, Apple demande aux développeurs de liste blanche les schémas d'URL qu'une application souhaite interroger. C’est aussi simple que d’ajouter une entrée à l’application Info.plist.
Ouvrir Info.plist, ajouter une clé nommée LSApplicationQueriesSchemes, et définir le type de la valeur à Tableau. Ajouter un article de type Chaîne au tableau et définissez sa valeur sur tweetbot.
Si nous revenons openTweetbot (_ :)
à sa mise en œuvre d'origine, nous sommes en mesure d'invoquer canOpenURL (_ :)
sans que le système d'exploitation nous jette des erreurs. Vous pouvez ajouter autant de modèles d'URL à votre application. Info.plist.
@IBAction func openTweetbot (expéditeur: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard garde URL = NSURL.init (string: URLAsString) else retour garde application.canOpenUR (URL) else return // Ouvrir l'URL application.openURL (URL)
La plupart des applications n'auront pas de problème avec la nouvelle politique d'Apple. Il est clair qu'Apple vise à protéger la vie privée de ses clients en limitant les informations que les applications peuvent extraire du système d'exploitation. Les applications sont mises en sandbox sur iOS et Apple veut contrôler la quantité d'informations qu'une application peut extraire de l'environnement dans lequel se trouve le sandbox..
La liste blanche des schémas d'URL n'est pas très pénible pour la plupart des applications, mais cela peut devenir fastidieux si vous envisagez de créer un programme de lancement d'applicatifs, tel que Launch Center Pro. Il est toujours possible de créer un programme de lancement tant que vous ajoutez à la liste blanche tous les schémas d'URL que l'application souhaite interroger. Cela peut être assez fastidieux, bien que.