watchOS — операционната система на Apple за Apple Watch, пусната за първи път през 2015 г. заедно с първите часовници. Разработката на приложения за watchOS се извършва на Swift с използване на SwiftUI и WatchKit. Характеристики: малък правоъгълен екран, ограничена консумация на енергия от акумулатора 0,3 Wh и тясна интеграция с iPhone чрез Bluetooth. Според данни на Counterpoint Research, Apple Watch заема над 30% от световния пазар на умни часовници.
Основни моменти
watchOS — операционната система за умните часовници на Apple, базирана на XNU Darwin ядрото. Пусната за първи път на 24 април 2015 г. заедно с Apple Watch Series 0. Системата е изградена върху същата архитектура като iOS, но оптимизирана за малък дисплей (1,5 до 1,9 инча), ограничена памет (до 1 GB RAM в 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 приложение |
| 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 mm (272×340), 42 mm (312×390), 40 mm (324×394), 44 mm (368×448), 45 mm (396×484), 49 mm (410×502 в Apple Watch Ultra).
watchOS ограничава фоновата работа на приложенията за пестене на батерията. Налични фонови режими: Workout (тренировки), HealthKit (мониторинг на здравето), Location (геолокация), Audio (аудио плейър) и Complication (данни на циферблата). Всеки режим изисква отделна capability в entitlements. Типична консумация на енергия: активно приложение — 50-80 mA, фонов режим — 5-15 mA, режим на готовност — 1-3 mA.
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("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 MB. Файловете се запазват в директорията Inbox на приемащото устройство. transferUserInfo е подходящ за JSON данни до 100 KB. Всички методи работят на заден план: ако устройството не е налично, предаването се поставя на опашка и автоматично се възобновява при възстановяване на връзката.
Публикуването на 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 MB за изтегляне по мобилна мрежа.
Специфични изисквания за watchOS: приложението трябва да работи коректно без активен iPhone (ако е декларирано като standalone), интерфейсът трябва да бъде четим без увеличение, всички интерактивни елементи — най-малко 44 точки на размер. Забранени са приложения, дублиращи функционалността на вградените (например пулсомер без добавена стойност).
| Изискване | Описание |
|---|---|
| Размер на приложението | До 50 MB за мобилно изтегляне, до 4 GB чрез Wi-Fi |
| Standalone режим | WKRunsIndependently = YES в Info.plist |
| Touch цели | Минимум 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 предоставя четири начина: sendMessage (незабавно прехвърляне), transferUserInfo (фон), transferFile (файлове до 100 MB) и updateApplicationContext (синхронизация на състояние). Всички методи работят чрез Bluetooth или Wi-Fi с автоматично поставяне на опашка при загуба на връзка.
Apple Watch Series 9 и Ultra 2 включват: акселерометър, жироскоп, оптичен и електрически пулсомер, SpO2 (сатурация), сензор за температура на китката, барометър, компас, GPS L1+L5 и микрофон. Достъп до сензорите — чрез HealthKit и Core Motion. Данните за пулс и SpO2 изискват изрично разрешение от потребителя.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също