La siguiente URL se abre en iOS 8.3 y versiones anteriores, pero no funciona y iOS 9
let instagramURL = NSURL(string: "instagram://app")
¿Por qué no se abre la URL?
La siguiente URL se abre en iOS 8.3 y versiones anteriores, pero no funciona y iOS 9
let instagramURL = NSURL(string: "instagram://app")
¿Por qué no se abre la URL?
Respuestas:
iOS 9 ha realizado un pequeño cambio en el manejo del esquema de URL. Debe incluir en la lista blanca las URL a las que llamará su aplicación utilizando la LSApplicationQueriesSchemes
clave en su Info.plist
.
Consulte la publicación aquí: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
La conclusión principal es que:
Si llama al método "canOpenURL" en una URL que no está en su lista blanca, devolverá "NO", incluso si hay una aplicación instalada que se haya registrado para manejar este esquema. Aparecerá la entrada de syslog "Esta aplicación no puede consultar el esquema xxx".
Si llama al método "openURL" en una URL que no está en su lista blanca, fallará en silencio. Aparecerá la entrada de syslog "Esta aplicación no puede consultar el esquema xxx".
El autor también especula que esto es un error con el sistema operativo y Apple lo solucionará en una versión posterior.
-openURL:
siempre funciona aunque -canOpenURL:
sea limitado.
Como se dijo anteriormente, desea agregar una clave en la lista de información, aquí está la lista para la mayoría de las redes sociales
<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>
* Los primeros 3 partidos de Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" es para snapchat
Ha://add/[username]
para agregar amigos a Snapchat en Swift 3
Esta es una nueva característica de seguridad de iOS 9. Vea WWDC 2015 Session 703 para obtener más información.
Cualquier aplicación creada con SDK 9 debe proporcionar una LSApplicationQueriesSchemes
entrada en su archivo plist, declarando qué esquemas intenta consultar.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. Y le dirá si la apertura fue exitosa o no.
Asumiendo dos aplicaciones TestA y TestB. TestB quiere consultar si TestA está instalado. "TestA" define el siguiente esquema de URL en su archivo info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
La segunda aplicación "TestB" intenta averiguar si "TestA" está instalado llamando a:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Pero esto normalmente devolverá NO en iOS9 porque "TestA" debe agregarse a la entrada LSApplicationQueriesSchemes en el archivo info.plist de TestB. Esto se hace agregando el siguiente código al archivo info.plist de TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Puede encontrar una implementación funcional aquí: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
De la sesión 703 WWDC 2015:
Puede seguir utilizando esquemas de URL cuando cree su aplicación para iOS 9 y desee llamar a esquemas de URL, ahora deberá declararlos en la lista de aplicaciones Info.plist. Hay una nueva clave,
LSApplicationQueriesSchemes
y aquí deberá agregar la lista de esquemas en los que desea que canOpenURL esté activado.
El uso compartido de Facebook desde un diálogo compartido falla incluso con la respuesta @Matthieu (que es 100% correcta para el resto de las URL sociales). Tuve que agregar un conjunto de URL que revertí del SDK de 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>
En Swift 4.2 y Xcode 10.1
En info.plist necesita agregar CFBundleURLSchemes y LSApplicationQueriesSchemes.
-> Seleccione info.plist en su proyecto,
-> clic derecho,
-> Seleccione Abrir como código fuente
Vea la captura de pantalla a continuación
-> se abrirá el archivo xml
-> copiar - pegar debajo del código y reemplazarlo con su ID
CFBundleURLSchemes y LSApplicationQueriesSchemes para gmail, fb, twitter y enlazados.
<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>
Vea debajo de la pantalla su archivo final info.plist es
Bueno, puede abrir una aplicación llamando openURL:
o openURL:options:completionHandler:
(iOS 10 en adelante) directamente sin hacer la verificación condicional canOpenURL:
. Lea la sección de discusión en Apple doc para canOpenURL: método que dice:
El método openURL: no está limitado por el
LSApplicationQueriesSchemes
requisito.
No parece que nadie haya abordado cómo especificar URL con parámetros incrustados. Cualquier URL que contenga parámetros no será posible especificar la URL específica en LSApplicationsQueriesSchemes. Por ejemplo, suponga que tengo una aplicación de correo electrónico que pasa la dirección de correo electrónico del remitente:
myemail://mailto?bob@gmail.com
La única forma en que parece hacer que funcione en iOS9 es eliminar cualquier parámetro.
myemail
. Los parámetros no juegan ningún papel aquí.
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)
}
}
}
Agregue estos en Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Cuando intenté llamar a Facebook desde mi propia aplicación hoy, descubrí que no hay una LSApplicationQueriesSchemes
clave que pueda agregar a Info.plist
(Xcode Versión 8.2.1 (8C1002)). Lo abrí Info.plist
con Sublime Text y lo agregué manualmente al archivo, luego funcionó. Solo para hacerle saber que si no puede encontrar la clave, simplemente agréguela usted mismo.
+canOpenURL:
devuelve?