Usando AirDrop en nuestras apps para transferir archivos entre dispositivos sin necesidad de terceros

Recientemente nos surgió la necesidad de compartir datos de nuestra aplicación iKaizen entre distintos dispositivos. Dado que el entorno habitual de uso de esta herramienta suele ser en entornos industriales, necesitábamos que esta transferencia de datos no dependiese de ningún dispositivo, servidor, router, etc. a parte de los propios iPads.

Para poder resolver esta necesidad decidimos hacer uso de la función AirDrop incluida por defecto en los dispositivos Apple. Esta funcionalidad nos permite intercambiar cualquier tipo de fichero entre dos dispositivos apple simplemente teniendo encendido el WiFi (sin necesidad de estar conectado a ninguna red) y el bluetooth.

Lo primero que necesitamos para poder usar AirDrop es crear el fichero que queremos compartir. Para ello, todos los datos que queremos introducir en el fichero los convertimos al tipo NSData.

    NSData *kaizenFileData = [NSKeyedArchiver archivedDataWithRootObject:self.sharedObject];

Después de esto creamos el nombre del archivo (nombredelkaizen.ikaizen) y la ruta al archivo en el sandbox de la aplicación:

    NSString *fileName = [kaizenName stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    fileName = [NSString stringWithFormat:@"%@.ikaizen", fileName]; 
    NSString *dataPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName]; 
    dataPath = [NSString stringWithFormat:@"file:/%@", dataPath]; 
    NSString *outputDirectory = [NSString stringWithFormat:@"%@", NSTemporaryDirectory()]; 
    NSString *path = [outputDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", fileName]];

Creamos la url a partir de la ruta para que la funcionalidad AirDrop pueda acceder al archivo:

    NSURL *url = [NSURL fileURLWithPath:path];

Y por último creamos el archivo:

   [kaizenFileData writeToFile:path atomically:YES];

Una vez que hemos hecho todo esto, simplemente queda mostrar el UIActivityViewController con las opciones para compartir el archivo. Para crearlo lo hacemos de la siguiente forma, usando la url creada anteriormente:

    UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:@[url] applicationActivities:nil];

Dicho controlador tiene una propiedad “excludedActivityTypes”, en la que podemos indicar que opciones de compartición no queremos que se muestren en él, en nuestro caso, por ejemplo, vamos a quitar las opciones de imprimir y copiar al portapapeles así como las de compartir en las redes sociales:

    NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
                                    UIActivityTypePostToWeibo,
                                    UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
                                    UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
                                    UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
                                    UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
    controller.excludedActivityTypes = excludedActivities;

Para finalizar ya solo queda mostrarlo para que el usuario decida como compartirlo:

    [viewController presentViewController:controller animated:YES completion:nil];

A partir de este momento es el sistema operativo el que se encarga de realizar la transferencia de datos, notificando al dispositivo que otro dispositivo quiere enviarle un archivo. Si queremos que al recibir el archivo el dispositivo nos dé la opción de abrirlo con la app iKaizen, previamente tenemos que añadir la siguiente configuración en el proyecto de Xcode (archivo Info.plist):

airdrop

Mediante esta configuración, estamos informando al sistema operativo de que existe una nueva extensión de archivo (.ikaizen) y que dichos achivos se abren con la app iKaizen. Una vez hecho esto, al recibir mediante AirDrop (o email, messages, etc.) un archivo de este tipo, el sistema operativo nos dará la opción de abrirlo con nuestra app.

Por último para que la app que recibe el archivo sea capaz de recibir el fichero, debemos añadir el siguiente método al AppDelegate:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        if (url){
            [[KZAirDropManager manager] didReceiveData:[NSData dataWithContentsOfURL:url]];
        }
        return YES;
    }

Este método es llamado justo después de pulsar “Abrir con iKaizen” y nos pasa la url donde podemos encontrar el archivo enviado desde el otro dispositivo. Lo único que queda por hacer es obtener los datos del archivo y tratarlos como proceda.

Como podréis comprobar, AirDrop es una manera muy cómoda de intercambiar archivos, dada la independencia de terceros que nos proporciona,su rapidez y su sencilla implementación, 100% recomendable!.

Deja un comentario

¿Necesitas una estimación?

Calcula ahora