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("Помилка відправлення: \(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 активовано: \(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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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