iOS 9 no abre la aplicación de Instagram con URL SCHEME


138

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?


¿Qué +canOpenURL:devuelve?
Thelaws

¿Qué error estás recibiendo? Esta no es una pregunta sobre xcode .
JAL

Falla "si UIApplication.sharedApplication (). CanOpenURL (instagramURL!)" La comprobación
Sk.Azad

Por favor, vea el artículo aquí: awkwardhare.com/post/121196006730/... En iOS 9 debe especificar qué URL esquemas de su aplicación está buscando (no he hecho esto por mí mismo)
thelaws

3
Agregue esto a su archivo info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <string> URLScma3 </string> </array>
Kamleshwar

Respuestas:


210

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


23
Como punto de aclaración, NO incluya ": //" en la cadena de una aplicación específica que se incluirá en la lista blanca en la matriz LSApplicationQueriesSchemes, es decir, "comgooglemaps: //". Si incluye ": //" canOpenUrl: devolverá NO y proporcionará "syslog / error" Esta aplicación no puede consultar el esquema xxx ". Sin embargo, cuando realiza la llamada real de canOpenUrl: aún debe incluir los dos puntos, es decir, canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump

55
Apple, de hecho, solucionó esto en una actualización reciente. -openURL:siempre funciona aunque -canOpenURL:sea ​​limitado.
Tim Johnsen el

¿Cuál es el punto de esto? ¿Dónde está la seguridad si puedo enumerar todo en el plist y aún consultarlo?
Maciej Swic

@MaciejSwic Una razón es que no puede cambiar la lista sin volver a enviarla a Apple.
leyes

Tenga en cuenta que todo eso está relacionado con aplicaciones compiladas solo contra iOS SDK 9. "Si no está compilando con iOS SDK 9.0, su aplicación está limitada a 50 esquemas distintos (las llamadas a canOpenURL luego devuelven NO)", como se especifica en developers.facebook.com/docs/ios/ios9
mkll

158

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


Thx, creo que necesito agregar "fb" a la lista
siva krishna

1
@sivakrishna fb no se menciona aquí developers.facebook.com/docs/ios/ios9
Matthieu Rouif

pero si quiero redirigir a cualquier página de Facebook como " facebook.com/....",Después de agregar fb solo su wrkng
siva krishna

Casi bueno. En octubre de 2015, tuve algunos fallos con URL extrañas de los cuadros de diálogo de Facebook. Los agregué como respuesta, siéntase libre de agregarlo al suyo, lo que de hecho es correcto.
elbuild

1
y Ha://add/[username]para agregar amigos a Snapchat en Swift 3
EssamSoft

87

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

Para dejar las cosas claras. ¿Esto descartará esas aplicaciones que permiten al usuario ingresar su propio esquema de URL + ejecutar eso?
Jonny

@ Jonny No, porque aún puedes intentar abrir cualquier URL usando openURL:. Y le dirá si la apertura fue exitosa o no.
Leo Natan

Sí, pero canOpenURL no se puede usar, por lo que no podemos decirle al usuario si funcionará o no, solo tiene que intentarlo por sí mismo.
Jonny

Quiero abrir Google Maps, ¿qué debo poner en el esquema de URL?
coding22

25

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


espera, ¿no debería ser el valor de cadena de la clave LSApplicationQueriesSchemes como "testA" en into.plist de la aplicación TestB?
Nik Yekimov

22

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, LSApplicationQueriesSchemesy aquí deberá agregar la lista de esquemas en los que desea que canOpenURL esté activado.

Por ejemplo, en caso de FB


1
Si, no es eso. Todavía no funcionará comgooglemaps, incluso con info.plist
Radu

¿Encontraste una solución para esto?
Salman Hasrat Khan

1
Una imagen vale más que 1000 palabras. Gracias por la captura de pantalla. Era todo lo que necesitaba.
sean808080

3

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>

¿Sabes qué aplicación puedo usar para ver un documento y me puedes proporcionar el código?
Nishat Jahan

2

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí


1

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


1

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


0

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.


44
¿Eh? Lo que debe agregar en el plist es myemail. Los parámetros no juegan ningún papel aquí.
Leo Natan

0

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.



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

Agregue estos en Info.plist:

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

-1

Cuando intenté llamar a Facebook desde mi propia aplicación hoy, descubrí que no hay una LSApplicationQueriesSchemesclave que pueda agregar a Info.plist(Xcode Versión 8.2.1 (8C1002)). Lo abrí Info.plistcon 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.