iOS 9 non apre l'app Instagram con URL SCHEME


138

Il seguente URL si apre su iOS 8.3 e versioni precedenti, ma non funziona e iOS 9

let instagramURL = NSURL(string: "instagram://app")

Perché l'URL non si apre?


Cosa +canOpenURL:ritorna?
thelaws,

Che errore stai ricevendo? Questa non è una domanda su xcode .
JAL

Non riesce "se UIApplication.sharedApplication (). CanOpenURL (instagramURL!)" Il controllo
Sk.Azad

Si prega di consultare l'articolo qui: awkwardhare.com/post/121196006730/… In iOS 9 è necessario specificare quali schemi di url sta cercando la tua app (non l'ho fatto da solo)
thelaws,

3
Aggiungi questo al tuo file info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <stringa> URLScma3 </string> </array>
Kamleshwar

Risposte:


210

iOS 9 ha apportato una piccola modifica alla gestione dello schema URL. Devi inserire nella lista bianca gli URL che la tua app chiamerà utilizzando il LSApplicationQueriesSchemestasto nel tuo Info.plist.

Si prega di vedere post qui: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

La conclusione principale è che:

Se chiami il metodo "canOpenURL" su un URL che non è nella tua lista bianca, verrà restituito "NO", anche se è installata un'app registrata per gestire questo schema. Verrà visualizzata la voce di syslog "Questa app non può eseguire query per schema xxx".

Se chiami il metodo "openURL" su un URL che non è nella tua lista bianca, fallirà silenziosamente. Verrà visualizzata la voce di syslog "Questa app non può eseguire query per schema xxx".

L'autore ipotizza anche che si tratti di un bug con il sistema operativo e Apple lo risolverà in una versione successiva.


23
A titolo di chiarimento, NON includere ": //" nella stringa di un'app specifica da inserire nella lista bianca dell'array LSApplicationQueriesSchemes, ad esempio "comgooglemaps: //". Se includi ": //" canOpenUrl: restituirà NO e fornirà il "syslog / errore" per questa app per lo schema xxx ". Tuttavia, quando effettui la chiamata effettiva di canOpenUrl: devi comunque includere i due punti, ad esempio canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump

5
Apple, infatti, ha risolto questo problema in un recente aggiornamento. -openURL:funziona sempre anche se -canOpenURL:è limitato.
Tim Johnsen,

Che senso ha questo? Dov'è la sicurezza se posso solo elencare tutto nella lista e continuare a cercarlo?
Maciej Swic,

@MaciejSwic Uno dei motivi è che non è possibile modificare l'elenco senza reinviare ad Apple.
thelaws

Nota che tutto ciò è correlato alle app compilate solo con iOS SDK 9. "Se non stai ricompilando con iOS SDK 9.0, la tua app è limitata a 50 schemi distinti (le chiamate a canOpenURL in seguito restituiscono NO)", come specificato su developers.facebook.com/docs/ios/ios9
mkll

158

Come detto sopra, vuoi aggiungere una chiave nella finestra di informazioni, ecco l'elenco per la maggior parte dei social network

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

* Le prime 3 partite di Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" è per Snapchat


Grazie, penso che v debba aggiungere "fb" all'elenco
siva krishna,

1
@sivakrishna fb non è menzionato qui developers.facebook.com/docs/ios/ios9
Matthieu Rouif

ma se voglio reindirizzare a qualsiasi pagina del libro come " facebook.com/ .... ", dopo aver aggiunto fb solo il suo wrkng
siva krishna,

Quasi buono. In Octobr 2015 ho riscontrato alcuni errori con strani URL dalle finestre di dialogo di condivisione di Facebook. Li ho aggiunti come risposta, sentiti libero di aggiungerlo al tuo che è davvero corretto.
elbuild,

1
e Ha://add/[username]per aggiungere amici snapchat in rapido 3
EssamSoft

87

Questa è una nuova funzionalità di sicurezza di iOS 9. Guarda WWDC 2015 Session 703 per ulteriori informazioni.

Qualsiasi app creata con SDK 9 deve fornire una LSApplicationQueriesSchemesvoce nel suo file plist, dichiarando quali schemi tenta di interrogare.

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>urlscheme</string>
 <string>urlscheme2</string>
 <string>urlscheme3</string>
 <string>urlscheme4</string>
</array> 

Per chiarire le cose. Questo escluderà tali app che consentono all'utente di inserire il proprio schema URL + eseguirlo?
Jonny,

@Jonny No, perché puoi ancora provare ad aprire qualsiasi URL usando openURL:. E ti dirà se l'apertura ha avuto successo o no.
Leo Natan,

