Today Extension iOS Swift 5

Делаю в своем приложение виджет для iOS и описываю процесс.

Dima Biserov
5 min readJan 12, 2019

English Version

Финальный результат.

Без лишних слов — к делу

Добавляем Today Extension в проект

Для этого нужно перейти в меню File > New > Target:

Product name — именно это название увидит пользователь когда будет добавлять ваш виджет, как локализовать info.plist покажу ниже.
Далее активируем схему

Теперь у нас в проекте появились следующие файлы

Как можно догадаться, это такой же контроллер и сториборд как и в нашем главном приложение

Можно уже запустить проект, и увидеть работу виджета, Hello World — это сама Apple добавляет по умолчанию, а не я)

Теперь давайте локализуем название виджета:

Создаем новый String File

Называем его, допустим, InfoPlist.

Выбираем наш новый файл и нажимаем, Localize…

Далее выбираем, например, Russian

После чего ставим галочку напротив English

Должно получится вот так:

И теперь, наконец локализуем

Высота виджета

Что бы виджет можно было раскрыть

Добавляем в viewDidLoad()

Но что бы заработало нужно так же добавить метод

Эта функция срабатывает каждый раз, когда пользователь нажимает на кнопку Больше/Меньше(Show more/Less)

Высота compact 110

Высота expanded может быть от 110 до 440

Еще на заметку

  1. Избегайте scrollview в любых проявлениях
  2. Виджет не поддерживает ввод данных с клавиатуры
  3. Виджет должен быть “легким”
  4. Если виджет будет медленно запускаться, его убьет система
  5. Лимит по памяти всего 16 мб, из-за этого можно увидеть Unable to Load (невозможно загрузить), но чаще эта надпись означает что у вас крашится виджет, просто xCode об этом не сообщает, ищите ошибки в контролере.
  6. Вы можете создавать сколько угодно виджетов, под разные цели и для удобства пользователя.

Передача информации

Для меня загадка почему виджет не работает как часть приложения и соотвественно не видит ни глобальных переменных, ни классов, ничего.

Передавать информацию в виджет я буду с помощью UserDefaults ( можно и через Core Data, возможно дополню заметку потом, когда самому понадобится)

Что бы виджет увидел UserDefaults переданные из основного приложения:

Добавляем новую группу

Должно получится так

Далее переходим в target виджета и активируем схему там

Кстати, что бы установить поды в виджет, Podfile должен выглядеть так

Я использую ультра удобный под для констрейтов EasyPeasy, рекомендую

Вернемся к UserDefaults. В AppDelegate в методе, когда приложение будет свернуто или закрыто я добавляю следующий код, как видите suiteName это имя нашей группы

После чего в контроллере виджета получаю информацию

testLabel добавил для теста

C помощью пода сделать лейбл по центру экрана крайне просто и удобно.

И даже все работает 🤟

Теперь сделаем что бы клику например в таблице перекидывало на нужный нам экран в приложение.

Для этого нам нужно создам новую URL схему:

Я назвал ее PORSCHE, потому что, почему бы и нет (моя любимая машина)

Далее в месте где вы пользователь нажимает кнопку (или ячейку в таблице)

Как видите, в ссылку я дополнительно передаю уникальный id человека, что бы потом понять, кого мне нужно показать

Далее идем в AppDelegate приложения

Если у схемы имя PORSCHE, то есть наша, то далее я вытаскиваю число(id), которое находится в url.absoluteString, вот и всё! 🥁

Надеюсь кому-то чем-то поможет :) Сам разбирался по ходу дела и писал эту заметку )

PS: Мой канал по свифтовым заметкам в телеграме @SwiftBox

--

--

Dima Biserov
Dima Biserov

Written by Dima Biserov

Ни в коем случае не претендую на супер-пупер разработчика, здесь просто сборник полезной информации для меня и знакомых, если она была полезна и вам — its good

No responses yet