L'URL suivante s'ouvre sur iOS 8.3 et versions antérieures, mais cela ne fonctionne pas et iOS 9
let instagramURL = NSURL(string: "instagram://app")
Pourquoi l'URL ne s'ouvre-t-elle pas?
iOS 9 a légèrement modifié le traitement du schéma d'URL. Vous devez ajouter à la liste blanche les URL que votre application appellera à l'aide de la clé LSApplicationQueriesSchemes
dans votre Info.plist
.
S'il vous plaît voir le message ici: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
La conclusion principale est que:
Si vous appelez la méthode «canOpenURL» sur une URL qui ne figure pas dans votre liste blanche, la réponse sera «NON», même si une application installée a été enregistrée pour gérer ce schéma. Une entrée syslog «Cette application n'est pas autorisée à interroger le schéma xxx» apparaîtra.
Si vous appelez la méthode «openURL» sur une URL qui ne figure pas dans votre liste blanche, celle-ci échouera de manière silencieuse. Une entrée syslog «Cette application n'est pas autorisée à interroger le schéma xxx» apparaîtra.
L'auteur spécifie également qu'il s'agit d'un bogue avec le système d'exploitation et Apple corrigera ce problème dans une version ultérieure.
Comme indiqué ci-dessus, vous souhaitez ajouter une clé dans la liste d'informations, voici la liste de la plupart des réseaux sociaux.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fb</string>
<string>fbapi</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>fb-messenger-api</string>
<string>Twitter</string>
<string>viber</string>
<string>whatsapp</string>
<string>wechat</string>
<string>line</string>
<string>instagram</string>
<string>kakaotalk</string>
<string>mqq</string>
<string>vk</string>
<string>comgooglemaps</string>
<string>googlephotos</string>
<string>ha</string>
<string>yammer</string>
</array>
* Les 3 premiers matchs Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" est pour Snapchat
Il s'agit d'une nouvelle fonctionnalité de sécurité pour iOS 9. Regardez WWDC 2015 Session 703 pour plus d'informations.
Toute application créée avec le SDK 9 doit fournir une entrée LSApplicationQueriesSchemes
dans son fichier plist, indiquant les modèles qu'elle tente d'interroger.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
En supposant que deux applications TestA et TestB. TestB veut demander si TestA est installé. "TestA" définit le schéma d'URL suivant dans son fichier info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
La deuxième application "TestB" essaie de savoir si "TestA" est installé en appelant:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Mais cela renverra normalement NON dans iOS9 car "TestA" doit être ajouté à l'entrée LSApplicationQueriesSchemes dans le fichier info.plist de TestB. Ceci est fait en ajoutant le code suivant au fichier info.plist de TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Une implémentation fonctionnelle peut être trouvée ici: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
De la session 703 WWDC 2015:
Vous pouvez continuer à utiliser des modèles d'URL lorsque vous créez votre application pour iOS 9 et vous voulez appeler des schémas d'URL, vous devez maintenant les déclarer dans vos applications Info.plist. Il existe une nouvelle clé,
LSApplicationQueriesSchemes
, et ici vous aurez besoin d’ajouter la liste des schémas que vous voulez avoir canOpenURL sur.
Le partage Facebook à partir d'un dialogue de partage échoue même avec la réponse @Matthieu (qui est 100% correcte pour le reste des URL sociales). J'ai dû ajouter un ensemble d'URL que j'ai inversé à partir du SDK de Facebook.
<array>
<string>fbapi</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>fb-messenger-api</string>
<string>Twitter</string>
<string>whatsapp</string>
<string>wechat</string>
<string>line</string>
<string>instagram</string>
<string>kakaotalk</string>
<string>mqq</string>
<string>vk</string>
<string>comgooglemaps</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
</array>
Eh bien, vous pouvez ouvrir une application en appelant directement openURL:
ou openURL:options:completionHandler:
(iOS 10 à partir de maintenant) sans effectuer la vérification conditionnelle canOpenURL:
. Veuillez lire la section discussion dans doc Apple pour canOpenURL: méthode qui indique:
la méthode openURL: n'est pas contrainte par l'exigence
LSApplicationQueriesSchemes
.
Il est important de noter qu'il y avait un bug avec les téléphones jailbreakés sur 9.0.x qui cassait les schémas d'URL. Si vous utilisez un appareil jailbreaké, assurez-vous de mettre à jour Patcyh dans Cydia.
Il ne semble pas que quiconque ait expliqué comment spécifier des URL avec des paramètres incorporés. Toute URL contenant des paramètres ne permet pas de spécifier l'URL spécifique dans LSApplicationsQueriesSchemes. Par exemple, supposons que j'ai une application de messagerie qui transmet l'adresse de messagerie de l'expéditeur:
myemail://[email protected]
La seule façon de le faire fonctionner dans iOS9 est de supprimer tous les paramètres.
Swift 3.1, Swift 3.2, Swift 4
if let urlFromStr = URL(string: "instagram://app") {
if UIApplication.shared.canOpenURL(urlFromStr) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(urlFromStr)
}
}
}
Ajoutez-les dans Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Dans Swift 4.2 et Xcode 10.1
CFBundleURLSchemes et LSApplicationQueriesSchemes pour gmail, fb, Twitter et liens associés.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>li5****5</string>
<string>com.googleusercontent.apps.8***************5f</string>
<string>fb8***********3</string>
<string>twitterkit-s***************w</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>8*********3</string>
<key>FacebookDisplayName</key>
<string>K************ app</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>Twitter</string>
<string>twitterauth</string>
<string>linkedin</string>
<string>linkedin-sdk2</string>
<string>linkedin-sdk</string>
</array>
Voir l'écran ci-dessous
Apple a modifié la méthode canOpenURL sur iOS 9. Les applications qui recherchent des schémas d'URL sous iOS 9 et iOS 10 doivent déclarer ces schémas au fur et à mesure qu'ils sont soumis à Apple.