Sì, ma canOpenURL non può essere utilizzato, quindi non possiamo dire all'utente se funzionerà o meno, deve solo provare da solo.
Jonny,

Voglio aprire google maps cosa devo inserire nell'URLSCHEME?
coding22

25

Supponendo due app TestA e Test B. TestB desidera eseguire una query se TestA è installato. "TestA" definisce il seguente schema URL nel suo file info.plist:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>

La seconda app "TestB" tenta di scoprire se "TestA" è installato chiamando:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];

Ma ciò normalmente restituirà NO in iOS9 perché "TestA" deve essere aggiunto alla voce LSApplicationQueriesSchemes nel file info.plist di TestB. Questo viene fatto aggiungendo il seguente codice al file info.plist di TestB:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>TestA</string>
</array>

Un'implementazione funzionante è disponibile qui: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example


aspetta, non dovrebbe essere il valore di stringa della chiave LSApplicationQueriesSchemes come "testA" in into.plist dell'app TestB?
Nik Yekimov,

22

Da, Sessione 703 WWDC 2015:

Puoi continuare a utilizzare gli schemi URL quando crei la tua app per iOS 9 e desideri chiamare schemi URL, ora dovrai dichiararli nella Info.plist delle tue app. C'è una nuova chiave, LSApplicationQueriesSchemese qui dovrai aggiungere l'elenco degli schemi che vuoi che siano canOpenURL.

Ad esempio, in caso di FB


1
Sì, non è così. Non funzionerà ancora comgooglemaps, anche con info.plist
Radu,

hai trovato una soluzione per questo?
Salman Hasrat Khan,

1
un'immagine vale 1000 parole. grazie per lo screenshot. era tutto ciò di cui avevo bisogno.
sean808080,

3

La condivisione di Facebook da una finestra di dialogo di condivisione non riesce anche con la risposta @Matthieu (che è corretta al 100% per il resto degli URL social). Ho dovuto aggiungere un set di URL che ho invertito dall'SDK di 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>

Sai quale app posso usare per visualizzare un documento e puoi fornirmi il codice?
Nishat Jahan,

2

In Swift 4.2 e Xcode 10.1

In info.plist è necessario aggiungere CFBundleURLSchemes e LSApplicationQueriesSchemes.

-> Seleziona info.plist nel tuo progetto,

-> tasto destro,

-> Seleziona Apri come codice sorgente

Vedi la seguente schermata

inserisci qui la descrizione dell'immagine

-> verrà aperto il file xml

-> copia: incolla il codice seguente e sostituiscilo con il tuo ID

CFBundleURLSchemes e LSApplicationQueriesSchemes per gmail, fb, twitter e collegati.

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

Vedi sotto lo schermo il tuo file info.plist finale è

inserisci qui la descrizione dell'immagine


1

È importante notare che c'era un bug con i telefoni jailbreak su 9.0.x che ha rotto gli schemi url. Se stai utilizzando un dispositivo jailbreak, assicurati di aggiornare Patcyh in Cydia


1

Bene, puoi aprire un'app chiamando openURL:o openURL:options:completionHandler:(iOS 10 in poi) direttamente senza effettuare il controllo condizionale canOpenURL:. Si prega di leggere la sezione di discussione nel documento Apple per canOpenURL: metodo che dice:

il metodo openURL: non è vincolato dal LSApplicationQueriesSchemesrequisito.


0

Sembra che nessuno abbia affrontato come specificare gli URL con parametri incorporati. Qualsiasi URL che contenga parametri non sarà possibile specificare l'URL specifico in LSApplicationsQueriesSchemes. Ad esempio, supponiamo che io abbia un'app di posta elettronica che passa l'indirizzo di posta elettronica dei mittenti:

myemail://mailto?bob@gmail.com

L'unico modo in cui sembra farlo funzionare in iOS9 è rimuovere tutti i parametri.


4
Eh? Quello che dovresti aggiungere nella lista è myemail. I parametri non svolgono alcun ruolo qui.
Leo Natan,

0

Apple ha modificato il metodo canOpenURL su iOS 9. Le app che stanno verificando la presenza di schemi URL su iOS 9 e iOS 10 devono dichiarare questi schemi quando vengono inviati ad Apple.



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

Aggiungi questi in Info.plist:

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

-1

Quando ho provato a chiamare Facebook dalla mia app oggi, ho scoperto che non esiste un LSApplicationQueriesSchemestasto da aggiungere a Info.plist(Xcode Versione 8.2.1 (8C1002)). Ho aperto il testoInfo.plist con Sublime e l'ho aggiunto manualmente nel file, quindi ha funzionato. Solo per farti sapere che se non riesci a trovare la chiave, aggiungila semplicemente tu.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.