Вступление
Виджеты на 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.
Наш опыт и гарантии
Мы — команда с 5+ годами опыта в iOS-разработке, реализовали более 20 проектов с виджетами, включая сложные кейсы с обновлением данных в реальном времени. Гарантируем качество кода, соблюдение App Store Review Guidelines и поддержку после релиза. WidgetKit — наш основной инструмент.
Сроки разработки
| Тип виджета | Срок |
|---|---|
| WidgetKit (один размер, статичные данные) | 2–3 недели |
| WidgetKit (несколько размеров, интерактивность, экран блокировки) | 4–7 недель |
| Today Extension (legacy) | 2–4 недели |
Стоимость рассчитывается индивидуально после анализа ваших данных и частоты обновления. Получите консультацию — оценим ваш проект за 2 дня. Свяжитесь с нами, чтобы обсудить детали. Закажите разработку виджета уже сегодня и получите быстрый старт.







