iOS 9 n'ouvre pas l'application Instagram avec l'URL SCHEME

138

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?

Sk.Azad
la source
Qu'est-ce qui +canOpenURL:revient?
thelaws
Quelle erreur obtenez vous? Ce n'est pas une question sur xcode .
JAL
Il échoue "si UIApplication.sharedApplication (). CanOpenURL (instagramURL!)" La vérification
Sk.Azad
Veuillez consulter l'article ici: awkwardhare.com/post/121196006730/… Dans iOS 9, vous devez spécifier les schémas d'URL que votre application recherche (je ne l'ai pas fait moi-même)
lois
3
Ajoutez ceci à votre fichier info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <string> URLScma3 </string> </array>
Kamleshwar

Réponses:

210

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 LSApplicationQueriesSchemesclé 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.

les lois
la source
23
Pour clarifier, n'incluez PAS ": //" dans la chaîne d'une application spécifique à mettre sur la liste blanche dans le tableau LSApplicationQueriesSchemes, c'est-à-dire "comgooglemaps: //". Si vous incluez ": //" canOpenUrl: retournera NON et fournira le syslog / erreur "Cette application n'est pas autorisée à interroger le schéma xxx". Cependant, lorsque vous effectuez l'appel réel de canOpenUrl: vous devez toujours inclure les deux points, c'est-à-dire canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump
5
Apple a en fait résolu ce problème dans une mise à jour récente. -openURL:fonctionne toujours même s'il -canOpenURL:est limité.
Tim Johnsen
À quoi ça sert? Où est la sécurité si je peux simplement lister tout dans le plist et toujours le demander?
Maciej Swic
@MaciejSwic Une des raisons est que vous ne pouvez pas modifier la liste sans la soumettre à nouveau à Apple.
lois du
Notez que tout cela est uniquement lié aux applications compilées avec iOS SDK 9. «Si vous ne recompilez pas avec iOS SDK 9.0, votre application est limitée à 50 schémas distincts (les appels à canOpenURL renvoient ensuite NO)», comme spécifié sur developer.facebook.com/docs/ios/ios9
mkll
158

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

Matthieu Rouif
la source
Thx, je pense que v besoin d'ajouter "fb" à la liste
siva krishna
1
@sivakrishna fb n'est pas mentionné ici développeurs.facebook.com
Matthieu Rouif
mais si je veux rediriger vers n'importe quelle page de livre de visage comme " facebook.com/ ...."
siva krishna
Presque bon. En octobre 2015, j'ai eu des échecs avec des URL étranges à partir de boîtes de dialogue de partage Facebook. Je les ai ajoutés comme réponse, n'hésitez pas à l'ajouter à la vôtre qui est en effet correcte.
elbuild
1
et Ha://add/[username]pour ajouter des amis Snapchat dans Swift 3
EssamSoft
87

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 LSApplicationQueriesSchemesentré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> 
Leo Natan
la source
Pour clarifier les choses. Cela exclura-t-il de telles applications qui permettent à l'utilisateur d'entrer son propre schéma d'URL + l'exécuter?
Jonny
@Jonny Non, car vous pouvez toujours essayer d'ouvrir n'importe quelle URL en utilisant openURL:. Et il vous dira si l'ouverture a réussi ou non.
Leo Natan
Oui, mais canOpenURL ne peut pas être utilisé, nous ne pouvons donc pas dire à l'utilisateur si cela fonctionnera ou non, il doit juste essayer par lui-même.
Jonny
Je veux ouvrir Google Maps, que dois-je mettre dans le urlscheme?
codage22
25

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

Awsed
la source
attendez, la valeur de chaîne de la clé LSApplicationQueriesSchemes ne devrait-elle pas être «testA» dans into.plist de l'application TestB?
Nik Yekimov
22

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é, LSApplicationQueriesSchemeset ici vous devrez ajouter la liste des schémas sur lesquels vous souhaitez que canOpenURL.

Par exemple, en cas de FB

Kaey
la source
1
Ouais, ce n'est pas ça. Cela ne fonctionnera toujours pas avec comgooglemaps, même avec info.plist
Radu
avez-vous trouvé une solution à cela?
Salman Hasrat Khan
1
une image vaut 1000 mots. merci pour la capture d'écran. c'était tout ce dont j'avais besoin.
sean808080
3

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>
elbuild
la source
Savez-vous quelle application puis-je utiliser pour afficher un document et pouvez-vous m'en fournir le code?
Nishat Jahan
2

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

entrez la description de l'image ici

-> 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

entrez la description de l'image ici

iOS
la source
1

Il est important de noter qu'il y avait un bogue 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

Buzzrick
la source
1

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' LSApplicationQueriesSchemesexigence.

iphondroid
la source
0

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://[email protected]

La seule façon de le faire fonctionner dans iOS9 est de supprimer tous les paramètres.

Dave
la source
4
Hein? Ce que vous devez ajouter dans le plist est myemail. Les paramètres ne jouent aucun rôle ici.
Leo Natan
0

Apple a changé la méthode canOpenURL sur iOS 9. Les applications qui vérifient les schémas d'URL sur iOS 9 et iOS 10 doivent déclarer ces schémas au fur et à mesure qu'ils sont soumis à Apple.

Nish
la source
0

Pour PayPal, ajoutez ci-dessous les schémas d'URL:

entrez la description de l'image ici

Référez ce lien

Naveen Kumar M
la source
0

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>
Appli Vini
la source
-1

Lorsque j'ai essayé d'appeler Facebook à partir de ma propre application aujourd'hui, j'ai trouvé qu'il n'y avait pas de LSApplicationQueriesSchemesclé que je pouvais ajouter au Info.plist(Xcode Version 8.2.1 (8C1002)). J'ai ouvert le Info.plistavec 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.

number_x
la source