EngX Code Review: почни писати код іще краще й побудуй ефективний процес код-рев’ю.

час читання: 3 хв

Як перехитрувати документацію віджетів iOS? 4 практичні поради

Документація iOS щодо віджетів містить дані не лише про можливості, а й про низку обмежень. Проте для розробників це радше челендж, щоб дізнатися, як їх можна обійти. Часті оновлення, анімації, прозорість та інтерактивність — на цих прикладах iOS-розробниця Надзея Савицька порівнює документацію з реальністю й ділиться професійними лайфхаками.

iOS-розробниця Надзея Савицька

Інші статті автора:

— Понад два роки тому Apple представила віджети, — пригадує Надзея, — спочатку для Home Screen (початкового екрана). І ось зовсім нещодавно — для Lock Screen (замкненого екрана).

Віджети — це певні доповнення до основного додатка. Їх можна додавати на початковий і/або замкнений екрани. Таким чином певна важлива інформація з додатка завжди буде під рукою, і вам не потрібно заходити в основний застосунок. Це може бути що завгодно: погода, фотографії, останнє отримане повідомлення чи кількість життів у грі.

Якщо читати документацію про віджети, то кожна можливість в ній закінчується обмеженням. Але життя було б нудне, якби ніхто не намагався обійти обмеження. І розробники завжди пробують отримати максимум із можливостей.

Часті оновлення

— У документації зазначено: на віджети виділяється обмежена кількість пам’яті, і оновлювати їх часто не можна. Ця частина про обмеження віджетів найцікавіша, — вважає Надзея. — Дійсно, на віджети виділяється мало пам’яті, цим процесом повністю керує система iOS, і розробники дуже мало на що можуть впливати. Уся виділена пам’ять «забивається» від частих оновлень, і в якийсь момент віджет просто більше не оновлюється, поки система не вирішить очистити пам’ять для нього. Це відбувається приблизно раз на добу, і цей час залежить від того, як користувач взаємодіє з віджетом. Простими словами, система кілька днів збирає дані про те, як часто користувач дивиться на ваш віджет, і на основі цього будує графік очищення пам’яті.

Треба розуміти, що оновлення віджетів бувають різних типів:

  1. Перший тип — це коли ми знаємо заздалегідь, з якою інформацією треба оновити віджет. Сюди належать віджети з годинником, календарем, зворотним відліком, фотовіджети.
  2. Другий — відповідно, коли не знаємо. До нього належать віджети погоди, новин, поштових додатків тощо. Якщо хочете дізнатися докладніше, чому є така відмінність, почитайте про роботу Timeline Provider.

У спробах знайти золоту середину, а саме — за яких максимально частих оновлень віджет зможе працювати добу, — я випробувала на практиці багато комбінацій оновлень. Загалом для оновлень першого типу робочий мінімум — це оновлення раз на хвилину, для оновлень другого типу — раз на п’ять хвилин. Це означає, що як би ми не намагалися моментально оновлювати віджети, гарантувати стабільної роботи ми не можемо. Але й така частота оновлень дає змогу закривати безліч реальних завдань.

Анімація

— У документації зазначено: віджети статичні, жодних анімацій не підтримується, — продовжує Надзея. — Після прочитання цієї фрази відразу хочеться перевірити: а наскільки? Якщо я додам у віджет замість картинки .png на бекграунд файл .gif, що станеться? Відповідь проста. Буде просто повністю чорний віджет без жодного натяку на анімацію, ну або щонайменше відображення статичного першого кадру анімації.

Я маю хорошу й погану новину щодо анімованих віджетів. Їх зробити можна, але працюватимуть вони недовго. Щоб імітувати гіфку на віджеті, нам доведеться піти на кілька хитрощів:

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

Так, рішення робоче наполовину, але все ж можливе. Це не може не тішити.

Прозорість (Home screen)

— У документації зазначено: у віджетах не можна використовувати картинки з прозорістю. Дійсно, прозорість на картинці буде просто відображатися чорним або білим кольором залежно від теми iOS, що ви обрали. Але що нас зупинить від спроби імітувати прозоре тло у віджета на Home screen? Звичайно ж, нічого. Нам потрібно зробити наступне:

  1. Запитати в користувача шпалери, які зараз стоять у нього на початковому екрані.
  2. Запитати в користувача місце, де він хоче бачити віджет, наприклад, верхній правий кут.
  3. Запитати в користувача, якого розміру він хоче встановити віджет: маленький, великий або середній.
  4. Запитати в користувача, яка в нього модель телефона. Від цього залежить точний розмір віджета.
  5. Вирізати потрібну частину його шпалер і встановити її як бекграунд на віджет.

Після встановлення такого віджета, якщо все було розраховано правильно, межі віджета будуть абсолютно непомітні, і ефект прозорості буде дуже реальним.

Інтерактивність

— У документації зазначено: віджети не інтерактивні, зробити в них кнопки, які будуть щось міняти на самому віджеті, не можна. Але це не означає, що ми не можемо натискати на віджети взагалі.

За замовчуванням після натискання на віджет відкривається основний додаток, і розробник може відстежити таке відкриття. А отже — перепризначити. Для маленьких віджетів на початковому екрані й усіх віджетів на замкненому екрані можна перепризначити натискання на весь віджет. А ось у середні й великі віджети на початковому екрані можна додати кілька кнопок і за кожною з них закріпити свої події. Якого роду події взагалі можна робити в такому разі:

  1. Відкривати у своєму додатку потрібний екран.
  2. Відкривати інший додаток.
  3. Відкривати певну вебсторінку.
  4. Створювати заздалегідь якусь кастомну дію через додаток Shortcuts й виконувати її.

— Так, зробити мінігру на віджеті не вийде, але й казати, що віджет — це просто статична картинка, не зовсім правильно, — підсумовує Надзея. — Я намагалася розповісти все про свій досвід обходу деяких обмежень під час роботи з віджетами. Буду рада зворотномузв’язку!

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

Матеріали за темою