Compartir datos entre dos o más aplicaciones de iPhone

¿Es posible compartir datos entre dos aplicaciones en el mismo dispositivo?

¿O puedo permitir que otra aplicación use la información / datos de mi aplicación o de otra manera?

Por ejemplo, la primera aplicación es para la administración de eventos, y la utilizo para guardar algún evento. La segunda aplicación es para recordatorios, que obtendrán datos de la otra aplicación para recordarme sobre el evento.

Este es solo un ejemplo simple, no es un escenario real.

Históricamente, el iPhone ha intentado evitar el intercambio de datos entre aplicaciones. La idea era que si no podías acceder a los datos de otra aplicación, no podrías hacer nada malo con esa aplicación.

En versiones recientes de IOS, han aflojado un poco. Por ejemplo, la guía de progtwigción de iOS ahora tiene una sección sobre pasar datos entre aplicaciones al hacer que una aplicación reclame un determinado prefijo de URL y luego tener otras aplicaciones que hagan referencia a esa URL. Por lo tanto, quizás configure su aplicación de eventos para que responda las URL de “evento: //” de la misma forma que un servidor web responde para las URL “http: //”.

La documentación de Apple de ese enfoque está aquí .

Eche un vistazo en “Implementación de esquemas de URL personalizados”.

En el mundo de la zona de pruebas de iOS, compartir datos de desarrollo entre aplicaciones puede resultar difícil. Como los desarrolladores de iOS no pueden compartir datos directamente a través del sistema de archivos , necesitan encontrar soluciones alternativas para sus aplicaciones. Algunas soluciones comunes incluyen:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Acceso Compartido a Llaveros

  • Esquema de URL personalizado

  • Servicio web

  • API iCloud


UIDocumentInteractionController:

Permite al usuario abrir un documento en cualquier otra aplicación que se registre como capaz de manejar un documento particular Identificador de Tipo Uniforme (UTI) .

El UIDocumentInteractionController se ha utilizado en el pasado como un medio para abrir un documento en otras aplicaciones en el dispositivo, por ejemplo, abrir archivos adjuntos de correo electrónico desde la aplicación de Correo.

UIDocumentInteractionController

Lamentablemente, la interfaz de usuario de UIDocumentInteractionController muestra solo seis aplicaciones .

No puede garantizar que su aplicación aparezca en la lista. Si bien el UIDocumentInteractionController no se ha desaprobado, UIActivityViewController proporciona un reemplazo más flexible desde iOS 6.0.

Disponibilidad: iOS 3.2+

Pros:

  • Permite compartir tipos de datos comunes con una amplia gama de aplicaciones.

Contras:

  • Permite el control del tipo de datos enviados al UIDocumentInteractionController, pero no a los destinos.

  • Requiere interacción del usuario adicional.

  • La cantidad limitada de destinos de datos puede hacer que su aplicación no se muestre en la lista.


UIActivityViewController:

Permite al usuario realizar una serie de acciones con una matriz de datos.

Por ejemplo, pueden imprimir, enviar por correo electrónico, copiar, publicar en las redes sociales o abrir en otra aplicación.

Puede crear sus propias subclases de UIActivity para proporcionar servicios personalizados al usuario.

UIActivityController

Disponibilidad: iOS 6.0+

Pros:

  • Ideal para compartir tipos de datos comunes con una amplia gama de aplicaciones y redes sociales.

  • Puede suministrar una variedad de elementos para la aplicación a una actividad. Los objetos deben cumplir con el protocolo UIActivityItemSource.

  • Tiene la capacidad de establecer tipos de actividad excluidos.

  • La interfaz de usuario de megafonía permite más destinos de datos que UIDocumentInteractionController.

Contras:

  • Debe definir un tipo de actividad personalizado para restringir los destinos “Abrir en …” de tipos de datos comunes.

  • Requiere interacción del usuario adicional.


Acceso Compartido a Llaveros:

Le permite almacenar de forma segura datos en un llavero compartido al que pueden acceder otras aplicaciones que son parte de un conjunto de aplicaciones.

Todas las aplicaciones que comparten acceso a llavero deben usar el mismo prefijo de ID de aplicación.

