watchOS: основы разработки под Apple Watch со SwiftUI

Автор: IT Sectr Опубликовано: 2026-02-07 Время чтения: 12 мин

watchOS — операционная система Apple для Apple Watch, впервые выпущенная в 2015 году вместе с первыми часами. Разработка приложений под watchOS ведётся на Swift с использованием SwiftUI и WatchKit. Особенности: маленький прямоугольный экран, ограниченное энергопотребение от аккумулятора 0.3 Вт·ч и плотная интеграция с iPhone через Bluetooth. По данным Counterpoint Research, Apple Watch занимает более 30% мирового рынка умных часов.

Главное

  • watchOS — ОС для Apple Watch на XNU-ядре с ориентацией на низкое энергопотребление
  • SwiftUI — основной фреймворк для разработки интерфейсов watchOS-приложений
  • Watch Connectivity — механизм обмена данными между Apple Watch и iPhone
  • Smart Stack — интеллектуальный стек виджетов, представленный в watchOS 10
  • HealthKit — фреймворк для доступа к датчикам: пульс, SpO2, температура, акселерометр

Что такое watchOS?

watchOS — операционная система для умных часов Apple, основанная на XNU-ядре Darwin. Впервые выпущена 24 апреля 2015 года вместе с Apple Watch Series 0. Система построена на той же архитектуре, что и iOS, но оптимизирована для маленького дисплея (от 1.5 до 1.9 дюйма), ограниченной памяти (до 1 ГБ ОЗУ в Series 9) и минимального энергопотребления.

По данным StatCounter (2026), watchOS занимает около 55% рынка операционных систем для умных часов, опережая Wear OS и проприетарные системы китайских производителей. Apple выпускает мажорные обновления watchOS ежегодно, поддерживая часы до 5 лет с момента выпуска.

Ключевая особенность watchOS — зависимость от iPhone. Большинство приложений используют Watch Connectivity для синхронизации данных. Начиная с watchOS 6, часы могут устанавливать приложения напрямую из App Store, но полная автономность без iPhone поддерживается только с watchOS 9.

История версий watchOS

Первая версия Watch OS 1.0 не поддерживала сторонние приложения — только предустановленные Apple. watchOS 2 (2015) открыла SDK для разработчиков. watchOS 3 (2016) ускорила запуск приложений в 7 раз. watchOS 6 (2019) представила App Store на часах. watchOS 9 (2022) добавила медикаменты и улучшенный трекинг сна. watchOS 10 (2023) стала крупнейшим обновлением интерфейса с момента выпуска.

Версия watchOSГодКлючевое нововведение
Watch OS 12015Первая версия, только нативные приложения Apple
watchOS 22015Открытый SDK, сторонние приложения, Watch Connectivity
watchOS 32016Мгновенный запуск приложений, Dock, Scribble
watchOS 62019App Store на часах, Cycle Tracking, Noise app
watchOS 92022Медикаменты, фазы сна, улучшенный компаньон для бега
watchOS 102023Smart Stack, Double Tap, новые циферблаты

Архитектура watchOS

Архитектура watchOS состоит из трёх уровней, изолирующих аппаратное обеспечение от пользовательских приложений. В отличие от iOS, watchOS использует компонентный подход: приложение состоит из двух таргетов — расширение (extension) и хост на iPhone.

Ядро и системные службы

Нижний уровень — модифицированное ядро XNU с драйверами для S4/S5/S6/S7/S8/S9 чипов Apple. В Apple Watch Series 9 используется S9 SiP с 5.6 млрд транзисторов и 4-ядерным Neural Engine. Системные службы включают Core Bluetooth, Watch Connectivity, HealthKit и Core Motion. Все фоновые задачи управляются через BGTaskScheduler — системный планировщик, оптимизирующий энергопотребление.

WatchKit — слой приложений

WatchKit — фреймворк для создания интерфейсов watchOS-приложений. Включает WKInterfaceController, WKInterfaceGroup, WKInterfaceLabel и WKInterfaceButton. С watchOS 6 Apple рекомендует SwiftUI вместо WatchKit. SwiftUI предоставляет те же возможности, но с декларативным синтаксисом и автоматической адаптацией под размер экрана: 38 мм (272×340), 42 мм (312×390), 40 мм (324×394), 44 мм (368×448), 45 мм (396×484), 49 мм (410×502 в Apple Watch Ultra).

