Общие UserDefaults между приложением и добавлением не работают правильно

Итак, я просматривал и следил за всеми шагами, чтобы правильно настроить общие UserDefaults, но я должен что-то пропустить.

У меня есть возможности групп приложений, которые активируются как для моего приложения, так и для моего расширения. Оба используют одно и то же имя пакета ("group.TestSharedPreferences"), и я пишу следующим образом:

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

В viewDidLoad:

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

И читать:

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

Даже используя synchronize() сразу после установки "INT", значение, полученное в расширении, не является тем, которое было сохранено в приложении-контейнере. Любые идеи о том, что я могу потерять? Спасибо!

Ответ 1

Я бы порекомендовал здесь пошагово копать.

Во-первых, убедитесь, что как основное приложение, так и расширение виджета включены в группу приложений и используют одно и то же и активируются (флажок должен быть установлен) имя группы приложений:

Главное приложение: Главное приложение

Сегодня расширение виджета:

Today Widget Extension

Затем выполните простой тест с прямым доступом/получить доступ. В основном приложении AppDelegate.didFinishLaunchingWithOptions (измените имя группы приложений и ключи на свои нужды):

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

В окне просмотра текущего виджетов ViewController:

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

Если это работает, проблема должна быть связана с вашим Preferences singleton.