Die folgende URL wird unter iOS 8.3 und niedriger geöffnet, funktioniert jedoch nicht und unter iOS 9
let instagramURL = NSURL(string: "instagram://app")
Warum wird die URL nicht geöffnet?
Die folgende URL wird unter iOS 8.3 und niedriger geöffnet, funktioniert jedoch nicht und unter iOS 9
let instagramURL = NSURL(string: "instagram://app")
Warum wird die URL nicht geöffnet?
Antworten:
iOS 9 hat eine kleine Änderung an der Handhabung des URL-Schemas vorgenommen. Sie müssen die URLs auflisten, die Ihre App zur Verwendung des LSApplicationQueriesSchemes
Schlüssels in Ihrer App aufruft Info.plist
.
Siehe Beitrag hier: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Die Hauptschlussfolgerung lautet:
Wenn Sie die Methode "canOpenURL" für eine URL aufrufen, die nicht in Ihrer Whitelist enthalten ist, wird "NO" zurückgegeben, auch wenn eine App installiert ist, die sich für dieses Schema registriert hat. Ein Syslog-Eintrag "Diese App darf nicht nach Schema xxx abfragen" wird angezeigt.
Wenn Sie die Methode "openURL" für eine URL aufrufen, die nicht in Ihrer Whitelist enthalten ist, schlägt dies unbemerkt fehl. Ein Syslog-Eintrag "Diese App darf nicht nach Schema xxx abfragen" wird angezeigt.
Der Autor spekuliert auch, dass dies ein Fehler mit dem Betriebssystem ist und Apple dies in einer späteren Version beheben wird.
-openURL:
funktioniert immer, obwohl -canOpenURL:
begrenzt ist.
Wie oben erwähnt, möchten Sie einen Schlüssel in die Info-Liste aufnehmen. Hier ist die Liste für die meisten sozialen Netzwerke
<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>
* Die ersten 3 Spiele Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" ist für Snapchat
Ha://add/[username]
um Freunde Snapchat in Swift 3
Dies ist eine neue Sicherheitsfunktion von iOS 9. Weitere Informationen finden Sie in WWDC 2015 Session 703 .
Jede mit SDK 9 erstellte App muss einen LSApplicationQueriesSchemes
Eintrag in ihrer Plist-Datei bereitstellen und angeben, welche Schemata sie abfragen möchte.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. Und es wird Ihnen sagen, ob das Öffnen erfolgreich war oder nicht.
Angenommen, zwei Apps TestA und TestB. TestB möchte abfragen, ob TestA installiert ist. "TestA" definiert das folgende URL-Schema in seiner Datei info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
Die zweite App "TestB" versucht herauszufinden, ob "TestA" installiert ist, indem sie Folgendes aufruft:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
In iOS9 wird normalerweise NO zurückgegeben, da "TestA" zum Eintrag LSApplicationQueriesSchemes in der Datei info.plist von TestB hinzugefügt werden muss. Dazu fügen Sie der info.plist-Datei von TestB den folgenden Code hinzu:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Eine funktionierende Implementierung finden Sie hier: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
Aus, Sitzung 703 WWDC 2015:
Sie können weiterhin URL-Schemata verwenden, wenn Sie Ihre App für iOS 9 erstellen und URL-Schemata aufrufen möchten. Sie müssen sie jetzt in der Info.plist Ihrer Apps deklarieren. Es gibt einen neuen Schlüssel,
LSApplicationQueriesSchemes
und hier müssen Sie die Liste der Schemata hinzufügen, für die canOpenURL verwendet werden soll.
Das Teilen von Facebook über einen Freigabedialog schlägt auch mit der Antwort von @Matthieu fehl (was für die übrigen sozialen URLs zu 100% korrekt ist). Ich musste eine Reihe von URLs hinzufügen, die ich vom Facebook SDK umgekehrt habe.
<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>
In Swift 4.2 und Xcode 10.1
In info.plist müssen CFBundleURLSchemes und LSApplicationQueriesSchemes hinzugefügt werden.
-> Wählen Sie info.plist in Ihrem Projekt,
-> Rechtsklick,
-> Wählen Sie Als Quellcode öffnen
Siehe den folgenden Screenshot
-> XML-Datei wird geöffnet
-> Kopieren - Einfügen des folgenden Codes und Ersetzen durch Ihre IDs
CFBundleURLSchemes und LSApplicationQueriesSchemes für Google Mail, FB, Twitter und verlinkt in.
<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>
Siehe unten Bildschirm Ihre endgültige info.plist Datei ist
Nun, Sie können eine App direkt durch Aufrufen von openURL:
oder openURL:options:completionHandler:
(ab iOS 10) öffnen, ohne die bedingte Prüfung durchzuführen canOpenURL:
. Bitte lesen Sie den Diskussionsabschnitt im Apple-Dokument für canOpenURL: -Methode, in dem Folgendes steht:
Die openURL: -Methode ist nicht durch die
LSApplicationQueriesSchemes
Anforderung eingeschränkt.
Es scheint, dass sich niemand mit der Angabe von URLs mit eingebetteten Parametern befasst hat. Bei jeder URL, die Parameter enthält, kann die spezifische URL in LSApplicationsQueriesSchemes nicht angegeben werden. Angenommen, ich habe eine E-Mail-App, die die E-Mail-Adresse des Absenders übergibt:
myemail://mailto?bob@gmail.com
Die einzige Möglichkeit, es in iOS9 zum Laufen zu bringen, besteht darin, alle Parameter zu entfernen.
myemail
. Parameter spielen hier keine Rolle.
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)
}
}
}
Fügen Sie diese in Info.plist hinzu:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Als ich heute versuchte, Facebook von meiner eigenen App aus anzurufen, stellte ich fest, dass es keinen LSApplicationQueriesSchemes
Schlüssel gibt, den ich hinzufügen kann Info.plist
(Xcode Version 8.2.1 (8C1002)). Ich habe das Info.plist
mit Sublime Text geöffnet und manuell in die Datei eingefügt, dann hat es funktioniert. Wenn Sie den Schlüssel nicht finden können, fügen Sie ihn einfach selbst hinzu.
+canOpenURL:
zurück?