Совместное использование 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")
...

}