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?
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?
Réponses:
iOS 9 a apporté une petite modification à la gestion du schéma d'URL. Vous devez ajouter à la liste blanche les URL que votre application appellera à l'aide de la LSApplicationQueriesSchemes
clé de votre Info.plist
.
Veuillez consulter le message ici: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
La principale conclusion est que:
Si vous appelez la méthode «canOpenURL» sur une URL qui ne figure pas dans votre liste blanche, elle renverra «NON», même si une application installée s'est inscrite 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, elle échouera silencieusement. Une entrée syslog «Cette application n'est pas autorisée à interroger le schéma xxx» apparaîtra.
L'auteur spécule également qu'il s'agit d'un bogue avec le système d'exploitation et Apple le corrigera dans une version ultérieure.
-openURL:
fonctionne toujours même s'il -canOpenURL:
est limité.
Comme dit plus haut, 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> instagram-stories</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
Ha://add/[username]
pour ajouter des amis Snapchat dans Swift 3
Il s'agit d'une nouvelle fonctionnalité de sécurité d'iOS 9. Regardez la session 703 de la WWDC 2015 pour plus d'informations.
Toute application créée avec le SDK 9 doit fournir une LSApplicationQueriesSchemes
entrée dans son fichier plist, déclarant les schémas qu'elle tente d'interroger.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. Et il vous dira si l'ouverture a réussi ou non.
En supposant 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" tente de savoir si "TestA" est installé en appelant:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Mais cela retournera normalement NON dans iOS9 car "TestA" doit être ajouté à l'entrée LSApplicationQueriesSchemes dans le fichier info.plist de TestB. Cela se 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, Session 703 WWDC 2015:
Vous pouvez continuer à utiliser des schémas d'URL lorsque vous créez votre application pour iOS 9 et que vous souhaitez appeler des schémas d'URL, vous devrez maintenant les déclarer dans vos applications Info.plist. Il y a une nouvelle clé,
LSApplicationQueriesSchemes
et ici vous devrez ajouter la liste des schémas sur lesquels vous souhaitez que canOpenURL.
Le partage Facebook à partir d'une boîte de 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é du SDK 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>
Dans Swift 4.2 et Xcode 10.1
Dans info.plist, vous devez ajouter CFBundleURLSchemes et LSApplicationQueriesSchemes.
-> Sélectionnez info.plist dans votre projet,
-> clic droit,
-> Sélectionnez Ouvrir en tant que code source
Voir la capture d'écran ci-dessous
-> le fichier xml sera ouvert
-> copier - coller ci-dessous le code et le remplacer par vos identifiants
CFBundleURLSchemes et LSApplicationQueriesSchemes pour gmail, fb, twitter et liés dans.
<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, votre fichier info.plist final est
Eh bien, vous pouvez ouvrir une application en appelant openURL:
ou openURL:options:completionHandler:
(à partir d'iOS 10) directement sans effectuer la vérification conditionnelle canOpenURL:
. Veuillez lire la section de discussion dans le document Apple pour la méthode canOpenURL: qui dit:
la méthode openURL: n'est pas contrainte par l'
LSApplicationQueriesSchemes
exigence.
Il semble que personne ne se soit demandé comment spécifier des URL avec des paramètres intégrés. Toute URL contenant des paramètres, il ne sera pas possible de spécifier l'URL spécifique dans LSApplicationsQueriesSchemes. Par exemple, supposons que je dispose d'une application de messagerie qui transmet l'adresse e-mail des expéditeurs:
myemail://mailto?bob@gmail.com
La seule façon de le faire fonctionner dans iOS9 est de supprimer tous les paramètres.
myemail
. Les paramètres ne jouent aucun rôle ici.
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>
Lorsque j'ai essayé d'appeler Facebook à partir de ma propre application aujourd'hui, j'ai trouvé qu'il n'y avait pas de LSApplicationQueriesSchemes
clé que je pouvais ajouter au Info.plist
(Xcode Version 8.2.1 (8C1002)). J'ai ouvert le Info.plist
avec Sublime Text et l' ai ajouté manuellement dans le fichier, puis cela a fonctionné. Juste pour vous faire savoir que si vous ne trouvez pas la clé, ajoutez-la simplement vous-même.
+canOpenURL:
revient?