Sitemap

Today Extension iOS Swift 5

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

5 min readJan 12, 2019

--

English Version

Press enter or click to view image in full size
Финальный результат.

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

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

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

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Product name — именно это название увидит пользователь когда будет добавлять ваш виджет, как локализовать info.plist покажу ниже.
Press enter or click to view image in full size
Далее активируем схему

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

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

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

Press enter or click to view image in full size
Press enter or click to view image in full size

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

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

Press enter or click to view image in full size

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

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

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

Press enter or click to view image in full size

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

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

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

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

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

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

Press enter or click to view image in full size
Press enter or click to view image in full size

Добавляем в 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 переданные из основного приложения:

Press enter or click to view image in full size

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

Press enter or click to view image in full size

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

Press enter or click to view image in full size

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

Press enter or click to view image in full size

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

Press enter or click to view image in full size

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

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

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

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

Press enter or click to view image in full size

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

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

Press enter or click to view image in full size

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

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

Press enter or click to view image in full size

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

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

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

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

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

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

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

--

--

Dima Biserov
Dima Biserov

Written by Dima Biserov

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

No responses yet