Совместное использование UserDefaults между расширениями

Создаю виджет Сегодня, и я использую UserDefaults(suiteName:) сохранить некоторые данные. В основном приложении я использую UserDefaults.standard(), Это не может быть прочитано (или может ли это?) Расширением, поэтому я использую suiteName: конструктор.

Данные, которые пользователь сохраняет UserDefaults.standard() в основном приложении должно быть доступно в расширении.

В настоящее время я настаиваю на том, чтобы оба значения могли быть общими

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

Вопрос должен ли я бросить UserDefaults.standard() все вместе и просто использовать UserDefaults(suiteName:) в моем заявлении, или это плохая практика, и если да, то почему?

Изменить: я использую контейнер группы приложений. Для пояснения я спрашиваю, должен ли я просто заменить standard() на suiteName: на протяжении всего моего проекта?

7 ответов

Решение

Вы не можете использовать общий UserDefaults для обмена данными между и pp Extension И его Host App, Вы должны использовать App Group т.е. общий контейнер UserDefaults(suiteName:) обмениваться данными.

Несмотря на то, что пакет расширения приложения вложен в пакет, содержащий его приложение, работающее расширение приложения и содержащее приложение не имеют прямого доступа к контейнерам друг друга.

Чтобы включить общий доступ к данным, используйте XCode или портал разработчика, чтобы включить группы приложений для содержащего приложения и его расширений. Затем зарегистрируйте группу приложений на портале и укажите группу приложений для использования в содержащем приложении.

После включения групп приложений расширение приложения и содержащее его приложение могут использовать API NSUserDefaults для совместного доступа к пользовательским настройкам. Чтобы включить этот общий доступ, используйте initWithSuiteName: метод для создания нового объекта NSUserDefaults, передавая идентификатор общей группы.

Для получения дополнительной информации обращайтесь по адресу: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Как использовать группы приложений: https://github.com/pgpt10/Today-Widget

Стандарт или SuitName?

Используйте стандартный для данных, которые только для Host App. Используйте suiteName для данных, которыми вы хотите поделиться с Extension и Host App. Только не сохраняйте одни и те же данные в обоих. Избегайте избыточности данных. Используйте оба из них в соответствии с контекстом.

Убедиться App Groupsвключен для ВСЕХ ваших целей (ваших приложений и расширений) на вкладке Возможности

https://i.stack.imgur.com/KH2NW.png

А затем используйте идентификатор группы выше в качестве имени набора при созданииUserDefaults:

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

Простой пример:

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

и вы можете прочитать это позже:

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

Также убедитесь, что вы добавляете группы приложений в правильную конфигурацию (отладка, выпуск). Если вы добавите группы приложений в отладку для целевого приложения и попытаетесь использовать их в конфигурации выпуска для своего расширения, это не сработает.

Если вы добавляете конфигурацию отладки (для цели приложения), используйте ее в конфигурации отладки (для цели расширения)

PGDev: увеличение:

вы не можете избежать избыточности при перетаскивании настроек (предпочтений) https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html в расширение: они содержатся в частном приложении bundle и должны быть реплицированы в комплект с именем bundle, чтобы стать доступным для расширения приложения

Кроме того, убедитесь, что вы очистили и перестроили все приложение после добавления группы приложений.

Было потрачено много времени, и проблема заключалась в добавлении групп приложений только для конфигурации выпуска и, конечно же, во время тестирования конфигурации отладки - я не мог получить доступ к общим данным между расширением приложения и приложением-контейнером. Поэтому обязательно добавьте группы приложений в обе конфигурации — выпуск и отладку.

Другие вопросы по тегам