Віджети, App Clips та Live Activities: розширення мобільного додатку
Користувач бачить додаток не тільки всередині нього. Віджет на домашному екрані, живий рахунок матчу в Dynamic Island, мини-досвід без установки—все це окремі точки входу, кожна зі своїми обмеженнями та своїм стеком.
WidgetKit: навіщо неможливо просто «додати віджет»
WidgetKit працює через Timeline Provider—віджет не живе в памяті постійно, а запитує знімки даних заздалегідь. Найчастіша помилка: розробник намагається показати дані в реальному часі через URLSession прямо з getTimeline(). Apple цього не забороняє, але при агресивному оновленні система починає трротлити запити, та віджет зависає на застарілих даних.
Правильний підхід: основний додаток оновлює дані через WidgetCenter.shared.reloadTimelines(ofKind:)—після отримання push-сповіщення або при повернені користувача в foreground. Віджет читає дані з shared App Group container через UserDefaults(suiteName:) або файлового сховища. Ніяких прямих сітьових запитів у провайдері у продакшені.
iOS 17 додав AppIntent-based interactive widget—кнопки та тоггли прямо на віджеті без відкриття додатку. Реалізується через Button(intent:) у SwiftUI-розмітці віджета. Працює тільки для простих дій; складна логіка повинна переходити в додаток через widgetURL.
Live Activities та Dynamic Island
Live Activities—механізм для відображення живих даних на Lock Screen та в Dynamic Island (iPhone 14 Pro+). Запускаються через ActivityKit, оновлюються через push-сповіщення типу liveactivity з полезною нагрузкою до 4KB.
Архітектурно це окремий SwiftUI-таргет з двома представленнями: компактним (Dynamic Island) та розвёрнутим (Lock Screen). Дані передаються через ActivityAttributes—строго типизовану структуру. Динамічна частина—ContentState, статична (не змінюється за час активності)—в ActivityAttributes напрямку.
Типова проблема: Live Activity не оновлюється на пристрою, хоча push відправляється. Причина—додаток не має дозволу на background push або apns-push-type виставлено неправильно. У production потрібен apns-push-type: liveactivity та токен з activity.pushToken.
App Clips vs Android Instant Apps
App Clips (iOS) та Instant Apps (Android) вирішують схожу задачу—дати користувачу функціональність без установки повного додатку. Але реалізація принципово різна.
App Clip—окремий таргет в Xcode, максимум 15MB, запускається через NFC-метку, QR-код, Safari Smart App Banner або посилання в Messages. Доступ обмежений: немає Keychain sharing з основним додатком без явної настройки, немає доступу до HealthKit, немає push-сповіщень (тільки ephemeral). App Clip Card настроюється в App Store Connect, та помилки в метаданих—частіше причина відхилення ревю.
Android Instant Apps будуються на модульній архітектурі: додаток ділиться на feature-модулі, кожен з яких може бути завантажений окремо через Play Feature Delivery. Instant App—це feature-модуль з <dist:module dist:instant="true">. Обмеження—не більше 15MB суммарно для instant delivery.
| Параметр | App Clips | Instant Apps |
|---|---|---|
| Макс. розмір | 15 MB | 15 MB |
| Тригери запуску | NFC, QR, URL, Safari | URL, Google Search, Play Store |
| Спільний Keychain | Через App Group | Через SharedPreferences/Keystore |
| Рекомендований сценарій | Оплата, посадочний, демо | Ігрове демо, разові сервіси |
Процес розробки
Починаємо з аудиту: які функції додатку реально потрібні вне його, та який механізм підходить. Віджет з прогнозом—WidgetKit. Трекінг доставки в реальному часі—Live Activity. Оплата на касі—App Clip.
Кожне розширення тестуємо ізольовано. WidgetKit-рендеринг зручно перевіряти через Xcode Widget Gallery, Live Activities—через симулятор з принудовою відправкою push через xcrun simctl push.
Графіки варіюються від 1 тижня для простого інформаційного віджета до 4–6 тижнів для App Clip з онбордингом та платіжним сценарієм.







