Так или иначе, но в виджеты необходимо передавать информацию из основного приложения. Это может быть все что угодно: от выбранного пользователем формата времени до полученных писем в почтовом клиенте. В этой статье я расскажу об основных способах передачи данных между таргетами приложения.
AppGroup
Таргет виджетов не является чем-то уникальным и работает примерно так же, как и остальные таргеты других app extensions. И для передачи информации по разным таргетам сначала надо добавить в приложение AppGroup. Во вкладке Signing & Capabilities основного таргета вашего проекта нужно нажать на кнопку + Capability и в новом окно выбрать App Groups. Хорошей практикой является назвать AppGroup как “group.” + buindle id приложения.
После этого можно добавить id
вашей AppGroups в константы, добавить файл констант в таргет виджетов и иметь доступ к id
везде, где понадобится, например, так:
Теперь мы готовы передавать данные между таргетами, и начнем с самого простого – UserDefaults
.
UserDefaults
UserDefaults
в Swift – это класс, который предоставляет возможность сохранять пары ключ-значение в пользовательскую встроенную базу данных. В нее можно сохранять значения разных типов данных – String, Bool, Data, Date, Array, Dictionary и проч. В основном UserDefaults
используются для хранения некоторых настроек приложения и/или пользовательских предпочтений, таких как выбранный формат времени и даты, темная или светлая тема приложения, если, конечно, приложение поддерживает это. Также еще в UserDefaults
можно хранить что-то важное для аналитики или отображения некоторых экранов, например, дату первой сессии приложения. И для того, чтобы была возможность использовать в разных таргетах сохраненные в UserDefaults
значения, нам надо их сохранять в главном таргете не в UserDefaults.standard
:
а в наш контейнер AppGroup:
И мы тогда сможем читать сохраненные данные в таргете виджета таким образом. Допустим, мы сохранили что-то типом String:
Вот так просто меняется работа с UserDefaults
и теперь мы можем через них передавать нужные нам данные в таргет виджета.
File Container
UserDefaults
отлично справляются с хранением чего-то небольшого, но если есть задача передать в таргет виджетов нечто большее, чем пользовательские настройки, а базы данных в приложении нет, то можно использовать File Container и хранить необходимые данные, например в .plist
-файле или в .json
-файле. Для этого нам надо создать нужный нам файл в File Container для нашей App Group и записать в него информацию:
И, соответственно, вот так можно читать эту информацию в таргете виджета:
CoreData
В большом количестве приложений используются CoreData для хранения данных, и для того, чтобы можно было ею пользоваться в таргете виджетов, надо создать общий CoreData контейнере в AppGroup:
И теперь мы можем получать наши данные в таргете виджета вот так:
Кроме CoreData, есть и другие базы данных, но принцип везде примерно одинаковый: можно добавить файлы базы данных в таргет виджета и уже в нем напрямую запрашивать необходимую информацию. Есть только одно но: виджеты ни в каком виде не поддерживают асинхронный код, то есть и запросы за данными надо будет делать синхронно.
Я постаралась подробно рассказать об основных способах передачи данных из основного таргета приложения в таргет виджетов. Надеюсь, что эта статья была полезной. Я буду рада фидбэку и комментариям. Спасибо!
Савицкая Надежда, iOS-разработчик.
Комментарии