iOS 8 a révélé hier une nouvelle API concernant les groupes d'applications. C'était un peu compliqué avant de partager des données et de communiquer entre les applications et je pense que c'est précisément ce que les groupes d'applications sont censés corriger.
Dans mon application, j'ai activé les groupes d'applications et ajouté un nouveau groupe, mais je ne trouve pas de documentation sur la façon de l'utiliser. La documentation et les références API indiquent uniquement comment ajouter un groupe.
Alors, à quoi servent vraiment les groupes d'applications? Y a-t-il une documentation quelque part sur la façon de l'utiliser?
la source
Partage de données NSUserDefaults entre plusieurs applications
Pour partager les valeurs par défaut entre une application et une extension ou entre 2 applications, vous devez ajouter un groupe d'applications dans vos paramètres en suivant les étapes suivantes:
Remarque: si vous accédez au portail des développeurs Apple (le site Web Apple qui affiche tous vos certificats, identifiants, appareils et profils d'approvisionnement) et accédez à Identificateurs> Groupes d'applications, vous devriez voir ce nouveau groupe d'applications.
Pour stocker des données:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")! userDefaults.setObject("user12345", forKey: "userId") userDefaults.synchronize()
Pour récupérer des données:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") if let testUserId = userDefaults?.objectForKey("userId") as? String { print("User Id: \(testUserId)") }
la source
Les groupes d'applications, selon mon interprétation de la documentation existante, sont principalement ciblés pour les extensions, plus précisément pour les widgets. Les widgets sont leur propre ensemble d'applications qui coexistent avec votre application. Comme il s'agit d'une application distincte et qu'il possède donc son propre bac à sable, vous devrez utiliser des groupes d'applications pour partager des fichiers.
Après quelques greffes d'en-tête, je pense que j'ai trouvé l'API nécessaire, mais elle a en fait été intégrée dans iOS 7.
NSFileManager
a une méthode surcontainerURLForSecurityApplicationGroupIdentifier:
laquelle vous pouvez transmettre l'identifiant que vous avez créé lors de l'activation des groupes d'applications pour vos applications:NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
la source
NSUserDefaults
au travail. Je craie jusqu'à bêta 1 bug.NSUserDefaults
base de données. Voyez ma réponse.Un piège important dans lequel j'ai puisé aujourd'hui est le suivant:
Dans de nombreux projets, j'ai vu une seule cible d'application et différents identifiants de bundle définis pour chaque configuration de cette cible. Ici, les choses se compliquent. L'objectif des développeurs était de créer une application de débogage pour la configuration de débogage et une application de production pour la cible de publication.
Si vous le faites, les deux applications partageront les mêmes NSUserDefaults lorsqu'elles sont configurées comme suit
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") userDefaults!.setObject("user12345", forKey: "userId") userDefaults!.synchronize()
Cela pose des problèmes dans de nombreux endroits:
La solution à ce problème en général est de préfixer les clés par défaut avec la configuration actuelle construite. Vous pouvez détecter facilement la configuration au moment de l'exécution en définissant différents identificateurs de bundle pour vos configurations. Ensuite, lisez simplement l'identifiant du bundle à partir de
NSBundle.mainBundle()
. Si vous avez les mêmes identifiants de bundle, vous devez définir différentes macros de préprocesseur comme#ifdef DEBUG NSString* configuration = @"debug"; #elif RELEASE NSString* configuration = @"release"; #endif
Dans Swift, ce sera presque le même:
#if DEBUG let configuration = "debug" #elseif RELEASE let configuration = "release" #endif
la source
NSUserDefaults.standardUserDefaults()
pour les données qui ne doivent pas être partagées.Ranger
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")! shared.setObject("abc.png", forKey: "favEmoji") shared.synchronize()
la source