Para un ejemplo de acceso compartido de llavero en acción. Vea el código de muestra GenericKeychain de Apple .

Llavero compartido

Disponibilidad: iOS 3.0+

Pros:

  • Acceso seguro a los datos.

Contras:

  • Solo puede compartir datos entre aplicaciones que comparten un prefijo de ID de aplicación común.

  • La API de Keychain en el simulador de iOS proviene de OS X, que tiene una API diferente a la del dispositivo iOS.


Esquema de URL personalizado:

Permite que los datos pasen entre las aplicaciones usando URL simples.

Esquema de URL personalizado

Disponibilidad: iOS 3.0+

Pros:

  • No se requiere conexión de red.
  • Ideal para pequeñas cantidades de datos que puede codificar fácilmente en una URL legal escapada.

Contras:

  • Debe codificar datos en una URL legal escapada.

    Nota: la encoding base64 ha visto un uso común convirtiendo datos serializables en un valor de cadena. Sin embargo, las cadenas base64 pueden incluir caracteres que no son válidos para su uso en las URL. Puede considerar usar base64url. Consulte Base 64 Encoding con URL y nombre de archivo Safe Alphabet para obtener más información.


iCloud API:

Todo el mundo sabe acerca de lo que es iCloud, Pros y Contras, así que no hay más explicación para eso.

Pero uno podría preguntarse cómo es posible compartir datos entre aplicaciones dentro de un único dispositivo. Hay algunas soluciones para lograr eso.

iCloud

Es posible porque el identificador que se utiliza para iCloud es diferente del identificador de paquete, por lo que es posible compartir imágenes, videos y otros documentos.

Para saber más vea la discusión sobre este tema


Servicio web:

Sincronización de datos a través de un tercero (por ejemplo, Dropbox) o servicio web personalizado.

servicio web

Disponibilidad: iOS 2.0+

Pros:

  • Útil para compartir y distribuir grandes cantidades de datos.

Contras:

  • Requiere una conexión de red.
  • Sobrecarga de implementación del servicio web.

Referencia

Desde iOS 8 he accedido con éxito a la misma carpeta al usar ” Funcionalidad de grupo de aplicaciones. Estoy ampliando la respuesta de @siejkowski.

Nota: Funcionará solo desde la misma cuenta de desarrollador.

Para eso debes seguir los pasos a continuación.

  1. primero Habilite “Grupos de aplicaciones” desde su cuenta de desarrollador.
  2. Generar perfil de provisión y usarlo.

Ahora tienes que crear dos aplicaciones. Nombre de muestra

  1. Demo_Share_One
  2. Demo_Share_Two

Ahora estamos copiando imágenes de Demo_Share_One a la carpeta Compartir que se crea de forma predeterminada cuando habilita Grupos de aplicaciones y ejecuta la aplicación. y accederá a todas esas imágenes de Demo_Share_Two .

Tienes que tomar el nombre del grupo que se configuró para tu cuenta de desarrollador. Los elementos dicen group.filesharingdemo .

Agregue el método Abajo en Ambas aplicaciones para obtener la ruta relativa de la URL compartida de la carpeta.

 - (NSString *) getSharedLocationPath:(NSString *)appGroupName { NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName]; return [groupContainerURL relativePath]; } 

Ahora estamos copiando imágenes del paquete de Demo_Share_One

 -(IBAction)writeImage:(id)sender { for (int i = 0; i<15; i++) { NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"hd%d",i+1] ofType:@"jpg"]; NSString *strDestinationPath = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d",i+1]] ; BOOL filewrite = [[NSFileManager defaultManager]copyItemAtPath:strSourcePath toPath:strDestinationPath error:nil]; if (filewrite) NSLog(@"File write"); else NSLog(@"can not write file"); } } 

Ahora en Demo_Share_Two para acceder a esas imágenes

 NSString *pathShared = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d.jpg",number]]; NSLog(@"%@",pathShared); //BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:pathShared]; imgView.image = [UIImage imageWithContentsOfFile:pathShared]; 

Y ahora Obtendrá todas las imágenes que escriba desde Demo_Share_One .

