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?

Sk.Azad
quelle
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.

die Gesetze
quelle
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

Matthieu Rouif
quelle
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> 
Leo Natan
quelle
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

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

Kaey
quelle
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>
elbuild
quelle
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

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

Buzzrick
quelle
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.

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

Die einzige Möglichkeit, es in iOS9 zum Laufen zu bringen, besteht darin, alle Parameter zu entfernen.

Dave
quelle
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.

Nish
quelle
0

Fügen Sie für PayPal die folgenden URL-Schemata hinzu:

Geben Sie hier die Bildbeschreibung ein

Verweisen Sie auf diesen Link

Naveen Kumar M.
quelle
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>
Vini App
quelle
-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.

number_x
quelle