A partir de iOS 9, las aplicaciones de terceros ya no pueden consultar esquemas de URL arbitrarios. Varias aplicaciones de terceros, sobre todo Twitter, abusaron del canOpenURL (_ :)
método de la UIApplicación
clase para rastrear qué aplicaciones están instaladas en un dispositivo en particular.
Apple ha implementado una serie de restricciones para proteger la privacidad de sus clientes. En este rápido consejo, le digo lo que necesita saber sobre estos cambios y le muestro cómo puede actualizar sus aplicaciones..
Supongo que ya sabe que una aplicación iOS puede pedirle al sistema operativo que inicie otra aplicación utilizando un esquema de URL. En su forma más simple, funciona algo como esto..
let URLAsString = "tweetbot: // _ bartjacobs / timeline" if let URL = NSURL.init (cadena: URLAsString) UIApplication.sharedApplication (). openURL (URL)
A veces, es útil preguntar primero al sistema operativo si se puede abrir una URL antes de abrirla. Esto es especialmente útil si desea actualizar la interfaz de usuario en función de las aplicaciones que el usuario haya instalado y con las que pueda interactuar. En el ejemplo anterior, openURL (_ :)
no tendrá éxito si Tweetbot no está instalado en el dispositivo del usuario. Para preguntar al sistema operativo si se puede abrir una URL, puede hacer uso del canOpenURL (_ :)
método de la UIApplicación
clase.
let URLAsString = "tweetbot: // _ bartjacobs / timeline" if let URL = NSURL.init (cadena: URLAsString) si UIApplication.sharedApplication (). canOpenURL (URL) UIApplication.sharedApplication (). openURL (URL) imprimir ("No se puede abrir la URL")
Desafortunadamente, algunas aplicaciones, especialmente Twitter, han sido mal utilizadas. canOpenURL (_ :)
para detectar qué aplicaciones están instaladas en el dispositivo del usuario. Según Apple, esto viola la privacidad del usuario. Como resultado, Apple ya no tolera este tipo de uso indebido en iOS 9 al imponer dos restricciones.
canOpenURL (_ :)
falla si la URL no se agrega a una lista blanca en la aplicación Info.plist.falso
y lanzar un error. La documentación enfatiza que esta limitación se restablece cuando el usuario reinstala o actualiza la aplicación.Permítame mostrarle lo que esto significa en la práctica al crear una aplicación simple que abre Tweetbot, mi cliente favorito de Twitter. Crea un nuevo proyecto en Xcode 7 y elige el Solicitud de vista única modelo. Nombra el proyecto Esquemas y establecer Idioma a Rápido.
Antes de echar un vistazo a los esquemas de URL, quiero configurar la interfaz de usuario. Abierto ViewController.swift y añadir una acción, openTweetbot (_ :)
, al ViewController
clase. Puedes dejar su implementación en blanco por ahora..
// MARK: - Actions @IBAction func openTweetbot (sender: AnyObject)
Abierto Main.storyboard y añadir un botón a la Ver escena del controlador. Establece el título del botón en Abrir Tweetbot y conecte el botón con el controlador de vista openTweetbot (_ :)
acción que creamos anteriormente.
No vamos a hacer nada demasiado complicado. Cuando toco el Abrir Tweetbot Botón, el sistema operativo abre Tweetbot, mostrándome mi línea de tiempo. Puede leer más sobre los esquemas de URL para Tweetbot en el sitio web de Tapbots.
Antes de que Apple impusiera las restricciones antes mencionadas para consultar esquemas de URL, podría hacer lo siguiente:
@IBAction func openTweetbot (sender: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard let URL = NSURL.init: stringAsString) else return guard application. (URL) else return // Abrir URL application.openURL (URL)
Le preguntamos al sistema operativo si puede abrir la URL que pasamos a canOpenURL (_ :)
. Si este método vuelve falso
en iOS 8 y versiones anteriores, sabemos que la aplicación en la que estamos interesados no está instalada en el dispositivo del usuario, asumiendo que el esquema de URL se relaciona con otra aplicación. Esto puede ser muy útil, pero Apple quiere poner algunas restricciones en la API para evitar el abuso.
Si creas la aplicación en Xcode 7 y tocas el Abrir Tweetbot botón, canOpenURL (_ :)
devoluciones falso
y el sistema operativo arroja un error que se parece a esto:
Esquemas [9227: 3539016] -canOpenURL: error de URL: "tweetbot: // _ bartjacobs / timeline" - error: "Esta aplicación no puede consultar el esquema de tweetbot"
El sistema operativo nos informa explícitamente que la aplicación no está permitida saber Si se puede abrir la URL que pasamos a canOpenURL (_ :)
. No significa que la aplicación no tenga permiso para abrir la URL a la que pasamos openURL (_ :)
, aunque.
Si actualiza la implementación de openTweetbot (_ :)
como se muestra a continuación y tiene instalado Tweetbot, la aplicación puede abrir Tweetbot cuando se toca el botón. Esto enfatiza que Apple quiere limitar el (mal) uso de canOpenURL (_ :)
, no openURL (_ :)
.
@IBAction func openTweetbot (sender: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard let URL = NSURL.init (string): stringAsString) else return // Abrir dirección URL application.openURL (URL)
Afortunadamente, hay una solución fácil para este problema. A partir de iOS 9, Apple solicita a los desarrolladores que incluyan en la lista blanca los esquemas de URL que una aplicación desea consultar. Esto es tan simple como agregar una entrada a la aplicación Info.plist.
Abierto Info.plist, agregar una clave llamada LSApplicationQueriesSchemes, y establecer el tipo de valor en Formación. Añadir un elemento de tipo Cuerda a la matriz y establecer su valor en tweetbot.
Si revertimos openTweetbot (_ :)
A su implementación original, podemos invocar. canOpenURL (_ :)
Sin que el sistema operativo nos arroje errores. Puedes agregar tantos esquemas de URL a tus aplicaciones Info.plist.
@IBAction func openTweetbot (sender: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guard let URL = NSURL.init: stringAsString) else return guard application. (URL) else return // Abrir URL application.openURL (URL)
La mayoría de las aplicaciones no tendrán problemas con la nueva política de Apple. Está claro que Apple apunta a proteger la privacidad de sus clientes al limitar la información que las aplicaciones pueden extraer del sistema operativo. Las aplicaciones se encuentran en un espacio aislado en iOS y Apple quiere controlar la cantidad de información que una aplicación puede extraer del entorno en el que vive..
La lista blanca de esquemas de URL no es un gran problema para la mayoría de las aplicaciones, pero puede resultar tediosa si planea crear un iniciador de aplicaciones, como Launch Center Pro. Todavía es posible crear un lanzador siempre que incluya en la lista blanca todos los esquemas de URL que la aplicación desea consultar. Esto puede ser bastante tedioso, aunque.