web-dev-qa-db-fra.com

Partage des paramètres par défaut entre les extensions

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 est-ce possible?) Par l'extension, c'est pourquoi j'utilise le constructeur suiteName:.

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

En ce moment, je persiste dans les deux pour que les valeurs puissent être partagées

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

La question est de savoir si je dois supprimer UserDefaults.standard() tous ensemble et utiliser simplement UserDefaults(suiteName:) dans mon application, ou est-ce une mauvaise pratique et si oui pourquoi?

Modifier: j'utilise un conteneur de groupe d'applications. Pour plus de précision, je demande si je dois simplement remplacer standard () par suiteName: tout au long de mon projet?

20
RyanTCB

Vous ne pouvez pas utiliser le partage UserDefaults.standard Pour partager des données entre une application hôte et son extension d'application. Vous devez à la place créer un conteneur partagé avec UserDefaults(suiteName:) pour partager des données.

Même si un ensemble d’extensions d’application est imbriqué dans le groupe d’applications qui le contient, l’extension d’application en cours d’exécution et l’application contenant n’ont aucun accès direct aux conteneurs respectifs.

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 contenues. Ensuite, enregistrez le groupe d'applications dans le portail et spécifiez le groupe d'applications à utiliser dans l'application conteneur.

Après avoir activé les groupes d'applications, une extension d'application et son application contenant peuvent toutes deux 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 plus d'informations, reportez-vous à: https://developer.Apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//Apple_ref/doc/uid/TP40014214-CH21-SW1

Comment utiliser les groupes d'applications: https://github.com/pgpt10/Today-Widget

Standard ou SuiteName?

Utilisez un standard pour les données uniquement pour l'application hôte. Utilisez suiteName pour les données que vous souhaitez partager entre l'extension et l'application hôte. Ne perdez pas les mêmes données dans les deux. Évitez la redondance des données. Utilisez les deux en fonction du contexte.

27
PGDev

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 pourrez le lire plus tard:

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

Assure-toi App Groups est activé pour [~ # ~] tous [~ # ~] de vos cibles (votre application et les extensions cibles) dans Onglet Capacités

enter image description here

Et puis utilisez l'identifiant du groupe ci-dessus comme nom de suite lorsque vous créez UserDefaults:

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")
5
Tai Le