Прокачайся в код-ревью: для первых 50 участников — курс бесплатный

время чтения: 3 мин

Как обхитрить документацию виджетов iOS? 4 практических способа

В документации iOS по виджетам прописаны не только возможности, но и ряд ограничений — однако для разработчиков это скорее челлендж, как их можно обойти. Частые обновления, анимации, прозрачность и интерактивность — на этих примерах iOS Developer Надзея Савицкая сравнивает документацию с реальностью и делится профессиональными лайфхаками.

iOS Developer Надзея Савицкая

Другие статьи автора:

— Более двух лет назад Apple представила виджеты, — вспоминает Надзея, — Сначала для Home Screen и вот совсем недавно — для Lock Screen.

Виджеты представляют собой некоторые дополнения к основному приложению. Их можно добавить на Home и/или Lock Screens, и, таким образом, некоторая важная информацию из приложения всегда будет под рукой, без необходимости заходить в основное приложение. Это может быть все, что угодно: погода, фотографии, последнее полученное сообщение или количество жизней в игре.

Если читать документацию по виджетам, то в каждой возможности упираешься в ограничения. Мир был бы скучен, если бы никто не пытался их обойти, а разработчики всегда пробуют выжать максимум из возможностей.

Частые обновления

— В документации написано: на виджеты выделяется ограниченное количество памяти, и обновлять их часто нельзя. Это самая интересная часть про ограничения виджетов, — считает Надзея, — Действительно, на виджеты выделяется мало памяти, этим процессом полностью управляет система iOS, и разработчики очень мало на что могут влиять. Частые обновления виджета «забивают» всю выделенную память, и виджет в какой-то момент просто перестает обновляться, пока система не решит очистить память для виджетов. Это происходит примерно раз в сутки, и это время зависит от использования виджета пользователем. Проще говоря, система несколько дней собирает данные, как часто пользователь смотрит на ваш виджет, и на основе этого строит график очистки памяти.

Надо разграничить, что обновления виджетов бывают разные по типу:

  1. Первый тип — это когда мы знаем наперед, с какой информацией обновить виджет. Сюда относятся виджеты с часами, календарем, обратным отсчетом, фотовиджеты.
  2. Второй — соответственно, когда не знаем. К нему относятся погодные виджеты, новостные виджеты, виджеты для почтовых приложений. Если хотите узнать подробней, почему есть такое различие, почитайте про работу Timeline Provider.

В попытках найти золотую середину, а именно — при каких максимально частых обновлениях виджет сможет работать сутки, — я опробовала на практике много комбинаций обновлений. Итого, для обновлений первого типа рабочий минимум — это обновление 1 раз в минуту, для обновлений второго типа — 1 раз в пять минут. Из этого следует, что все равно, как бы мы ни старались моментально обновлять виджеты, гарантировать стабильную работу мы не можем. Но и такая частота обновлений позволяет закрывать множество реальных задач.

Анимация

— В документации написано: виджеты статичны, никакие анимации не поддерживаются, — продолжает Надзея, — После прочтения этой фразы сразу хочется проверить: а насколько? Если я добавлю в виджет вместо .png картинки на бэкграунд .gif файл, то что будет? Ответ прост. Будет просто полностью черный виджет без какого-либо намека на анимацию, ну или хотя бы отображение даже статичного первого кадра анимации.

У меня есть хорошая и плохая новость относительно анимированных виджетов. Их сделать можно, но работать будут не долго. Для того что бы имитировать гифку на виджете, нам придется пойти на несколько хитростей:

  1. Мы будем поочередно показывать картинки, кадры анимации.
  2. Мы поставим обновление картинок один раз в 1 секунду.
  3. Будем наслаждаться анимацией на виджете, пока не заполнится память и система ее не обнулит примерно через сутки.

Да, решение наполовину рабочее, но все же возможное. Что не может не радовать.

Прозрачность (Home screen)

— В документации написано: в виджетах нельзя использовать картинки с прозрачностью. И действительно, прозрачность на картинке будет просто отображаться черным или белым цветом в зависимости от выбранной вами темы iOS. Но что нас остановит от попытки имитировать прозрачный фон у виджета на Home Screen? Конечно же, ничего. Нам всего лишь нужно следующее:

  1. Запросить у пользователя обои, которые сейчас стоят у него на Home screen.
  2. Запросить у пользователя место, где он хочет поставить виджет, например, верхний правый угол.
  3. Запросить у пользователя, какого размера он хочет установить виджет: маленький, большой или средний.
  4. Спросить у пользователя, какая у него модель телефона. От этого зависит точный размер виджета.
  5. Вырезать нужную часть его обоев и поставить ее как бэкграунд на виджет.

При установке такого виджета, если все было рассчитано правильно, будут совершенно незаметны границы виджета, и эффект прозрачности будет очень реальным.

Интерактивность

— В документации написано: виджеты не интерактивны, сделать в них кнопки, которые будут что-либо менять на самом виджете, нельзя. Но это не значит, что мы не можем вообще нажимать на виджеты.

По умолчанию, при нажатии на виджет открывается основное приложение, и разработчик может такое открытие отследить. А значит — и переопределить. Для маленьких Home Screen и всех Lock Screen виджетов можно переопределить нажатие на весь виджет. А вот в средние и большие Home Screen виджеты можно добавить несколько кнопок и по каждой из них сделать свои события. Какого рода события вообще можно делать в таком случае:

  1. Открывать в своем приложении нужный экран.
  2. Открывать другое приложение.
  3. Открывать какую-либо веб-страницу.
  4. Создавать заранее какой-то кастомный экшен через приложение Shortcuts и выполнять его.

— Да, сделать мини игру на виджете не получится, но и говорить, что виджет — это просто статичная картинка, не совсем верно, — подытоживает Надзея, — Я постаралась рассказать все о своем опыте обхода некоторых ограничений при работе с виджетами. Буду рада обратной связи!

Хочешь поделиться своим экспертным опытом — становись героем клуба!