Comparta datos entre dos o más aplicaciones de iPhone

79

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

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

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

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

Kamleshwar
fuente

Respuestas:

38

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

En versiones recientes de IOS, lo han aflojado un poco. Por ejemplo, la guía de programación de iOS ahora tiene una sección sobre el paso de datos entre aplicaciones al hacer que una aplicación reclame un determinado prefijo de URL y luego hacer que otras aplicaciones hagan referencia a esa URL. Entonces, quizás configure su aplicación de eventos para que responda a las URL "event: //" de la misma manera que un servidor web responde a las URL "http: //".

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

Eche un vistazo a "Implementación de esquemas de URL personalizados".

baudot
fuente
Gracias, esto es exactamente lo que estoy buscando.
Kamleshwar
¿Se pueden compartir grandes datos de esa manera, por ejemplo, archivos?
AlikElzin-kilaka
2
Si está leyendo hasta ahora, asegúrese de verificar la respuesta de @siejkowski a continuación, ya que está más actualizada.
mahboudz
1
La respuesta de @ chintan-maddy-ramani también es digna de mención.
mahboudz
2
Sí, se han agregado muchas formas mejores desde que escribí esta respuesta. ¡La vieja pregunta tiene la vieja respuesta!
baudot
103

En el mundo aislado del desarrollo de iOS, compartir datos entre aplicaciones puede resultar difícil Dado que 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 al llavero

  • Esquema de URL personalizado

  • Servicio web

  • API de iCloud


UIDocumentInteractionController:

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

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

UIDocumentInteractionController

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

No puede garantizar que su aplicación aparezca en la lista. Si bien UIDocumentInteractionController no ha quedado obsoleto, UIActivityViewController proporciona un reemplazo más flexible a partir de iOS 6.0.

Disponibilidad: iOS 3.2+

Pros:

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

Contras:

  • Permite controlar el tipo de datos enviados al UIDocumentInteractionController, pero no los destinos.

  • Requiere interacción adicional del usuario.

  • Un número limitado de destinos de datos puede hacer que su aplicación no aparezca 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:

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

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

  • Tiene la capacidad de establecer tipos de actividades excluidas.

  • La interfaz de usuario de paginación 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 adicional del usuario.


Acceso compartido al llavero:

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

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

Para un ejemplo de acceso compartido a llavero en acción. Consulte 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 llavero 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 aplicaciones mediante URL simples.

Esquema de URL personalizado

Disponibilidad: iOS 3.0+

Pros:

  • No se requiere conexión a la red.
  • Excelente para pequeñas cantidades de datos que puede codificar fácilmente en una URL legal y de escape.

Contras:

  • Debe codificar los datos en una URL legal de escape.

    Nota: la codificación base64 ha tenido un uso común al convertir datos serializables en un valor de cadena. Sin embargo, las cadenas base64 pueden incluir caracteres que no son válidos para su uso en URL. Podría considerar usar base64url. Consulte Codificación Base 64 con URL y Alfabeto seguro para nombres de archivo para obtener más información.


API de iCloud:

Todo el mundo sabe qué es iCloud, sus pros y sus 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 solo dispositivo; existen algunas soluciones para lograrlo.

iCloud

Es posible porque el identificador que se usa para iCloud es diferente del identificador del 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:

Sincronice datos a través de un tercero (por ejemplo, Dropbox) o un 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.
  • Gastos generales de implementación de servicios web.

Referencia

Durai Amuthan.H
fuente
3
me gusta la respuesta extensa y el uso de gráficos
coolharsh55
1
Deberías mencionar UIPasteboardAPI también.
Evgeny Karkan
@EvgenyKarkan - Siéntase libre de editar la publicación :)
Durai Amuthan.H
54

Desde iOS 8 Accedo 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, debe seguir los pasos a continuación.

  1. Primero habilite "Grupos de aplicaciones" desde su cuenta de desarrollador.
  2. Generar perfil de aprovisionamiento. y utilícelo.

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 los Grupos de aplicaciones y ejecuta la aplicación. y accederá a todas esas imágenes desde Demo_Share_Two .

Debe tomar el nombre del grupo que se configuró en su cuenta de desarrollador. group.filesharingdemo .

Agregue el método a continuación en Ambas aplicaciones para obtener la ruta relativa de la URL de la carpeta para compartir.

- (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 de Demo_Share_One .

Entonces, de ahora en adelante, si desea compartir esta carpeta, será su tercera aplicación. solo agrega esa aplicación en tu grupo. Por lo tanto, es demasiado 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"] es nulo.

Gracias a Apple por compartir elementos desde la funcionalidad de sus propias aplicaciones . Codificación feliz. :)

ChintaN -Maddy- Ramani
fuente
s / getSharedLocationPath: / sharedLocationPathForAppGroup: / :-)
Ivan Vučica
1
@ChintaN -Maddy- Ramani ¿puede la ruta de ubicación compartida contener una base de datos sqlLite o realm? ¿Se necesitarían extensiones para esto?
user2363025
@ user2363025 Quizás sí. Puedes probar. Solo probé con imágenes. tal vez puedas copiar la base de datos allí.
ChintaN -Maddy- Ramani
@ ChintaN-Maddy-Ramani. Recibo el siguiente error: Domain = NSCocoaErrorDomain Code = 512 "El archivo“ 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA ”no se pudo guardar en la carpeta“ AppGroup ”." UserInfo = {NSFilePath = / private / var / mobile / Contenedores / Shared / AppGroup / 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA, NSUnderlyingError = {0x282202250 Código de error = Dominio NSPOSIXErrorDomain = 21 "es un directorio"}}
Anand Prakash
comprobar stackoverflow.com/questions/32778691/…
ChintaN -Maddy- Ramani
18

