2017-08-10 3 views
0

Erstellen eines heute widget und ich bin mit UserDefaults(suiteName:) einige Daten beharren. In der Hauptanwendung verwende ich UserDefaults.standard(). Dies kann nicht durch die Erweiterung gelesen werden (oder kann es?), Weshalb ich den suiteName: Konstruktor verwende.Teilen UserDefaults zwischen Erweiterungen

Daten, die Benutzer UserDefaults.standard() in der Hauptanwendung bestehen muss in der Verlängerung zur Verfügung stehen.

Zu dieser Zeit ich beide persistierenden bin so dass die Werte

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

Frage geteilt werden soll mir UserDefaults.standard() alle zusammen fallen sollte und UserDefaults(suiteName:) nur in meiner Anwendung verwenden, oder ist dies schlechte Praxis und wenn ja, Warum?

Edit: Ich verwende eine Behältergruppe App. Zur Klärung frage ich, ob ich Standard() durch suiteName ersetzen soll: während meines gesamten Projekts?

+1

wenn Sie Ressourcen teilen zwischen der Erweiterung und der App wollen, ist der beste Weg um eine _App-Gruppe_ zu erstellen und nur den gemeinsamen 'UserDefault' (nach' -SuiteName: ') oder den Standard' FileManager' (nach '-forSecurityApplicationGroupIdentifier:') zu verwenden - Sie benötigen möglicherweise nicht die Standard-Benutzervorgaben oder den Datei-Manager länger (Wenn Sie jedoch sichergehen möchten, dass Sie Daten von der Erweiterung isolieren möchten, können Sie diese Sandboxen weiterhin verwenden). – holex

+0

Danke das half – RyanTCB

Antwort

4

Sie können die gemeinsame UserDefaults nicht verwenden, um Daten zwischen A pp Extension und Host App zu teilen. Sie müssen App Group verwenden, d. H. Einen freigegebenen Container UserDefaults(suiteName:), um Daten zu teilen.

Auch wenn eine App-Erweiterung Bündel verschachtelt ist innerhalb seiner App Bundle, die laufende App-Erweiterung enthält, und enthält App haben keine direkten Zugang zu den jeweiligen Behältern des anderen.

Um die gemeinsame Nutzung von Daten zu ermöglichen, verwenden Sie Xcode oder das Entwicklerportal, um die App-Gruppen für die enthaltene App und die darin enthaltenen App-Erweiterungen zu aktivieren. Registrieren Sie als Nächstes die App-Gruppe im Portal und geben Sie die App-Gruppe an, die in der entsprechenden App verwendet werden soll.

Nachdem Sie App-Gruppen aktiviert haben, können eine App-Erweiterung und ihre App beide die NSUserDefaults-API verwenden, um den Zugriff auf Benutzer Präferenzen zu teilen. Um diese Freigabe zu aktivieren, verwenden Sie die Methode initWithSuiteName: method , um ein neues NSUserDefaults-Objekt zu instanziieren und den Bezeichner der freigegebenen Gruppe zu übergeben.

Weitere finden Sie unter: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

Wie App Gruppen verwenden: https://github.com/pgpt10/Today-Widget

Standard oder SuitName?

Verwenden Standard eines für Daten, die nur für die Host-App ist. Verwenden Sie suiteName für Daten, die Sie zwischen Extension und Host App freigeben möchten. Nur nicht die gleichen Daten in beiden beibehalten. Vermeiden Sie Datenredundanz. Verwenden Sie beide entsprechend dem Kontext.

+0

Entschuldigung Ich nahm an, dass, während ich 'initSuiteName:' benutzte, dass es bereits den Eindruck erwecken würde, dass ich eine App-Gruppe benutzte. Was ich bin. OQ aktualisiert, um dies zu verdeutlichen. Danke – RyanTCB

+0

Also, was ist das Problem, das Sie gegenüberstehen? – PGDev

+0

Ich bin aktuell und behalte dieselben Daten sowohl für Standard- als auch für SuiteName-Konstruktoren. Sollte ich einfach Standard() fallen lassen und SuiteName verwenden. – RyanTCB

1

Ein einfaches Beispiel:

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() 

und man kann es rot später:

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

}