¿Cómo compartir datos con aplicaciones que contengan NSUserDefaults? – Widget Widget de hoy

Estoy tratando de crear un widget de extensión de hoy que muestra los datos almacenados en el widget.

Esto es lo que he hecho;

  • Nuevo destino de widget de hoy añadido
  • Configurar UIViewController para widget
  • Habilitar grupos de aplicaciones para la aplicación y la extensión

Ahora he llegado a un bloque de path, no estoy seguro de la mejor manera de recuperar y mostrar una simple matriz de datos buscados.

Hay muy pocos tutoriales de Swift y, a menudo, no usan datos básicos.

En el proyecto de la aplicación principal, busco la matriz.

let moc = (UIApplication.shanetworkingApplication().delegate as! AppDelegate).managedObjectContext let request = NSFetchRequest(entityName: "Objects") do { try self.objectsArray = moc.executeFetchRequest(request) as! [Objects] } catch { } 

¿Cómo puedo usar NSUserDefaults para almacenar la matriz de objects y luego usarla en la extensión de widget de hoy? O incluso una matriz de valores de cadena.

1) Obtenga url a su database

 var containerPath: String = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier‌​(YOUR_SECURITY_APP_GROUP).path var sqlitePath: String = "(containerPath)/("database.sqlite")" 

2) Cree un coordinador de tienda persistente como lo hace en la aplicación principal.

3) Configurarlo para su context de object gestionado

 context = NSManagedObjectContext() context.persistentStoreCoordinator = coordinator 

4) Recupera objects como lo haces en tu aplicación principal

 let moc = context let request = NSFetchRequest(entityName: "Objects") do { try self.objectsArray = moc.executeFetchRequest(request) as! [Objects] } catch {} 

Si configura los Grupos de aplicaciones correctos y agregó el mismo grupo para la Aplicación y la Extensión, puede usar NSUserDefaults. Solo por ejemplo, para escribir algo de la aplicación, necesita:

 static func setShanetworkingScoreNumber(score: Int) { let defaults = UserDefaults(suiteName: "group.bubblewrapShanetworkingDefaults") // this is the name of the group we added in "App Groups" defaults?.set(String(score), forKey: "score") defaults?.synchronize() } 

Y para leer en la extensión de hoy:

 private func getScore() -> String { let defaults = UserDefaults(suiteName: "group.bubblewrapShanetworkingDefaults") defaults?.synchronize() return String(describing: defaults!.object(forKey: "score") ?? "0") } 

Aquí está la guía completa de cómo hacerlo.