Фоновые режимы и энергопотребление

watchOS ограничивает фоновую работу приложений для экономии батареи. Доступные фоновые режимы: Workout (тренировки), HealthKit (мониторинг здоровья), Location (геолокация), Audio (аудиоплеер) и Complication (данные на циферблате). Каждый режим запрашивает отдельную capability в entitlements. Типичное энергопотребение: активное приложение — 50-80 мА, фоновый режим — 5-15 мА, Standby — 1-3 мА.

swift
import BackgroundTasks
import WatchKit

/// Планирование фонового обновления данных на watchOS
class BackgroundTaskManager: NSObject {

    func scheduleBackgroundRefresh() {
        let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 30 * 60)

        try? BGTaskScheduler.shared.submit(request)
    }

    func handleAppRefresh(task: BGAppRefreshTask) {
        task.expirationHandler = { task.setTaskCompleted(success: false) }

        DataService.shared.fetchData { result in
            switch result {
            case .success:
                ComplicationController.reloadComplications()
                task.setTaskCompleted(success: true)
            case .failure:
                task.setTaskCompleted(success: false)
            }
        }
    }
}

/// Регистрация фоновой задачи в WKExtensionDelegate
class ExtensionDelegate: NSObject, WKExtensionDelegate {
    let manager = BackgroundTaskManager()

    func handle(_ backgroundTasks: Set<WKBackgroundTask>) {
        for task in backgroundTasks {
            switch task {
            case let refreshTask as BGAppRefreshTask:
                manager.handleAppRefresh(task: refreshTask)
            default:
                task.setTaskCompleted(success: false)
            }
        }
    }
}

BGTaskScheduler гарантирует, что фоновые задачи выполняются в оптимальные моменты — когда часы на зарядке и подключены к iPhone. WKExtensionDelegate обрабатывает входящие фоновые задачи и обновляет данные на циферблате. ComplicationController.reloadComplications обновляет виджеты на выбранном циферблате.

watchOS 10: Smart Stack и Double Tap

watchOS 10 — крупнейшее обновление интерфейса за всю историю платформы, выпущенное в сентябре 2023 года. Система перешла от иерархической навигации к контентно-ориентированной: основным экраном стал Smart Stack — интеллектуальный стек виджетов, заменивший док приложений.

Smart Stack

Smart Stack — вертикальный список виджетов, отображаемый под циферблатом. Виджеты ранжируются по контексту: утром показывается погода и календарь, днём — активность и напоминания, вечером — медитация и подготовка ко сну. Разработчик может добавлять кастомные виджеты через WidgetKit для watchOS, используя те же API, что и для iOS 17.

Double Tap

Double Tap — жест сведения указательного и большого пальца, распознаваемый акселерометром и гироскопом без касания экрана. В Apple Watch Series 9 и Ultra 2 жест выполняется на аппаратном уровне через Neural Engine. Разработчик получает событие через UIDoubleTapGestureRecognizer или через SwiftUI модификатор .onTapGesture(count: 2). Жест не требует калибровки и работает в любой ориентации руки.

Новые API для разработчиков

watchOS 10 представила: SwiftUI Animation с поддержкой Spring и Keyframe анимаций, MapKit для отображения карт на часах, VideoPlayer для воспроизведения коротких видео (до 30 секунд), улучшенный VoiceOver с жестами и новую навигационную парадигму NavigationStack вместо NavigationView.

APIНазначениеДоступно с
WidgetKit for watchOSВиджеты для Smart StackwatchOS 10
UIDoubleTapGestureЖест Double TapwatchOS 10 (S9+)
MapKitОтображение карт на часахwatchOS 10
NavigationStackНовая навигационная парадигмаwatchOS 10
SwiftUI KeyframeПокадровая анимацияwatchOS 10

SwiftUI для Apple Watch

