Разработка Apple Watch приложения (watchOS)
watchOS-приложение — это отдельный таргет со своим жизненным циклом, ограниченными ресурсами и специфичными паттернами взаимодействия. Часы — самостоятельное устройство с watchOS 7+, приложение работает без iPhone рядом. Но архитектура данных и синхронизации между iPhone и Watch — главная сложность, с которой сталкиваются при разработке.
Стек технологий
SwiftUI — единственный рекомендуемый UI-фреймворк для watchOS 7+. WatchKit Views (WKInterfaceController) официально устарели, хотя всё ещё работают. Новые приложения — только SwiftUI.
@main на App struct, WindowGroup — стандартная точка входа как на iOS. Но NavigationSplitView на часах не работает — только NavigationStack.
HealthKit, CoreMotion, CoreLocation, CoreML — доступны на Watch нативно. URLSession — есть, но на часах в фоне не работает: сетевые запросы только пока приложение активно или через WKExtendedRuntimeSession.
WatchConnectivity: синхронизация с iPhone
WCSession — канал связи между приложениями на iPhone и Watch. Не между устройствами в целом, а именно между приложениями.
Три механизма передачи данных:
sendMessage — мгновенная передача, только когда оба приложения активны:
WCSession.default.sendMessage(["action": "fetchData"], replyHandler: { reply in
// Ответ от iPhone
}, errorHandler: { error in
// Обработка ошибки (Watch недоступен)
})
updateApplicationContext — словарь, доставляется при следующем запуске, перезаписывается новым значением:
try WCSession.default.updateApplicationContext(["lastSync": Date().timeIntervalSince1970])
Хорошо подходит для текущего состояния (активная тренировка, последние настройки).
transferUserInfo — очередь словарей, доставляются гарантированно по порядку, не перезаписываются. Для лога событий, транзакций.
Частая ошибка: использовать sendMessage для передачи данных когда Watch в фоне. sendMessage требует, чтобы Watch-приложение было активно в foreground. Для фоновой доставки — только updateApplicationContext или transferUserInfo.
Проверка достижимости: WCSession.default.isReachable — но это состояние асинхронное. Приложение может получить true, отправить сообщение, а Watch уйти в сон до получения. Всегда обрабатывайте errorHandler.
Complications: данные на циферблате
Complications — элементы на циферблате часов. С ClockKit (устаревший) → теперь WidgetKit, аналогичный iOS. ComplicationConfiguration через WidgetConfiguration тот же API что и iOS виджеты.
CLKComplication семейства: .circularSmall, .modularSmall, .modularLarge, .utilitarianSmall, .utilitarianLarge, .graphicCorner, .graphicBezel, .graphicCircular, .graphicRectangular, .graphicExtraLarge.
Timeline в Complication работает как iOS WidgetKit: TimelineProvider, заранее заполненные TimelineEntry. Часы знают, что показать на следующие несколько часов — экономия батареи.
CLKComplicationDataSource.getPrivacyBehavior — что показывать на заблокированном циферблате. hideOnLockScreen — скрыть данные, показать пустую комплекцию.
Background Modes на watchOS
WKExtendedRuntimeSession — до 60 минут фоновой работы для специфичных сценариев:
-
workout— тренировка (неограниченное время с активным WorkoutSession) -
selfCare— медитация, дыхательные упражнения (до 10 минут после экрана) -
alarm— будильник (требует разрешения пользователя) -
sleepTracking— отслеживание сна (ночь)
Для трекинга тренировки: HKWorkoutSession + HKLiveWorkoutBuilder — официальный API. Без HKWorkoutSession система агрессивно убивает фоновые процессы.
Сетевые запросы в фоне: URLSession с фоновой конфигурацией на watchOS не поддерживается. Данные из сети в фоне — только через iPhone (WatchConnectivity) или при следующем foreground-запуске.
UX-особенности, которые важно учесть
Экран маленький: Series 4+ — 44mm (368×448pt retina). Минимальный touch target — 44pt. Список строк без сложной иерархии — предпочтительная навигация. Digital Crown — прокрутка контента, zoom в MapKit, ввод значений через Stepper или Picker с кастомным стилем.
onLongPressGesture — работает, но требует 0.8 секунд по умолчанию. На маленьком экране — часто случайные срабатывания.
Haptic feedback через WKInterfaceDevice.current().play(.click) — важный UX-элемент на Watch, где визуальные ответы ограничены.
Тестирование
Watch Simulator — для базового UI. Физические часы обязательны для: GPS, HealthKit, датчиков сердцебиения, Digital Crown tactile feedback, производительности на реальном железе. Series 4 и Series 9 ведут себя по-разному по производительности.
Срок: 1-2 недели для полноценного watchOS-приложения с WatchConnectivity и Complications. Простой companion-app (без собственной логики, только отображение данных с iPhone): 3-5 дней. Стоимость рассчитывается после анализа требований.







