¿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.
UIDocumentInteractionController
UIActivityViewController
Acceso compartido al llavero
Esquema de URL personalizado
Servicio web
API de iCloud
UIDocumentInteractionController:
Disponibilidad: iOS 3.2+
Pros:
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:
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:
Disponibilidad: iOS 3.0+
Pros:
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:
Disponibilidad: iOS 3.0+
Pros:
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:
Servicio web:
Disponibilidad: iOS 2.0+
Pros:
Contras:
Referencia
fuente
UIPasteboard
API también.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.
Ahora tienes que crear dos aplicaciones. Nombre de muestra
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.
Gracias a Apple por compartir elementos desde la funcionalidad de sus propias aplicaciones . Codificación feliz. :)
fuente
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:
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
myDefaults
o 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.
fuente
¿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:
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.
fuente
NSData
.Puede utilizar el 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
fuente
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.
fuente
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.
fuente
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!
fuente
No. Debería utilizar alguna solución en la nube.
fuente