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