iOS 9 öffnet keine Instagram-App mit URL-Schema


138

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?


Was kommt +canOpenURL:zurück?
Gesetze

Welchen Fehler bekommen Sie? Dies ist keine Frage zu xcode .
JAL

Es schlägt fehl "wenn UIApplication.sharedApplication (). CanOpenURL (instagramURL!)" Die Überprüfung
Sk.Azad

Bitte lesen Sie den Artikel hier : kwardhare.com/post/121196006730/… In iOS 9 müssen Sie angeben, nach welchen URL-Schemata Ihre App sucht (ich habe dies nicht selbst getan)
Gesetz vom

3
Fügen Sie dies Ihrer info.plist-Datei hinzu <key> LSApplicationQueriesSchemes </ key> <array> <string> URLScma1 </ string> <string> URLScma2 </ string> <string> URLScma3 </ string> </ array>
Kamleshwar

Antworten:


210

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 LSApplicationQueriesSchemesSchlü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.


23
Fügen Sie zur Verdeutlichung NICHT ": //" in die Zeichenfolge einer bestimmten App ein, die in das LSApplicationQueriesSchemes-Array aufgenommen werden soll, dh "comgooglemaps: //". Wenn Sie ": //" einschließen, gibt canOpenUrl: NO zurück und gibt das Syslog / den Fehler "Diese App darf nicht nach Schema xxx abfragen" an. Wenn Sie jedoch den eigentlichen Aufruf von canOpenUrl: ausführen, müssen Sie weiterhin den Doppelpunkt "canOpenUrl: @" comgooglemaps: "einfügen.
EmphaticArmPump

5
Apple hat dies in einem kürzlich veröffentlichten Update behoben. -openURL:funktioniert immer, obwohl -canOpenURL:begrenzt ist.
Tim Johnsen

Was ist der Sinn davon? Wo ist die Sicherheit, wenn ich einfach alles in der Liste auflisten und trotzdem danach fragen kann?
Maciej Swic

@MaciejSwic Ein Grund ist, dass Sie die Liste nicht ändern können, ohne sie erneut an Apple zu senden.
Gesetze

Beachten Sie, dass sich all dies nur auf Apps bezieht, die nur mit iOS SDK 9 kompiliert wurden. "Wenn Sie nicht mit iOS SDK 9.0 neu kompilieren, ist Ihre App auf 50 verschiedene Schemata beschränkt (Aufrufe von canOpenURL geben anschließend NO zurück)", wie unter developer.facebook.com/docs/ios/ios9
mkll

158

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


Thx, ich denke, ich muss "fb" zur Liste
hinzufügen

1
@sivakrishna fb wird hier nicht erwähnt developer.facebook.com/docs/ios/ios9
Matthieu Rouif

aber wenn ich zu einer Facebook- Seite wie " facebook.com /
....

Fast gut. Im Oktober 2015 habe ich einige Fehler mit seltsamen URLs aus Facebook-Freigabedialogen erhalten. Ich habe sie als Antwort hinzugefügt. Sie können sie gerne zu Ihrer hinzufügen, was in der Tat richtig ist.
Elbuild

1
und Ha://add/[username]um Freunde Snapchat in Swift 3
hinzuzufügen

87

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

Um die Dinge klar zu machen. Wird dies solche Apps ausschließen, mit denen der Benutzer sein eigenes URL-Schema eingeben und das ausführen kann?
Jonny

@Jonny Nein, da Sie immer noch versuchen können, eine URL mit zu öffnen openURL:. Und es wird Ihnen sagen, ob das Öffnen erfolgreich war oder nicht.
Leo Natan

Ja, aber canOpenURL kann nicht verwendet werden, sodass wir dem Benutzer nicht sagen können, ob es funktioniert oder nicht. Er muss es nur selbst versuchen.
Jonny

Ich möchte Google Maps öffnen. Was muss ich in das URL-Schema einfügen?
Codierung22

25

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


Warten Sie, sollte nicht der Zeichenfolgenwert des LSApplicationQueriesSchemes-Schlüssels als "testA" in into.plist der TestB-App angegeben werden?
Nik Yekimov

22

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, LSApplicationQueriesSchemesund hier müssen Sie die Liste der Schemata hinzufügen, für die canOpenURL verwendet werden soll.

Zum Beispiel bei FB


1
Ja, das ist es nicht. Es wird immer noch nicht funktionieren comgooglemaps, auch mit der info.plist
Radu

Hast du eine Lösung dafür gefunden?
Salman Hasrat Khan

1
Ein Bild sagt mehr als 1000 Worte. Danke für den Screenshot. es war alles was ich brauchte.
Sean808080

3

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>

Wissen Sie, mit welcher App ich ein Dokument anzeigen kann und können Sie mir den Code dafür geben?
Nishat Jahan

2

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein


1

Es ist wichtig zu beachten, dass es einen Fehler mit Jailbreak-Telefonen auf 9.0.x gab, der URL-Schemata brach. Wenn Sie ein Gerät mit Jailbreak verwenden, müssen Sie Patcyh in Cydia aktualisieren


1

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 LSApplicationQueriesSchemesAnforderung eingeschränkt.


0

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.


4
Huh? Was Sie in die Liste aufnehmen sollten, ist myemail. Parameter spielen hier keine Rolle.
Leo Natan

0

Apple hat die canOpenURL-Methode unter iOS 9 geändert. Apps, die unter iOS 9 und iOS 10 nach URL-Schemata suchen, müssen diese Schemata deklarieren, wenn sie an Apple gesendet werden.



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

Fügen Sie diese in Info.plist hinzu:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>instagram</string>
</array>

-1

Als ich heute versuchte, Facebook von meiner eigenen App aus anzurufen, stellte ich fest, dass es keinen LSApplicationQueriesSchemesSchlüssel gibt, den ich hinzufügen kann Info.plist(Xcode Version 8.2.1 (8C1002)). Ich habe das Info.plistmit 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.