Desde iOS 8, puede 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 las extensiones: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Básicamente, necesitas:

  1. Defina el ID del grupo de aplicaciones (en la sección Certificados, identificadores y perfiles del Centro de miembros para su Programa de desarrolladores de Apple.
  2. Habilite la capacidad de Grupos de aplicaciones especificando el ID de grupo de aplicaciones anterior para cada aplicación que necesite comunicarse (se puede hacer en Xcode: Target -> Capabilities o en Centro de miembros ).
  3. Utilice una de las dos API para acceder a contenedores compartidos.

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 ponga dentro myDefaultso la carpeta señalada porsharedFolderURL será visible y accesible para todas sus aplicaciones.

En el caso de la carpeta, escriba / lea atómicamente solo para asegurarse de que no haya puntos muertos.

siejkowski
fuente
Seguí tus pasos y obtengo una URL compartida. pero cómo poner Imagen en ese camino. agrego el nombre de mi imagen y escribo datos. luego trato de recuperar pero no pude recuperar la imagen.
ChintaN -Maddy- Ramani
Lo logré escribir todas las imágenes de app1 y recuperar todas las imágenes de app2 usando el grupo de aplicaciones. Gracias . +1 :).
ChintaN -Maddy- Ramani
¿Puedo hacer que una aplicación de terceros se una a mi grupo (por elección), o todas las aplicaciones tienen que ser de la misma cuenta de desarrollador?
DwarDoh
@DwarDoh tiene que ser de la misma cuenta de desarrollador.
ChintaN -Maddy- Ramani
14

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

Utilice UIPasteBoard disponible desde iOS 3.0, la documentación está disponible aquí . Los documentos de Apple dicen:

La clase UIPasteboard permite que una aplicación comparta datos dentro de la aplicación o con otra aplicación utilizando tableros para pegar en todo el sistema o específicos de la aplicación.

También es posible compartir datos entre aplicaciones en el llavero, aunque los datos están destinados principalmente a ser contraseñas y tal, cualquier cosa serializable podría almacenarse. Aquí hay una pregunta de Stack Overflow sobre eso.

JugsteR
fuente
¡Excelente! Parece una forma viable de compartir datos entre aplicaciones.
trusktr
1
UIPasteboard parece una buena solución para compartir datos pequeños, como copiar y pegar cadenas. ¿Existe una opción para compartir archivos entre aplicaciones?
AlikElzin-kilaka
1
@ AlikElzin-kilaka sí, también es compatible NSData.
Evgeny Karkan
3

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 único el nombre de pila para permitir que solo aquellas aplicaciones en el mismo grupo de aplicaciones accedan a la mesa de trabajo. Si el desarrollador intenta crear una mesa de trabajo con un nombre que ya existe y no es parte de la misma suite de aplicaciones, obtendrá su propia mesa de trabajo única y privada. Tenga en cuenta que esto no afecta a las tablas de madera proporcionadas por el sistema, en general y a buscar.

MasterBeta
fuente
¿Qué quiere decir Apple con el "mismo grupo de aplicaciones"?
Magic Bullet Dave
2
@MagicBulletDave Aplicaciones que tienen el mismo ID de semilla de paquete.
MasterBeta
La clase UIPasteboard permite que una aplicación comparta datos dentro de la aplicación y con otra aplicación. Para compartir datos con cualquier otra aplicación, puede utilizar paneles de trabajo en todo el sistema; para compartir datos con otra aplicación que tenga el mismo ID de equipo que su aplicación, puede utilizar paneles de trabajo específicos de la aplicación.
prueba el
2

Si no le importa acceder a la red, puede implementar un servicio web personalizado para hacerlo o utilizar algún servicio en la nube. iCloud en sí 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 codificación URL. No sé la cantidad real de datos transferibles, pero estoy seguro de que sería muy limitada.

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

QED
fuente
Hola, psoft, ¿puedes resumir más sobre el uso compartido de iCloud que has explicado aquí en dos líneas
Vinayaka Karjigi
Leí que el ID de iCloud no tiene que coincidir con el ID de paquete de la aplicación y, por lo tanto, compartir iCloud sería una opción.
prueba el
Es posible transferir 64kB de datos dentro de una URL estándar. Realmente funciona bien. Si no tiene demasiados datos, puede cifrar / base64 para mayor seguridad.
igraczech
2

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!

Kamil
fuente
idea creativa ... agradable
MoralCode
-4

No. Debería utilizar alguna solución en la nube.

dbrajkovic
fuente
Hasta donde yo sé, iCloud está diseñado para sincronizar datos en un dispositivo con otros dispositivos. Si conoces alguna forma de compartir los datos entre aplicaciones en un dispositivo, por favor compártelo.
Durai Amuthan. H
2
dbarjkovic, tiene razón, podríamos usar una solución en la nube para sincronizar datos entre aplicaciones, ya que el identificador utilizado para iCloud es diferente del identificador del paquete y es totalmente posible. aquí hay un enlace para verificar que stackoverflow.com/a/8882763/730807 . voto positivo por su respuesta.
Durai Amuthan. H
¿Por qué se rechaza esta respuesta? Esta es la respuesta correcta, pero necesita tener más detalles de la documentación y dar algunos ejemplos
Basheer_CAD