Совместное использование UserDefaults между расширениями
создание виджета сегодня, и я использую UserDefaults(suiteName:)
для сохранения некоторых данных. В основном приложении я использую UserDefaults.standard()
. Это невозможно прочесть (или можно?) по расширению, поэтому я использую suiteName:
конструктор.
данные, которые пользователь сохраняет в UserDefaults.standard()
в главном приложении должно быть доступно в расширении.
в это время я настаиваю на обоих, чтобы значения могли быть разделены
UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...
вопрос в том, должен ли я упасть UserDefaults.standard()
все вместе и просто используйте UserDefaults(suiteName:)
в моем приложении, или это плохая практика, и если да, то почему?
Edit: я использую контейнер группы приложений. Для уточнения я спрашиваю, должен ли я просто заменить standard() на suiteName: на протяжении всего моего проекта?
2 ответов
вы не можете использовать shared 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#//apple_ref/doc/uid/TP40014214-CH21-SW1
как использовать группы приложений:https://github.com/pgpt10/Today-Widget
Standard или SuitName?
используйте стандартный для данных, которые только для хост-приложения. Используйте suiteName для данных, которыми вы хотите поделиться между расширением и хост-приложением. Просто не сохраняйте одни и те же данные в обоих. Избежать избыточности данных. Используйте оба в соответствии с контекстом.
простой пример:
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")
...
}