ios - Comunicación y persistencia de datos entre aplicaciones con grupos de aplicaciones
objective-c ios8 (5)
Los grupos de aplicaciones, según mi interpretación de la documentación existente, están destinados principalmente a extensiones, más específicamente, para widgets. Los widgets son su propio paquete de aplicaciones que coexisten con su aplicación. Como se trata de una aplicación independiente y, por lo tanto, tienen su propia zona de pruebas, deberá usar grupos de aplicaciones para compartir archivos.
Después de un encabezado grep''ing, creo que encontré la API necesaria, pero en realidad fue incluida como parte de iOS 7.
NSFileManager
tiene un método en él containerURLForSecurityApplicationGroupIdentifier:
donde puedes pasar el identificador que creaste al activar Grupos de aplicaciones para tus aplicaciones:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
iOS 8 reveló una nueva API ayer sobre grupos de aplicaciones. Antes era un poco complicado compartir datos y comunicarnos entre aplicaciones, y creo que eso es precisamente lo que se pretende corregir con los Grupos de aplicaciones.
En mi aplicación, he habilitado Grupos de aplicaciones y agregado un nuevo grupo, pero no puedo encontrar ninguna documentación sobre cómo usarlo. La documentación y las referencias API solo indican cómo agregar un grupo.
Entonces, ¿qué es realmente lo que los Grupos de aplicaciones tienen la intención de hacer? ¿Hay algún tipo de documentación sobre cómo usarlo?
Una trampa importante que aproveché hoy es la siguiente:
En muchos proyectos, vi un solo objetivo de aplicación y con diferentes identificadores de paquete establecidos para cada configuración de ese objetivo. Aquí las cosas se complican. Lo que los desarrolladores intentaron fue crear una aplicación de depuración para la configuración de depuración y una aplicación de producción para el objetivo de lanzamiento.
Si lo hace, ambas aplicaciones compartirán los mismos NSUserDefaults cuando estén configurados como tal
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Esto causa problemas en muchos lugares:
- Imagine que estableció SÍ para una tecla cuando se le mostró al usuario una aplicación de introducción de pantalla especial. La otra aplicación ahora también leerá SÍ y no mostrará la introducción.
- Sí, algunas aplicaciones también almacenan tokens OAuth en sus valores predeterminados de usuario. De todos modos ... Dependiendo de la implementación, la aplicación reconocerá que hay un token y comenzará a recuperar datos utilizando el token equivocado. Existe la posibilidad de que esto falle con errores extraños.
La solución a este problema en general es prefijar las claves predeterminadas con la configuración actual construida. Puede detectar la configuración fácilmente en tiempo de ejecución configurando diferentes identificadores de paquetes para sus configuraciones. Luego solo lea el identificador del paquete de NSBundle.mainBundle()
. Si tiene los mismos identificadores de paquete, necesita establecer diferentes macros de preprocesador, como
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
En Swift se verá casi igual:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
Almacenar
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
Compartir datos NSUserDefaults entre varias aplicaciones
Para poder compartir los valores predeterminados entre una aplicación y una extensión o entre 2 aplicaciones, debe agregar un grupo de aplicaciones en su configuración mediante los siguientes pasos:
- En Project Navigator, haga clic en el archivo * .xcodeproj (debe estar en la parte superior).
- A la derecha del Navegador de proyectos, busque Proyecto y Objetivos. Debajo de los objetivos, haga clic en su objetivo principal (debe ser lo primero en Destinos).
- Hacia la parte superior, haz clic en la pestaña Capacidades.
- En la sección Grupos de aplicaciones, haga clic en el botón a la derecha para activar Grupos de aplicaciones.
- Haga clic en el botón + y agregue un grupo de aplicaciones llamado group.com.company.myApp .
- Vaya al mismo lugar en sus otras aplicaciones y este grupo ahora debería estar disponible para seleccionar. Active este grupo para cada aplicación que utilizará estos datos compartidos.
Nota: Si va al Portal de Desarrolladores de Apple (el sitio web de Apple que muestra todos sus Certificados, Identificadores, Dispositivos y Perfiles de Aprovisionamiento) y va a Identificadores> Grupos de Aplicaciones, debería ver este nuevo Grupo de Aplicaciones.
Para almacenar datos:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Para recuperar datos:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String {
print("User Id: /(testUserId)")
}
Otro beneficio para los Grupos de aplicaciones es la posibilidad de compartir una base de datos NSUserDefaults
. Esto también funciona para las extensiones de aplicaciones (widgets del centro de notificaciones, teclados personalizados, etc.).
Inicialice su objeto NSUserDefaults
así en todas las aplicaciones en el grupo de aplicaciones y compartirán la base de datos:
C objetivo:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Rápido:
NSUserDefaults(suiteName: "<group identifier>")
Tenga en cuenta que todo lo de la base de datos [NSUserDefaults standardUserDefaults]
para cada aplicación no se transferirá a esta base de datos.
La documentation proporciona también un ejemplo correcto (A partir de Beta 3).
Y no te olvides de sincronizar la base de datos:
[yourDefaults synchronize];