Разработка Today Extension (Widget) для iOS

Вступление Виджеты на iOS — не просто украшение, а необходимость для быстрого доступа к данным. Однако разработка сталкивается с рядом технических ограничений: TimelineProvider, бюджет фоновых обновлений (около 40–70 раз в день) и синхронизация через App Groups. Наши инженеры решали задачи обновл

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Разработка Today Extension (Widget) для iOS
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Вступление

Виджеты на 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?

  1. Создайте новый target типа Widget Extension.
  2. Реализуйте TimelineProvider: определите структуру Entry (данные) и методы getTimeline и placeholder.
  3. Напишите SwiftUI View для виджета, используя семейства (systemSmall, systemMedium и т.д.).
  4. Настройте App Group для обмена данными с основным приложением.
  5. Протестируйте в симуляторе и на реальном устройстве.

Интерактивность через 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 дня. Свяжитесь с нами, чтобы обсудить детали. Закажите разработку виджета уже сегодня и получите быстрый старт.