SwiftUI — основной фреймворк для разработки интерфейсов под watchOS. Apple рекомендует SwiftUI для всех новых проектов начиная с watchOS 7. SwiftUI для часов использует те же принципы, что и для iOS, но с watchOS-специфичными модификаторами и компонентами.

WatchOS-специфичные компоненты SwiftUI

SwiftUI для watchOS включает: TabView с page-стилем для свайпа между экранами, DigitalCrownRotation для обработки вращения колёсика, SceneStorage для сохранения состояния между запусками, WKNotificationScene для кастомных уведомлений и ComplicationDescriptor для данных на циферблате.

swift
import SwiftUI
import HealthKit

/// watchOS приложение для мониторинга пульса
@main
struct HeartMonitorApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        WKNotificationScene(
            controller: NotificationController.self,
            category: "heartAlert"
        )
    }
}

struct ContentView: View {
    @State private var heartRate: Double = 0
    private let healthStore = HKHealthStore()

    var body: some View {
        TabView {
            HeartRateView(rate: heartRate)
                .tabItem { Label("Пульс", systemImage: "heart.fill") }

            StepsView()
                .tabItem { Label("Шаги", systemImage: "figure.walk") }

            SettingsView()
                .tabItem { Label("Настройки", systemImage: "gear") }
        }
        .tabViewStyle(.page)
        .onAppear(perform: setupHealthKit)
    }

    private func setupHealthKit() {
        guard HKHealthStore.isHealthDataAvailable() else { return }
        let heartType = HKQuantityType(.heartRate)

        healthStore.requestAuthorization(toShare: nil, read: [heartType]) { success, error in
            guard success else { return }
            startHeartRateQuery()
        }
    }

    private func startHeartRateQuery() {
        let heartType = HKQuantityType(.heartRate)
        let query = HKObserverQuery(sampleType: heartType, predicate: nil) { _, _, error in
            guard error == nil else { return }
            fetchLatestHeartRate()
        }
        healthStore.execute(query)
    }

    private func fetchLatestHeartRate() {
        let heartType = HKQuantityType(.heartRate)
        let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let query = HKSampleQuery(sampleType: heartType, predicate: nil,
                                    limit: 1, sortDescriptors: [sort]) { _, samples, _ in
            guard let sample = samples?.first as? HKQuantitySample else { return }
            let rate = sample.quantity.doubleValue(for: HKUnit(from: "count/min"))
            DispatchQueue.main.async { heartRate = rate }
        }
        healthStore.execute(query)
    }
}

struct HeartRateView: View {
    let rate: Double

    var body: some View {
        VStack(spacing: 12) {
            Image(systemName: "heart.fill")
                .foregroundStyle(.red)
                .font(.system(size: 48))
                .symbolEffect(.pulse)

            Text("\(Int(rate))")
                .font(.system(.title, design: .rounded))
                .contentTransition(.numericText())
                .bold()

            Text("уд/мин")
                .font(.caption)
                .foregroundStyle(.secondary)
        }
    }
}

Приложение HeartMonitorApp демонстрирует типичную структуру watchOS-приложения на SwiftUI: TabView с page-стилем для свайпа между экранами, интеграцию с HealthKit для чтения пульса в реальном времени, WKNotificationScene для обработки уведомлений. SymbolEffect с pulse-анимацией использует аппаратное ускорение Neural Engine для плавной анимации без затрат CPU.

Digital Crown и жесты

Digital Crown — колёсико на боковой панели Apple Watch. SwiftUI предоставляет DigitalCrownRotation для привязки значения к вращению колёсика. Модификатор принимает binding, диапазон и шаг. Жесты: tap (касание), longPress (долгое нажатие), swipe (свайп) и pan (перетаскивание) — все стандартные для SwiftUI и адаптированные под размер экрана часов.

WatchKit и компоненты watchOS-приложения

WatchKit — оригинальный фреймворк для watchOS, использующий UIKit-подход. Хотя Apple рекомендует SwiftUI, WatchKit остаётся актуальным для легаси-проектов и специфичных задач: сложные анимации на WKInterfaceGroup и интеграция с SiriKit.