De ahora en adelante, si desea compartir esta carpeta dos su tercera aplicación. solo agrega esa aplicación en tu grupo. Por lo tanto, es muy fácil acceder a los mismos elementos en Sus múltiples aplicaciones.

si no habilita los Grupos de aplicaciones en su AppID, obtendrá [self getSharedLocationPath: @ "group.filesharingdemo"] null.

Gracias a Apple por Share Elements desde la funcionalidad de tu propia aplicación . Feliz Codificación. 🙂

Desde iOS 8 puedes compartir datos fácilmente entre aplicaciones siempre que estén en el grupo de aplicaciones común.

La documentación de Apple lo explica mejor en el contexto de Extensiones: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Básicamente, necesitas:

  1. Defina ID de grupo de aplicaciones (en la sección de Certificados, identificadores y perfiles del Centro de miembros para su Progtwig de desarrollador de Apple).
  2. Habilite la función Grupos de aplicaciones especificando la ID del Grupo de aplicaciones anterior para cada aplicación que necesite comunicarse (se puede hacer en Xcode: Destino -> Capacidades o en Centro de miembros ).
  3. Utilice una de las dos API para el acceso al contenedor compartido.

La primera API se basa en NSUserDefaults :

 NSString *appGroupId = @"group.my.group.id"; NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:appGroupId]; [myDefaults setObject:@"foo" forKey:@"bar"]; 

La segunda API se basa en NSFileManager . Es simplemente una carpeta compartida a la que puede acceder después de obtener su url:

 NSString *appGroupId = @"group.my.group.id"; NSURL *sharedFolderURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId]; 

Todo lo que coloque en myDefaults o en la carpeta apuntada por sharedFolderURL estará visible y será accesible para todas sus aplicaciones.

En el caso de una carpeta, escriba / lea atómicamente solo para asegurarse de que no haya interlockings.

¿Compartir datos entre aplicaciones es posible? ¡Sí lo es!

Use UIPasteBoard disponible desde iOS 3.0, la documentación está disponible aquí . Apple dice:

La clase UIPasteboard permite que una aplicación comparta datos dentro de la aplicación o con otra aplicación usando pasteboards de todo el sistema o específicos de la aplicación.

También es posible compartir datos entre las aplicaciones en el llavero, aunque los datos están principalmente destinados a ser contraseñas y todo lo que se puede serializar se puede almacenar. Aquí hay una pregunta sobre el Desbordamiento de stack sobre eso.

Puede usar un esquema de URL personalizado para acceder a los datos de una aplicación a otra. Siga el enlace mencionado a continuación para obtener más información –

http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

Mencione que compartir datos entre aplicaciones a través de UIPasteBoard solo funciona para aplicaciones en el mismo grupo de aplicaciones en iOS7. Como dice la manzana:

+ [UIPasteboard pasteboardWithName: create:] y + [UIPasteboard pasteboardWithUniqueName] ahora es único el nombre de stack para permitir que solo aquellas aplicaciones en el mismo grupo de aplicaciones accedan al portapapeles. Si el desarrollador intenta crear una mesa de trabajo con un nombre que ya existe y que no forman parte del mismo paquete de aplicaciones, obtendrá su propia mesa de trabajo única y privada. Tenga en cuenta que esto no afecta al sistema proporcionado en las tablas de empaque, generales y de búsqueda.

Puede usar https://github.com/burczyk/Camouflage para leer y escribir NSData en iOS Camera Roll como archivo .bmp y compartirlo entre aplicaciones 🙂

¡Nueva solución!

Si no le importa golpear la red, puede implementar un servicio web personalizado para hacerlo, o usar algún servicio en la nube. iCloud en sí mismo no será de mucha utilidad aquí; solo le permite compartir datos entre la misma aplicación en diferentes dispositivos. Puedes leer sobre iCloud aquí .

Sin utilizar la red, puede aprovechar el “cambio rápido de aplicaciones ” para transferir una cantidad limitada de datos entre aplicaciones a través de la encoding URL. La cantidad real de datos transferibles no lo sé, pero sería muy limitado, estoy seguro.

Las respuestas de JugsteR y baudot son las mejores en este caso.

No. Tendría que usar alguna solución en la nube.