Today Extension iOS Swift 5
Делаю в своем приложение виджет для iOS и описываю процесс.
Без лишних слов — к делу
Добавляем Today Extension в проект
Для этого нужно перейти в меню File > New > Target:
Теперь у нас в проекте появились следующие файлы
Как можно догадаться, это такой же контроллер и сториборд как и в нашем главном приложение
Можно уже запустить проект, и увидеть работу виджета, Hello World — это сама Apple добавляет по умолчанию, а не я)
Теперь давайте локализуем название виджета:
Создаем новый String File
Называем его, допустим, InfoPlist.
Выбираем наш новый файл и нажимаем, Localize…
Далее выбираем, например, Russian
После чего ставим галочку напротив English
Должно получится вот так:
И теперь, наконец локализуем
Высота виджета
Что бы виджет можно было раскрыть
Добавляем в viewDidLoad()
Но что бы заработало нужно так же добавить метод
Эта функция срабатывает каждый раз, когда пользователь нажимает на кнопку Больше/Меньше(Show more/Less)
Высота compact 110
Высота expanded может быть от 110 до 440
Еще на заметку
- Избегайте scrollview в любых проявлениях
- Виджет не поддерживает ввод данных с клавиатуры
- Виджет должен быть “легким”
- Если виджет будет медленно запускаться, его убьет система
- Лимит по памяти всего 16 мб, из-за этого можно увидеть Unable to Load (невозможно загрузить), но чаще эта надпись означает что у вас крашится виджет, просто xCode об этом не сообщает, ищите ошибки в контролере.
- Вы можете создавать сколько угодно виджетов, под разные цели и для удобства пользователя.
Передача информации
Для меня загадка почему виджет не работает как часть приложения и соотвественно не видит ни глобальных переменных, ни классов, ничего.
Передавать информацию в виджет я буду с помощью UserDefaults ( можно и через Core Data, возможно дополню заметку потом, когда самому понадобится)
Что бы виджет увидел UserDefaults переданные из основного приложения:
Добавляем новую группу
Должно получится так
Далее переходим в target виджета и активируем схему там
Кстати, что бы установить поды в виджет, Podfile должен выглядеть так
Я использую ультра удобный под для констрейтов EasyPeasy, рекомендую
Вернемся к UserDefaults. В AppDelegate в методе, когда приложение будет свернуто или закрыто я добавляю следующий код, как видите suiteName это имя нашей группы
После чего в контроллере виджета получаю информацию
testLabel добавил для теста
C помощью пода сделать лейбл по центру экрана крайне просто и удобно.
И даже все работает 🤟
Теперь сделаем что бы клику например в таблице перекидывало на нужный нам экран в приложение.
Для этого нам нужно создам новую URL схему:
Я назвал ее PORSCHE, потому что, почему бы и нет (моя любимая машина)
Далее в месте где вы пользователь нажимает кнопку (или ячейку в таблице)
Как видите, в ссылку я дополнительно передаю уникальный id человека, что бы потом понять, кого мне нужно показать
Далее идем в AppDelegate приложения
Если у схемы имя PORSCHE, то есть наша, то далее я вытаскиваю число(id), которое находится в url.absoluteString, вот и всё! 🥁
Надеюсь кому-то чем-то поможет :) Сам разбирался по ходу дела и писал эту заметку )
PS: Мой канал по свифтовым заметкам в телеграме @SwiftBox