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?
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?
Risposte:
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 LSApplicationQueriesSchemes
tasto 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.
-openURL:
funziona sempre anche se -canOpenURL:
è limitato.
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
Ha://add/[username]
per aggiungere amici snapchat in rapido 3
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 LSApplicationQueriesSchemes
voce 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>
openURL:
. E ti dirà se l'apertura ha avuto successo o no.
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
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,
LSApplicationQueriesSchemes
e qui dovrai aggiungere l'elenco degli schemi che vuoi che siano canOpenURL.
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>
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
-> 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 è
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
LSApplicationQueriesSchemes
requisito.
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.
myemail
. I parametri non svolgono alcun ruolo qui.
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>
Quando ho provato a chiamare Facebook dalla mia app oggi, ho scoperto che non esiste un LSApplicationQueriesSchemes
tasto 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.
+canOpenURL:
ritorna?