caracteristicas - ios 9 iphone 4
iOS 9 no abre la aplicaciĆ³n de Instagram con URL SCHEME (14)
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?
Apple cambió el método canOpenURL en iOS 9. Las aplicaciones que están buscando esquemas de URL en iOS 9 e iOS 10 tienen que declarar estos esquemas a medida que se envían a Apple.
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
Bueno, puede abrir una aplicación llamando a
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
el documento de Apple para canOpenURL: método
que dice:
El método openURL: no está limitado por el requisito
LSApplicationQueriesSchemes
.
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
Cuando intenté llamar a Facebook desde mi propia aplicación hoy, descubrí que no hay una clave
LSApplicationQueriesSchemes
que pueda agregar a
Info.plist
(Xcode Versión 8.2.1 (8C1002)).
Abrí el
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.
De la sesión 703 WWDC 2015:
Puede seguir usando 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
Es importante tener en cuenta que hubo un error con los teléfonos con jailbreak en 9.0.x que rompió los esquemas de URL. Si está ejecutando un dispositivo con jailbreak, asegúrese de actualizar Patcyh en Cydia
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 entrada
LSApplicationQueriesSchemes
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>
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://[email protected]
La única forma en que parece hacer que funcione en iOS9 es eliminar cualquier parámetro.
iOS 9 ha realizado un pequeño cambio en el manejo del esquema de URL.
Debe incluir en la lista blanca las direcciones URL a las que su aplicación llamará utilizando la clave
LSApplicationQueriesSchemes
en su
Info.plist
.
Consulte la publicación aquí: awkwardhare.com/post/121196006730/…
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.
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>