Структура watchOS-приложения

Приложение для watchOS состоит из двух таргетов: WatchKit Extension (логика и интерфейс) и iOS Companion App (настройки и синхронизация). Начиная с Xcode 15, возможно создание standalone-приложения без iOS-компаньона. Интерфейс описывается в Interface.storyboard (WatchKit) или программно через SwiftUI.

КомпонентWatchKitSwiftUI
ЭкранWKInterfaceControllerView
КнопкаWKInterfaceButtonButton
ТаблицаWKInterfaceTableList
ГруппаWKInterfaceGroupVStack / HStack
ИзображениеWKInterfaceImageImage / AsyncImage
МеткаWKInterfaceLabelText
КартаWKInterfaceMapMap (watchOS 10+)
ЦиферблатCLKComplicationDataSourceComplicationDescriptor

Complications — данные на циферблате

Complication — виджет, отображающий данные на циферблате Apple Watch. Разработчик реализует протокол CLKComplicationDataSource, предоставляя шаблоны для разных типов циферблатов (circular, rectangular, modular, extraLarge). watchOS 10 поддерживает ComplicationDescriptor — упрощённый API для SwiftUI. Данные обновляются через Background Tasks с периодом до 30 минут.

Интеграция с iPhone через Watch Connectivity

Watch Connectivity — фреймворк для обмена данными между Apple Watch и iPhone через Bluetooth или Wi-Fi. Единственный способ связи между парными устройствами. WCSession — центральный класс, управляющий сессией. iOS-приложение и watchOS-расширение должны реализовать WCSessionDelegate.

Методы передачи данных

Watch Connectivity предоставляет четыре метода передачи данных: sendMessage — немедленная отправка с подтверждением (работает только когда оба приложения активны), transferUserInfo — фоновая доставка словаря данных, transferFile — передача файлов с метаданными, updateApplicationContext — синхронизация общего состояния. Все методы гарантируют доставку при возобновлении соединения.

swift
import WatchConnectivity

/// Менеджер синхронизации между iPhone и Apple Watch
final class ConnectivityManager: NSObject, WCSessionDelegate {

    static let shared = ConnectivityManager()
    private let session = WCSession.default

    override private init() {
        super.init()
        session.delegate = self
        session.activate()
    }

    // MARK: — Отправка данных с iPhone на часы
    func sendWorkoutData(_ data: [String: Any]) {
        guard session.isReachable else {
            // Если часы недоступны — сохраняем в контекст
            try? session.updateApplicationContext(data)
            return
        }
        session.sendMessage(data, replyHandler: nil) { error in
            print("Send error: \(error.localizedDescription)")
        }
    }

    // MARK: — Получение данных на часах
    func session(_ session: WCSession,
                 didReceiveMessage message: [String: Any]) {
        DispatchQueue.main.async {
            NotificationCenter.default.post(
                name: NSNotification.Name("dataReceived"),
                object: message
            )
        }
    }

    func session(_ session: WCSession,
                 activationDidCompleteWith activationState: WCSessionActivationState,
                 error: Error?) {
        print("WCSession activated: \(activationState.rawValue)")
    }

    // Не требуется на watchOS, но обязателен для протокола
    func sessionDidBecomeInactive(_ session: WCSession) {}
    func sessionDidDeactivate(_ session: WCSession) {
        session.activate()
    }
}

ConnectivityManager реализует синглтон для работы с WCSession. sendWorkoutData проверяет isReachable: если часы активны, данные отправляются немедленно через sendMessage; если нет — сохраняются в applicationContext для отложенной доставки. onReceiveMessage на стороне получателя обрабатывает входящие сообщения и уведомляет приложение через NotificationCenter.

Файловый обмен и синхронизация

transferFile позволяет передавать большие объёмы данных: изображения, аудиофайлы, архивы. Максимальный размер файла — 100 МБ. Файлы сохраняются в директории Inbox на принимающем устройстве. transferUserInfo подходит для JSON-данных до 100 КБ. Все методы работают в фоне: если устройство недоступно, передача ставится в очередь и автоматически возобновляется при восстановлении соединения.

Публикация watchOS-приложений

