iOS 8 reveló ayer una nueva API sobre grupos de aplicaciones. Antes era un poco complicado compartir datos y comunicarse entre aplicaciones y creo que eso es precisamente lo que los grupos de aplicaciones intentan corregir.
En mi aplicación, habilité los grupos de aplicaciones y agregué un grupo nuevo, pero no puedo encontrar ninguna documentación sobre cómo usarlo. La documentación y las referencias de API solo indican cómo agregar un grupo.
Entonces, ¿qué es lo que realmente pretenden hacer los grupos de aplicaciones? ¿Hay alguna documentación en alguna parte sobre cómo usarlo?
fuente
Compartir datos de NSUserDefaults entre varias aplicaciones
Para tener valores predeterminados compartidos 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:
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)") }
fuente
Los grupos de aplicaciones, según mi interpretación de la documentación existente, están destinados principalmente a extensiones, más específicamente, a widgets. Los widgets son su propio paquete de aplicaciones que coexisten con su aplicación. Dado que son una aplicación separada y, por lo tanto, tienen su propia caja de arena, deberá usar Grupos de aplicaciones para compartir archivos.
Después de algunas grep'ing de encabezados, creo que encontré la API necesaria, pero en realidad se instaló como parte de iOS 7.
NSFileManager
tiene un método en el quecontainerURLForSecurityApplicationGroupIdentifier:
puede pasar el identificador que creó al activar Grupos de aplicaciones para sus aplicaciones:NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
fuente
NSUserDefaults
a trabajar. Me refiero al error Beta 1.NSUserDefaults
base de datos. Mira mi respuesta.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 pretendían los desarrolladores era 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 configuradas así
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") userDefaults!.setObject("user12345", forKey: "userId") userDefaults!.synchronize()
Esto causa problemas en muchos lugares:
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 estableciendo diferentes identificadores de paquete para sus configuraciones. Luego, lea el identificador de paquete de
NSBundle.mainBundle()
. Si tiene los mismos identificadores de paquete, debe configurar 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
fuente
NSUserDefaults.standardUserDefaults()
para datos que no deben compartirse.Para almacenar
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")! shared.setObject("abc.png", forKey: "favEmoji") shared.synchronize()
fuente