2017-08-10 4 views
0

Création d'un widget Aujourd'hui et j'utilise UserDefaults(suiteName:) pour conserver certaines données. Dans l'application principale, j'utilise UserDefaults.standard(). Cela ne peut pas être lu (ou peut-il?) Par l'extension qui est pourquoi j'utilise le constructeur suiteName:.Partage de UserDefaults entre les extensions

Les données que l'utilisateur conserve à UserDefaults.standard() dans l'application principale doivent être disponibles dans l'extension.

A cette époque, je suis persistant à la fois pour que les valeurs peuvent être partagées

UserDefaults.standard().set:...forKey:... 
UserDefaults(suiteName:...)().set:...forKey:... 
... 

La question est dois-je déposer UserDefaults.standard() tous ensemble et il suffit d'utiliser UserDefaults(suiteName:) dans ma demande, ou est cette mauvaise pratique, et si oui Pourquoi?

Modifier: J'utilise un conteneur de groupe d'applications. Pour clarifier, je demande si je dois juste remplacer standard() par suiteName: tout au long de mon projet?

+1

si vous souhaitez partager des ressources entre l'extension et l'application, la meilleure façon est pour créer un _App Group_ et utiliser le 'UserDefault 'partagé (par' -suiteName: ') ou le' FileManager' par défaut (par '-forSecurityApplicationGroupIdentifier:') seulement - vous n'avez pas besoin des standards par défaut ou du gestionnaire de fichiers plus long (mais si vous devez être sûr que vous voulez isoler les données de l'extension, vous pouvez toujours utiliser ces sandbox). – holex

+0

Merci cela aidé – RyanTCB

Répondre

4

Vous ne pouvez pas utiliser partagé UserDefaults pour partager des données entre et A pp Extension et ses Host App. Vous devez utiliser App Group, c'est-à-dire un conteneur partagé UserDefaults(suiteName:) pour partager des données.

Même si un groupe d'extension d'application est imbriqué dans son contenant l'ensemble de application, l'extension de l'application en cours d'exécution et contenant l'application n'ont pas accès direct aux conteneurs les uns des autres.

Pour activer le partage de données, utilisez Xcode ou le portail des développeurs pour activer les groupes d'applications pour l'application contenant et ses extensions d'application. Ensuite, enregistrez le groupe d'applications dans le portail et spécifiez le groupe d'applications à utiliser dans l'application contenant.

Après avoir activé les groupes d'applications, une extension d'application et son application contenant peuvent utiliser l'API NSUserDefaults pour partager l'accès aux préférences de l'utilisateur . Pour activer ce partage, utilisez la méthode initWithSuiteName: pour instancier un nouvel objet NSUserDefaults, en transmettant l'identifiant du groupe partagé.

Pour en savoir plus, consultez: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

Comment utiliser les groupes App: https://github.com/pgpt10/Today-Widget

Standard ou SuitName?

Utilisez un standard pour les données réservées à l'application hôte. Utilisez suiteName pour les données que vous souhaitez partager entre l'extension et l'application hôte. Juste ne pas persister les mêmes données dans les deux. Evite la redondance des données. Utilisez les deux en fonction du contexte.

+0

Excuses Je supposais que comme j'utilisais 'initSuiteName:' que cela donnerait déjà l'impression que j'utilisais un groupe App. Ce que je suis. OQ mis à jour pour clarifier cela. Merci – RyanTCB

+0

Alors, quel est le problème que vous rencontrez? – PGDev

+0

Je suis en train de persister les mêmes données pour les constructeurs standard et suiteName. Dois-je simplement supprimer standard() et utiliser suiteName. – RyanTCB

1

Un exemple simple:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
userDefaults.set("test 1" as AnyObject, forKey: "key1") 
userDefaults.set("test 2" as AnyObject, forKey: "key2") 
userDefaults.synchronize() 

et vous pouvez le rouge plus tard:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
let value1 = userDefaults.string(forKey: "key1") 
let value2 = userDefaults.string(forKey: "key2") 
... 

}