2016-10-16 7 views
10

So habe ich mich umgesehen und alle Schritte zum Einrichten freigegebener UserDefaults richtig, aber ich sollte etwas verpassen.Shared UserDefaults zwischen App und Extension funktioniert nicht richtig

Ich habe die Funktion App Groups sowohl in meiner App als auch in meiner Erweiterung aktiviert. Beide verwenden die gleiche Suite Name ("group.TestSharedPreferences") und ich schreibe diese Weise:

struct Preferences { 
    static let shared = UserDefaults(suiteName: "group.TestSharedPreferences")! 
} 

Auf viewDidLoad:

Preferences.shared.set(1, forKey: "INT") 

Und zu lesen:

Preferences.shared.integer(forKey: "INT") // Returns 1 in Container App 
Preferences.shared.integer(forKey: "INT") // Returns 0 in Today Extension 

Auch synchronize() nur nach der Verwendung von "INT" Einstellung Der in der Erweiterung abgerufene Wert ist nicht der in der Container-App gespeicherte Wert. Irgendwelche Ideen zu was könnte ich vermissen? Vielen Dank!

+0

Enthält die Berechtigungsdatei für beide Ziele diese App-Gruppe? –

+0

Ich würde erwarten, dass "0" zurückgegeben wird, wenn der Wert für diesen Schlüssel "Null" ist. Dies scheint also ein Zeichen dafür zu sein, dass Sie 'Preferences.shared' nicht korrekt im heutigen Erweiterungscode definieren oder der heutige Erweiterungscode _before_ heißt, bevor die App die Chance hat, den Wert zu setzen. – matt

+0

Mögliches Duplikat von [Kommunizierende und persistente Daten zwischen Apps mit App-Gruppen] (http://stackoverflow.com/questions/24015506/communicating-and-persisting-data-between-apps-with-app-groups) – Maetschl

Antwort

9

Ich würde empfehlen, hier Schritt für Schritt zu graben.

Stellen Sie zunächst sicher, dass sowohl der Haupt-App und die Widget Erweiterung App Gruppe Funktion aktiviert haben und verwenden den gleichen und aktiviert ist (das Häkchen muss eingestellt werden) App Gruppennamen:

Haupt App: Main App

Heute Widget Erweiterung:

Today Widget Extension

Dann machen Sie einen einfachen Test mit direkter Einstellung/Zugriff bekommen. In Ihrem Haupt AppDelegate.didFinishLaunchingWithOptions Methode der App (den Namen App Gruppe ändern und die Schlüssel zu Ihrem Bedarf):

if let userDefaults = UserDefaults(suiteName: "group.de.zisoft.GPS-Track") { 
    userDefaults.set("test 1" as AnyObject, forKey: "key1") 
    userDefaults.set("test 2" as AnyObject, forKey: "key2") 
    userDefaults.synchronize() 
} 

in Ihrem Heute Widget Erweiterung des Viewcontroller:

if let userDefaults = UserDefaults(suiteName: "group.de.zisoft.GPS-Track") { 
    let value1 = userDefaults.string(forKey: "key1") 
    let value2 = userDefaults.string(forKey: "key2") 
    ... 
} 

Wenn dies funktioniert, muss das Problem in Zusammenhang steht in Ihrem Preferences Singleton.

+0

Okay, das schien zu arbeiten, aber ich fing an, diese Warnung erhalten: Fehler beim Lesen von Werten in CFPrefsPlistSource <....>. Also habe ich am Ende meinen group.XXXX Standardnamen geändert und funktioniert aus irgendeinem Grund jetzt richtig. Trotzdem Danke! – iDeC

+0

Ich hatte das gleiche Problem und einfach wie @iDeC gelöst, indem ich einen neuen sharedContainer erstelle. Und dann hat alles funktioniert. – sambro

Verwandte Themen