Публикация watchOS-приложения следует тем же правилам, что и iOS: требуется подписка Apple Developer Program ($99/год) и прохождение модерации App Review. Приложение загружается в App Store Connect как часть iOS-приложения или как standalone-приложение.

Сборка и дистрибуция

watchOS-приложение может поставляться двумя способами: как встроенное расширение iOS-приложения (iOS app bundle содержит watchOS .app) или как standalone-приложение (загружается и работает без iPhone). Для standalone-режима требуется WKRunsIndependently = YES в Info.plist. Размер watchOS-приложения ограничен 50 МБ для загрузки по сотовой сети.

Требования App Review

Особые требования для watchOS: приложение должно корректно работать без активного iPhone (если заявлено как standalone), интерфейс должен быть читаем без увеличения, все интерактивные элементы — не менее 44 точек в размере. Запрещены приложения, дублирующие функциональность встроенных (например, пульсометр без дополнительной ценности).

ТребованиеОписание
Размер приложенияДо 50 МБ для сотовой загрузки, до 4 ГБ через Wi-Fi
Standalone режимWKRunsIndependently = YES в Info.plist
Touch targetsМинимум 44 pt для всех интерактивных элементов
БезопасностьДанные HealthKit не могут передаваться на сервер без согласия
ПроизводительностьЗапуск приложения не более 5 секунд

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

Какие языки используются для разработки под watchOS?

Основной язык — Swift с фреймворком SwiftUI. WatchKit на UIKit также поддерживается, но Apple рекомендует SwiftUI для всех новых проектов под watchOS. Objective-C используется только в легаси-приложениях, выпущенных до 2019 года. С watchOS 7 все примеры Apple используют исключительно SwiftUI.

Нужен ли iPhone для работы watchOS приложения?

Начиная с watchOS 6, Apple Watch может устанавливать приложения напрямую из App Store без iPhone. Однако многие функции — синхронизация данных, push-уведомления, геолокация — требуют пары с iPhone. Полностью автономные приложения возможны с watchOS 9 и WKRunsIndependently в настройках сборки.

Какова автономность Apple Watch с активным приложением?

Типичная автономность Apple Watch Series 9 — до 18 часов в смешанном режиме. При активном использовании приложения с GPS и пульсометром — 5-7 часов. watchOS 10 оптимизирует энергопотребление через Smart Stack и BGTaskScheduler, уменьшая фоновую активность приложений до 4 раз по сравнению с watchOS 9.

Как передавать данные между iPhone и Apple Watch?

Watch Connectivity framework предоставляет четыре способа: sendMessage (немедленная передача), transferUserInfo (фоновая), transferFile (файлы до 100 МБ) и updateApplicationContext (синхронизация состояния). Все методы работают через Bluetooth или Wi-Fi с автоматической постановкой в очередь при потере соединения.

Какие датчики доступны на Apple Watch?

Apple Watch Series 9 и Ultra 2 включают: акселерометр, гироскоп, оптический и электрический пульсометр, SpO2 (сатурация), датчик температуры запястья, барометр, компас, GPS L1+L5 и микрофон. Доступ к датчикам — через HealthKit и Core Motion. Данные пульса и SpO2 требуют явного разрешения пользователя.

Итоги

  • watchOS — операционная система Apple для умных часов на XNU-ядре с фокусом на энергоэффективность и интеграцию с iPhone
  • SwiftUI — основной фреймворк для watchOS, обеспечивающий декларативную вёрстку и автоматическую адаптацию под размер экрана
  • watchOS 10 представила Smart Stack, Double Tap (S9+), NavigationStack и WidgetKit для виджетов
  • Watch Connectivity — единственный канал связи с iPhone через Bluetooth/Wi-Fi с четырьмя режимами передачи
  • HealthKit предоставляет доступ к датчикам Apple Watch: пульс, SpO2, температура, акселерометр, GPS
  • Complications — виджеты на циферблате, реализуемые через CLKComplicationDataSource или SwiftUI
  • Публикация требует Apple Developer Program, размер до 50 МБ (сотовый) и строгий контроль производительности

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также