Розробка Today Extension (Widget) для iOS
Вступ
Віджети на iOS — не просто прикраса, а необхідність для швидкого доступу до даних. Однак розробка стикається з низкою технічних обмежень: TimelineProvider, бюджет фонових оновлень (близько 40–70 разів на день) та синхронізація через App Groups. Наші інженери вирішували завдання оновлення курсу валют кожні 15 хвилин у WidgetKit, працювали з інтерактивними віджетами до того, як це стало мейнстримом. Якщо вам потрібно показати дані на домашньому екрані або екрані блокування, ми підберемо оптимальне рішення.
Перед початком розробки важливо зрозуміти, який механізм використовувати: Today Extension (legacy) або WidgetKit. WidgetKit — рекомендований Apple шлях, але іноді потрібна зворотна сумісність. Ми допоможемо визначитись.
Як працює WidgetKit?
WidgetKit — це не класичний View з живим кодом, а набір попередньо відрендерених знімків (снепшотів). Ви реалізуєте TimelineProvider, який повертає масив TimelineEntry. Кожен entry містить дату показу та дані. Система рендерить SwiftUI View для кожного entry заздалегідь і перемикає їх за розкладом.
Оновлення віджета. WidgetCenter.shared.reloadTimelines(ofKind:) викликається з основного додатку або Background App Refresh. Бюджет фонових оновлень обмежений (приблизно 40–70 разів на день). Якщо TimelineProvider запитує оновлення надто часто через TimelineReloadPolicy.after(Date), система може ігнорувати запити.
Чому варто обрати WidgetKit замість Today Extension?
| Характеристика | Today Extension | WidgetKit |
|---|---|---|
| Цільове місце | Центр сповіщень | Домашній екран, екран блокування, Apple Watch |
| Технологія | UIKit | SwiftUI |
| Інтерактивність | Ні | Так (AppIntents з останніх версій iOS) |
| Оновлення | NCWidgetProviding | TimelineProvider + WidgetCenter |
| Розміри | Фіксований/розширений | Декілька фіксованих розмірів |
| Підтримка Apple | Legacy | Активна |
WidgetKit краще масштабується та підтримує сучасні фічі, такі як інтерактивність та віджети на екрані блокування.
Як реалізувати WidgetKit?
- Створіть новий target типу Widget Extension.
- Реалізуйте TimelineProvider: визначте структуру Entry (дані) та методи
getTimelineіplaceholder. - Напишіть SwiftUI View для віджета, використовуючи сімейства (
systemSmall,systemMediumтощо). - Налаштуйте App Group для обміну даними з основним додатком.
- Протестуйте в симуляторі та на реальному пристрої.
Інтерактивність через AppIntents
В останніх версіях iOS віджети стали інтерактивними. Використовуйте структуру, що відповідає AppIntent, з @MainActor. У SwiftUI віджета код: Button(intent: MyIntent()). Обмеження: не можна показувати Alert або Sheet. Для складних дій — глибокі посилання через widgetURL().
App Group: обмін даними
Віджет — окремий Extension process. Дані основного додатку напряму недоступні. Використовуйте UserDefaults(suiteName:) для малих даних та FileManager.containerURL(forSecurityApplicationGroupIdentifier:) для файлів. Не зберігайте дані віджета в папці Documents основного додатку — віджет їх не побачить. Детальніше про App Groups читайте в документації Apple.
Детальніше про бюджет оновлень
Система виділяє кожному додатку квоту на фонові оновлення, яка залежить від часу доби та активності користувача. В середньому віджет може оновлюватися 40–70 разів на день. Щоб не вичерпати бюджет, використовуйте `TimelineReloadPolicy.atEnd` та не встановлюйте надто часті дати оновлень.Розміри та екран блокування
WidgetKit підтримує: systemSmall, systemMedium, systemLarge, systemExtraLarge (iPad). Починаючи з останніх версій iOS: accessoryCircular, accessoryRectangular, accessoryInline для екрану блокування та Apple Watch. Віджет блокування рендериться в grayscale в ambient режимі — дизайн повинен бути читабельним в обох режимах.
Today Extension (legacy)
NCWidgetProviding.widgetPerformUpdate(completionHandler:) — точка оновлення. Extension повинен викликати completionHandler(.newData) або .noData протягом 30 секунд. Використовує UIKit, без SwiftUI. Розмір: компактний або розширений через preferredContentSize.
Що входить у розробку віджета
- Аналіз вимог та вибір відповідного механізму (WidgetKit або Today Extension).
- Проектування даних та взаємодії з основним додатком.
- Реалізація TimelineProvider та SwiftUI View для всіх цільових розмірів.
- Налаштування App Group та обміну даними.
- Інтеграція інтерактивності (AppIntents) при необхідності.
- Налаштування фонових оновлень та бюджетів.
- Тестування на реальних пристроях з різними версіями iOS.
- Публікація в App Store Connect та налаштування TestFlight.
Наш досвід та гарантії
Ми — команда з великим досвідом у iOS-розробці, реалізували понад 20 проєктів з віджетами, включаючи складні кейси з оновленням даних у реальному часі. Гарантуємо якість коду, дотримання App Store Review Guidelines та підтримку після релізу. WidgetKit — наш основний інструмент.
Терміни розробки
| Тип віджета | Термін |
|---|---|
| WidgetKit (один розмір, статичні дані) | 2–3 тижні |
| WidgetKit (декілька розмірів, інтерактивність, екран блокування) | 4–7 тижнів |
| Today Extension (legacy) | 2–4 тижні |
Вартість розраховується індивідуально після аналізу ваших даних та частоти оновлення. Отримайте консультацію — оцінимо ваш проєкт за 2 дні. Зв'яжіться з нами, щоб обговорити деталі. Замовте розробку віджета вже сьогодні та отримайте швидкий старт.







