watchOS — операційна система Apple для Apple Watch, вперше випущена у 2015 році разом із першими годинниками. Розробка застосунків під watchOS ведеться на Swift з використанням SwiftUI та WatchKit. Особливості: маленький прямокутний екран, обмежене енергоспоживання від акумулятора 0,3 Вт·год і щільна інтеграція з iPhone через Bluetooth. За даними Counterpoint Research, Apple Watch займає більше 30% світового ринку розумних годинників.
Головне
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.
Перша версія 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 1 | 2015 | Перша версія, тільки нативні застосунки Apple |
| watchOS 2 | 2015 | Відкритий SDK, сторонні застосунки, Watch Connectivity |
| watchOS 3 | 2016 | Миттєвий запуск застосунків, Dock, Scribble |
| watchOS 6 | 2019 | App Store на годиннику, Cycle Tracking, Noise app |
| watchOS 9 | 2022 | Медикаменти, фази сну, покращений компаньйон для бігу |
| watchOS 10 | 2023 | Smart Stack, Double Tap, нові циферблати |
Архітектура 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 — фреймворк для створення інтерфейсів 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 мА.
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 — найбільше оновлення інтерфейсу за всю історію платформи, випущене у вересні 2023 року. Система перейшла від ієрархічної навігації до контентно-орієнтованої: головним екраном став Smart Stack — інтелектуальний стек віджетів, який замінив док застосунків.
Smart Stack — вертикальний список віджетів, що відображається під циферблатом. Віджети ранжуються за контекстом: вранці показується погода та календар, вдень — активність та нагадування, ввечері — медитація та підготовка до сну. Розробник може додавати кастомні віджети через WidgetKit для watchOS, використовуючи ті ж API, що й для iOS 17.
Double Tap — жест зведення вказівного та великого пальця, що розпізнається акселерометром та гіроскопом без дотику до екрана. У Apple Watch Series 9 та Ultra 2 жест виконується на апаратному рівні через Neural Engine. Розробник отримує подію через UIDoubleTapGestureRecognizer або через SwiftUI модифікатор .onTapGesture(count: 2). Жест не потребує калібрування та працює в будь-якій орієнтації руки.
watchOS 10 представила: SwiftUI Animation з підтримкою Spring та Keyframe анімацій, MapKit для відображення карт на годиннику, VideoPlayer для відтворення коротких відео (до 30 секунд), покращений VoiceOver з жестами та нову навігаційну парадигму NavigationStack замість NavigationView.
| API | Призначення | Доступно з |
|---|---|---|
| WidgetKit for watchOS | Віджети для Smart Stack | watchOS 10 |
| UIDoubleTapGesture | Жест Double Tap | watchOS 10 (S9+) |
| MapKit | Відображення карт на годиннику | watchOS 10 |
| NavigationStack | Нова навігаційна парадигма | watchOS 10 |
| SwiftUI Keyframe | Покадрова анімація | watchOS 10 |
SwiftUI — основний фреймворк для розробки інтерфейсів під watchOS. Apple рекомендує SwiftUI для всіх нових проєктів починаючи з watchOS 7. SwiftUI для годинника використовує ті ж принципи, що й для iOS, але з watchOS-специфічними модифікаторами та компонентами.
SwiftUI для watchOS включає: TabView з page-стилем для свайпу між екранами, DigitalCrownRotation для обробки обертання коліщатка, SceneStorage для збереження стану між запусками, WKNotificationScene для кастомних сповіщень та ComplicationDescriptor для даних на циферблаті.
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 — коліщатко на бічній панелі Apple Watch. SwiftUI надає DigitalCrownRotation для прив'язки значення до обертання коліщатка. Модифікатор приймає binding, діапазон та крок. Жести: tap (дотик), longPress (довге натискання), swipe (свайп) та pan (перетягування) — всі стандартні для SwiftUI та адаптовані під розмір екрана годинника.
WatchKit — оригінальний фреймворк для watchOS, який використовує UIKit-підхід. Хоча Apple рекомендує SwiftUI, WatchKit залишається актуальним для легасі-проєктів та специфічних завдань: складні анімації на WKInterfaceGroup та інтеграція з SiriKit.
Застосунок для watchOS складається з двох таргетів: WatchKit Extension (логіка та інтерфейс) та iOS Companion App (налаштування та синхронізація). Починаючи з Xcode 15, можливе створення standalone-застосунку без iOS-компаньйона. Інтерфейс описується в Interface.storyboard (WatchKit) або програмно через SwiftUI.
| Компонент | WatchKit | SwiftUI |
|---|---|---|
| Екран | WKInterfaceController | View |
| Кнопка | WKInterfaceButton | Button |
| Таблиця | WKInterfaceTable | List |
| Група | WKInterfaceGroup | VStack / HStack |
| Зображення | WKInterfaceImage | Image / AsyncImage |
| Мітка | WKInterfaceLabel | Text |
| Карта | WKInterfaceMap | Map (watchOS 10+) |
| Циферблат | CLKComplicationDataSource | ComplicationDescriptor |
Complication — віджет, що відображає дані на циферблаті Apple Watch. Розробник реалізує протокол CLKComplicationDataSource, надаючи шаблони для різних типів циферблатів (circular, rectangular, modular, extraLarge). watchOS 10 підтримує ComplicationDescriptor — спрощений API для SwiftUI. Дані оновлюються через Background Tasks з періодом до 30 хвилин.
Watch Connectivity — фреймворк для обміну даними між Apple Watch та iPhone через Bluetooth або Wi-Fi. Єдиний спосіб зв'язку між парними пристроями. WCSession — центральний клас, що керує сесією. iOS-застосунок та watchOS-розширення повинні реалізувати WCSessionDelegate.
Watch Connectivity надає чотири методи передачі даних: sendMessage — негайне відправлення з підтвердженням (працює тільки коли обидва застосунки активні), transferUserInfo — фонова доставка словника даних, transferFile — передача файлів з метаданими, updateApplicationContext — синхронізація спільного стану. Всі методи гарантують доставку при відновленні з'єднання.
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-застосунку слідує тим же правилам, що й 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 МБ для завантаження по стільниковій мережі.
Особливі вимоги для watchOS: застосунок повинен коректно працювати без активного iPhone (якщо заявлено як standalone), інтерфейс повинен бути читабельним без збільшення, всі інтерактивні елементи — не менше 44 точок у розмірі. Заборонені застосунки, що дублюють функціональність вбудованих (наприклад, пульсометр без додаткової цінності).
| Вимога | Опис |
|---|---|
| Розмір застосунку | До 50 МБ для стільникового завантаження, до 4 ГБ через Wi-Fi |
| Standalone режим | WKRunsIndependently = YES в Info.plist |
| Touch targets | Мінімум 44 pt для всіх інтерактивних елементів |
| Безпека | Дані HealthKit не можуть передаватися на сервер без згоди |
| Продуктивність | Запуск застосунку не більше 5 секунд |
Часті запитання
Основна мова — Swift з фреймворком SwiftUI. WatchKit на UIKit також підтримується, але Apple рекомендує SwiftUI для всіх нових проєктів під watchOS. Objective-C використовується тільки в легасі-застосунках, випущених до 2019 року. З watchOS 7 всі приклади Apple використовують виключно SwiftUI.
Починаючи з watchOS 6, Apple Watch може встановлювати застосунки безпосередньо з App Store без iPhone. Однак багато функцій — синхронізація даних, push-сповіщення, геолокація — вимагають пари з iPhone. Повністю автономні застосунки можливі з watchOS 9 та WKRunsIndependently в налаштуваннях збірки.
Типова автономність Apple Watch Series 9 — до 18 годин у змішаному режимі. При активному використанні застосунку з GPS та пульсометром — 5-7 годин. watchOS 10 оптимізує енергоспоживання через Smart Stack та BGTaskScheduler, зменшуючи фонову активність застосунків до 4 разів порівняно з watchOS 9.
Watch Connectivity framework надає чотири способи: sendMessage (негайна передача), transferUserInfo (фонова), transferFile (файли до 100 МБ) та updateApplicationContext (синхронізація стану). Всі методи працюють через Bluetooth або Wi-Fi з автоматичною постановкою в чергу при втраті з'єднання.
Apple Watch Series 9 та Ultra 2 включають: акселерометр, гіроскоп, оптичний та електричний пульсометр, SpO2 (сатурація), датчик температури зап'ястя, барометр, компас, GPS L1+L5 та мікрофон. Доступ до датчиків — через HealthKit та Core Motion. Дані пульсу та SpO2 вимагають явного дозволу користувача.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.