thxou

Ama la sabiduría. Desea el conocimiento.

Aprender a Usar URL Schemes en iOS - URL Personalizada

| Comments

Las URL Schemes permiten a las aplicaciones comunicarse, enviar y recibir mensajes y ejecutar acciones entre si a través de una URL personalizada. Pongamos un ejemplo, tenemos una aplicación que permite mostrar direcciones en el mapa, pues podríamos usar URL Schemes para que cualquier aplicación pudiera abrir direcciones en el mapa de nuestra aplicación.

Apple también tiene sus propias URL Schemes y seguramente las habrás visto en acción en páginas web que contienen números de teléfono y estos aparecen como enlaces, y cuando presionas en ellos se lanza la aplicación teléfono que hace una llamada a ese número, pues bien, aquí se utiliza la URL tel:. También están mailto: (para el correo), sms: y peticiones con http para los mapas y la aplicación de YouTube.

Registrando nuestra URL Scheme

Nosotros vamos a definir nuestra propia URL y para hacer esto hay 2 formas. La primera es a través del fichero info.plist. Como ya sabéis, este fichero esta compuesto por pares key-valor, así que añadimos una nueva key llamada CFBundleURLTypes (Al presionar enter aparecerá ”URL types”). Veremos que es un array de diccionarios y solo contiene uno y dentro una key llamada ”URL Identifier” (Su nombre original es CFBundleURLName), cuyo valor puede ser cualquiera, Apple recomienda que para que sea completamente único podríamos usar el de nuestro Bundle Identifier, en el caso de la app de ejemplo de este tutorial es: com.thxou.scheme.

Ahora agregamos a este diccionario una nueva key llamada CFBundleURLSchemes para definir el nombre de nuestra URL, al presionar enter su nombre cambiará a ”URL Schemes”. En este array de strings vamos a definir nuestras URL (Porque puede haber más de una) poniendo el nombre con el que queremos que se abra nuestra app. Al poner el nombre hay que tener en cuenta 2 cosas:

  1. Cuidar que el nombre no sea uno de los ya definidos por Apple, ya que ellos dan prioridad a las aplicaciones nativas antes que a la tuya.
  2. Cuidar que el nombre no sea el de cualquier otra aplicación, el SO actualmente no sabe como reconocer cual es la aplicación a la que pertenece el URL Scheme, por lo tanto puede que ninguna App se abra.

El esquema final debe lucir más o menos así:

Si ahora mismo escribes scheme:// en Safari, se abrirá inmediatamente la aplicación.

La segunda forma es más fácil. Ir a la raíz del proyecto, seleccionar el target de nuestra aplicación, luego la pestaña Info y al final de todo veremos el apartado URL Types, desde aquí también podemos añadir nuevas URL Schemes presionando el botón de abajo llamado Add y seleccionando Add URL Type.

Recibiendo la URL

Como en principio se abrirá la aplicación y no hará nada, vamos a pasarle información en esa URL y a mostrarla en la vista principal. El encargado de manipular la URL que viene desde afuera es el delegado de la aplicación (el AppDelegate de toda la vida) y para hacer esto necesita implementar el método application:openURL:sourceApplication:annotation. La secuencia que sigue la aplicación cuando se le pide que abra una URL es la siguiente:

Este es el proceso cuando la aplicación no está abierta. Si está abierta la única posibilidad es que esté en background, así que en vez de la parte de inicialización, se ejecuta el método applicationWillEnterForegound:, esto se debe a que se necesita que la aplicación esté ejecutándose en primer plano, entonces la aplicación es pasada a este estado y luego es ejecutado el método application:openURL:sourceApplication:annotation.

Para no hacer las cosas más complicadas vamos a pasar simples textos a través de la URL, es solo para mostrar el funcionamiento de este sistema. La URL que vamos a ejecutar desde Safari va a ser: scheme://cualquiercosa/parametro1/parametro2. Ahora nos toca implementar el método correspondiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    // comprobamos que se ha recibido una url
    if ([[url scheme] isEqualToString:@"scheme"])
    {
        // obtenemos el host de la url. En este caso será "cualquiercosa"
        NSString *urlHost = [url host];
        // obtenemos el path de la url por partes. No se cuenta el host
        NSArray *urlComponents = [url pathComponents];
        // componemos el string a mostrar
        NSString *texto = [NSString stringWithFormat:@"Contenido de la URL:\n\nHost: %@\nParámetros:\n1. %@\n2. %@", urlHost, urlComponents[1], urlComponents[2]];

        // lanzamos un alertView que nos muestre el string
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL Scheme"
                                                        message:texto
                                                       delegate:self
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
        [alert show];
    }
    else {
        // si no hay URL retornamos NO
        return NO;
    }
    return YES;
}

Después de esto, desde cualquier aplicación pueden enviar información a tu aplicación que tu puedas manipular con solo ejecutar este código desde un botón:

1
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"scheme://cualquiercosa/parametro1/parametro2"]];

No solo he querido explicar como trabajar con esto, sino también un poco de lo que ocurre detrás, últimamente me estoy aficionando a eso e igual me alargo un poco en los artículos, pero es necesario saber de que va la cosa para aprender bien. A por el próximo : ).

Comments