IOS 9

Universal Link IOS (Objective-C & Swift)

Muchas de las aplicaciones Móviles de hoy día son respaldadas por un cliente web donde el usuario que no tenga la aplicación pueda disfrutar del producto en si, un ejemplo de ellos es amazon que tienen una aplicación móvil y a su vez tiene una pagina web, al hacer click en una url (Universal Link) de amazon esta tendrá la posibilidad de abrir el navegador web con la pagina deseada o abrir la aplicación móvil y mostrar el contenido.

En IOS Se pueden manejar varios tipos de urls con esquemas personalizados (miapp://section/test) por el developer y ser manejados dentro de IOS, un ejemplo es que podemos intercomunicar nuestros widgets con nuestras apps con estos esquemas personalizados, ahora esto de Universal Link de IOS lo que nos ofrece es poder abrir nuestra aplicación desde http://myapp.com y poder tener opción tanto de que los usuarios entren al app móvil o al web.

Requisitos

1. Tener un app en el developer account de apple
2. Un Dominio
3. Tener acceso al servidor a donde apunta dicho dominio

Paso 1

Entrar a Developer apple, seleccionar el app id que vamos a modificar y activar la opción Associated Domains
app_id_2

app_id_1

Paso 2

Entrar a xcode y habilitar la opción de Associated Domains y colocar el dominio que queremos associar.

xcode_1

Paso 3

Objective C

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    
    //Verificar la url 
    NSURLComponents *urlComponent = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO]; // 1

    //www.mypage.com/page1
    if([urlComponents.path isEqualToString:@"/page1"]){

        //Mostrar 
        UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; // 2
        UIViewController *viewController = [rootViewController.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerIdentifier"]; // 3

        [rootViewController.presentingViewController dismissViewControllerAnimated:NO completion:^(){ // 4
          [rootViewController presentViewController:viewController animated:NO completion:nil];
        }];

        return YES;
    }

    return NO;
}

Swift

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {        
    let urlComponent = NSURLComponents(url: url, resolvingAgainstBaseURL: false)
    
    if(urlComponent?.path == "/page1"){
        let rootViewController = UIApplication.shared.keyWindow?.rootViewController
        let viewController = rootViewController?.storyboard?.instantiateViewController(withIdentifier: "view-Controller-Indetifier")
        
        rootViewController?.presentingViewController?.dismiss(animated: false, completion: {
            rootViewController?.present(viewController!, animated: false, completion: nil)
        })
    }
    
    return false
}

1. Dividir la url en componentes, y así tener acceso a queryParams y el path al cual se esta solicitando.
2. Obtener el root View Controller.
3. Instanciar la vista en particular que queremos abrir.
4. Mostrar la vista.

Con esto estaríamos terminando con lo que concierne a la aplicación, restaria solo la parte del servidor.

Paso 4

Para que el universal link funcione y la aplicación IPhone entienda que si puede abrir esa url es necesario subir un archivo (apple-app-site-association) a el root de nuestra url, cosa de que pueda ser accesado de la siguiente manera https://mysite.com/apple-app-site-association.

Formato del contenido del archivo:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "teamid.com.bundle.id",
                "paths": [
                    "*"
                ]
            }
        ]
    }
}

iOS_App_IDs_-_Apple_Developer

El componer este archivo es bien simple, el mismo no puede tener extension y el contenido debe de ser un JSON valido, donde se colocara el TeamID seguido del AppID del app en cuestión que queremos linkear con el site, podemos tener N cantidad de apps apuntando a nuestro site.

Nuestro servidor debe servir el archivo content-type application/json, aquí tendrían que hacer algo bien personalizado para que su web server pueda servir dicho archivo sin extension y con dicho content-type.

Una vez realizado todo esto, podemos verificar que nuestra configuración esta correcta podemos entrar a este site: Universal Link Validator y el mismo no ayudara con posible errores que tengamos.

Ya cuando nuestra aplicación este en el app store apple posee una herramienta para validar que todo este correcto y es esta: Apple Universal Link Validator

Referencia

Apple Universal Link Docs