Die folgende URL wird unter iOS 8.3 und niedriger geöffnet, funktioniert jedoch unter iOS 9 nicht
let instagramURL = NSURL(string: "instagram://app")
Warum öffnet sich die URL nicht?
iOS 9 hat eine kleine Änderung im Umgang mit dem URL-Schema vorgenommen. Sie müssen die URLs auflisten, die Ihre App mit der LSApplicationQueriesSchemes
-Taste in Ihrem Info.plist
aufrufen soll.
Siehe bitte hier: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Die wichtigste Schlussfolgerung lautet:
Wenn Sie die Methode "canOpenURL" für eine URL aufrufen, die sich nicht in Ihrer Whitelist befindet, wird "NO" zurückgegeben, auch wenn eine App installiert ist, die sich registriert hat, um dieses Schema zu verarbeiten. Ein Syslog-Eintrag „Diese App darf nicht nach Schema xxx abfragen“ wird angezeigt.
Wenn Sie die "openURL" -Methode für eine URL aufrufen, die sich nicht in Ihrer Whitelist befindet, schlägt diese automatisch fehl. Ein Syslog-Eintrag „Diese App darf nicht nach Schema xxx abfragen“ wird angezeigt.
Der Autor spekuliert auch, dass dies ein Fehler im Betriebssystem ist, und Apple wird dies in einer späteren Version beheben.
Wie oben erwähnt, möchten Sie einen Schlüssel in die Info-Liste einfügen. 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>kakaotalk</string>
<string>mqq</string>
<string>vk</string>
<string>comgooglemaps</string>
<string>googlephotos</string>
<string>ha</string>
<string>yammer</string>
</array>
* Die ersten 3 Treffer Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" ist für Snapchat
Dies ist eine neue Sicherheitsfunktion von iOS 9. Watch WWDC 2015 Session 703 für weitere Informationen.
Jede mit SDK 9 erstellte App muss einen LSApplicationQueriesSchemes
-Eintrag in ihrer plist-Datei bereitstellen, in dem angegeben wird, welche Schemata abgefragt werden sollen.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
Angenommen, zwei Apps TestA und TestB. TestB möchte abfragen, ob TestA installiert ist. "TestA" definiert das folgende URL-Schema in seiner info.plist-Datei:
<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.
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Normalerweise wird dies jedoch in iOS9 NEIN zurückgegeben, da "TestA" zum Eintrag LSApplicationQueriesSchemes in der info.plist-Datei 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
Von, Sitzung 703 WWDC 2015:
Sie können weiterhin URL-Schemata verwenden, wenn Sie Ihre App für iOS 9 erstellen Wenn Sie URL-Schemas aufrufen möchten, müssen Sie sie jetzt in .__ deklarieren. Ihre Apps Info.plist. Es gibt einen neuen Schlüssel,
LSApplicationQueriesSchemes
, und hier müssen Sie die Liste der gewünschten Schemata hinzufügen canOpenURL ein.
Das Teilen von Facebook über einen Freigabedialog schlägt auch bei der Antwort von @Matthieu fehl (die für den Rest der sozialen URLs zu 100% korrekt ist). Ich musste einen Satz URL hinzufügen, den ich von Facebook SDK stornierte.
<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>
Nun, Sie können eine App öffnen, indem Sie openURL:
oder openURL:options:completionHandler:
(ab iOS 10) direkt ohne bedingte Prüfung canOpenURL:
. Bitte lesen Sie den Diskussionsabschnitt in Apple-Dokument für canOpenURL: Methode , in dem es heißt:
die openURL: -Methode ist nicht durch die
LSApplicationQueriesSchemes
-Anforderung eingeschränkt.
Es ist wichtig anzumerken, dass auf 9.0.x ein Fehler mit jailbroken-Handys aufgetreten ist, durch den die URL-Schemata gebrochen wurden. Wenn Sie ein Gerät mit Jailbreak ausführen, müssen Sie den Patch in Cydia aktualisieren
Es scheint, als hätte niemand angesprochen, wie man URLs mit eingebetteten Parametern angibt. Bei einer 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 weiterleitet:
myemail://[email protected]
Die einzige Möglichkeit, damit es unter iOS9 funktioniert, besteht darin, alle Parameter zu entfernen.
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>
In Swift 4.2 und Xcode 10.1
CFBundleURLSchemes und LSApplicationQueriesSchemes für Google Mail, fb, Twitter und verlinkt.
<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 unterer Bildschirm
Apple hat die canOpenURL-Methode unter iOS 9 geändert. Apps, die unter iOS 9 und iOS 10 nach URL-Schemas suchen, müssen diese Schemas angeben, wenn sie an Apple übermittelt werden.