watchOS — 苹果公司为 Apple Watch 设计的操作系统,于 2015 年与第一代手表一同首次发布。watchOS 的应用程序开发使用 Swift 语言,并采用 SwiftUI 和 WatchKit 框架。特点:小型矩形屏幕、0.3 Wh 电池的有限能耗、通过蓝牙与 iPhone 紧密集成。根据 Counterpoint Research 的数据,Apple Watch 占据全球智能手表市场超过 30% 的份额。
要点
watchOS — 苹果智能手表的操作系统,基于 XNU Darwin 内核。首次于 2015 年 4 月 24 日与 Apple Watch Series 0 一同发布。该系统基于与 iOS 相同的架构构建,但针对小显示屏(1.5 到 1.9 英寸)、有限内存(Series 9 中高达 1 GB RAM)和最低能耗进行了优化。
根据 StatCounter(2026 年)的数据,watchOS 占据智能手表操作系统市场约 55% 的份额,领先于 Wear OS 和中国厂商的专有系统。苹果每年发布 watchOS 的主要更新,从发布之日起为手表提供最多 5 年的支持。
watchOS 的关键特性 — 对 iPhone 的依赖。大多数应用程序使用 Watch Connectivity 进行数据同步。从 watchOS 6 开始,手表可以直接从 App Store 安装应用程序,但完全脱离 iPhone 的自主性仅从 watchOS 9 开始支持。
首个版本 Watch OS 1.0 不支持第三方应用程序 — 仅限苹果预装的应用程序。watchOS 2(2015)向开发者开放了 SDK。watchOS 3(2016)将应用程序启动速度提升了 7 倍。watchOS 6(2019)在手表上引入了 App Store。watchOS 9(2022)增加了药物管理和改进的睡眠追踪。watchOS 10(2023)成为自发布以来最大的界面更新。
| watchOS 版本 | 年份 | 关键创新 |
|---|---|---|
| Watch OS 1 | 2015 | 首个版本,仅限苹果原生应用程序 |
| 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 上的主机。
底层 — 带有 S4/S5/S6/S7/S8/S9 苹果芯片驱动程序的修改版 XNU 内核。Apple Watch Series 9 采用 S9 SiP,拥有 56 亿个晶体管和 4 核 Neural Engine。系统服务包括 Core Bluetooth、Watch Connectivity、HealthKit 和 Core Motion。所有后台任务均由 BGTaskScheduler — 优化能耗的系统调度器管理。
WatchKit — 用于创建 watchOS 应用程序界面的框架。包括 WKInterfaceController、WKInterfaceGroup、WKInterfaceLabel 和 WKInterfaceButton。从 watchOS 6 开始,苹果推荐使用 SwiftUI 替代 WatchKit。SwiftUI 提供相同的功能,但采用声明式语法和自动适配屏幕尺寸:38 毫米(272×340)、42 毫米(312×390)、40 毫米(324×394)、44 毫米(368×448)、45 毫米(396×484)、49 毫米(Apple Watch Ultra 为 410×502)。
watchOS 限制应用程序的后台工作以节省电池。可用的后台模式:Workout(锻炼)、HealthKit(健康监测)、Location(地理位置)、Audio(音频播放器)和 Complication(表盘数据)。每种模式在 entitlements 中需要独立的 capability。典型能耗:活动应用程序 — 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 年 9 月发布。系统从层级导航过渡到面向内容的导航:主屏幕变为 Smart Stack — 取代应用程序 Dock 的智能小组件堆栈。
Smart Stack — 显示在表盘下方的垂直小组件列表。小组件根据上下文排序:早上显示天气和日历,白天显示活动和提醒,晚上显示冥想和睡眠准备。开发者可以通过 WidgetKit 为 watchOS 添加自定义小组件,使用与 iOS 17 相同的 API。
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 界面开发的主要框架。苹果从 watchOS 7 开始推荐所有新项目使用 SwiftUI。手表的 SwiftUI 使用与 iOS 相同的原则,但带有 watchOS 特定的修饰符和组件。
适用于 watchOS 的 SwiftUI 包括:带有页面样式的 TabView 用于在屏幕之间滑动,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 应用程序展示了 SwiftUI 中 watchOS 应用程序的典型结构:带有页面样式的 TabView 用于屏幕间滑动,与 HealthKit 集成以实时读取心率,WKNotificationScene 用于处理通知。带有脉冲动画的 SymbolEffect 利用 Neural Engine 的硬件加速实现流畅动画,无需 CPU 负担。
Digital Crown — Apple Watch 侧面面板上的表冠。SwiftUI 提供 DigitalCrownRotation 用于将值与表冠旋转绑定。修饰符接受绑定、范围和步长。手势:tap(轻点)、longPress(长按)、swipe(轻扫)和 pan(拖动) — 所有手势均为 SwiftUI 标准手势,并针对手表屏幕尺寸进行了适配。
WatchKit — 使用 UIKit 方法的原始 watchOS 框架。虽然苹果推荐 SwiftUI,但 WatchKit 对于旧项目和特定任务仍然相关:WKInterfaceGroup 上的复杂动画以及与 SiriKit 的集成。
watchOS 应用程序由两个目标组成:WatchKit Extension(逻辑和界面)和 iOS Companion App(设置和同步)。从 Xcode 15 开始,可以在没有 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 协议,为不同类型的表盘(圆形、矩形、模块化、特大)提供模板。watchOS 10 支持 ComplicationDescriptor — 适用于 SwiftUI 的简化 API。数据通过 Background Tasks 更新,周期最长为 30 分钟。
Watch Connectivity — 用于通过蓝牙或 Wi-Fi 在 Apple Watch 和 iPhone 之间交换数据的框架。配对的设备之间唯一的通信方式。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 适用于最大 100 KB 的 JSON 数据。所有方法在后台工作:如果设备不可用,传输将排队并在连接恢复时自动继续。
发布 watchOS 应用程序 遵循与 iOS 相同的规则:需要 Apple Developer Program 订阅($99/年)并通过 App Review 审核。应用程序作为 iOS 应用程序的一部分或作为独立应用程序上传到 App Store Connect。
watchOS 应用程序可以通过两种方式交付:作为 iOS 应用程序的内置扩展(iOS app bundle 包含 watchOS .app)或作为独立应用程序(无需 iPhone 即可下载和运行)。独立模式需要在 Info.plist 中设置 WKRunsIndependently = YES。watchOS 应用程序的大小限制为通过蜂窝网络下载时不超过 50 MB。
watchOS 的特定要求:应用程序必须能在没有活动 iPhone 的情况下正常工作(如果声明为独立),界面必须无需放大即可阅读,所有交互元素 — 尺寸至少 44 点。禁止复制内置功能(例如,没有附加价值的心率监测器)的应用程序。
| 要求 | 描述 |
|---|---|
| 应用程序大小 | 蜂窝下载最高 50 MB,通过 Wi-Fi 最高 4 GB |
| 独立模式 | Info.plist 中的 WKRunsIndependently = YES |
| 触摸目标 | 所有交互元素至少 44 pt |
| 安全性 | 未经同意,HealthKit 数据不得发送到服务器 |
| 性能 | 应用程序启动不超过 5 秒 |
常见问题
主要语言是 Swift 及 SwiftUI 框架。基于 UIKit 的 WatchKit 也受支持,但苹果建议所有新的 watchOS 项目使用 SwiftUI。Objective-C 仅用于 2019 年之前发布的旧应用程序。从 watchOS 7 开始,苹果的所有示例都只使用 SwiftUI。
从 watchOS 6 开始,Apple Watch 可以直接从 App Store 安装应用程序而无需 iPhone。但许多功能 — 数据同步、推送通知、地理位置 — 需要与 iPhone 配对。完全自主的应用程序从 watchOS 9 开始,在构建设置中设置 WKRunsIndependently 即可实现。
Apple Watch Series 9 的典型电池续航 — 混合模式下最长 18 小时。在带 GPS 和心率监测器的应用程序活跃使用时 — 5-7 小时。watchOS 10 通过 Smart Stack 和 BGTaskScheduler 优化能耗,将应用程序后台活动与 watchOS 9 相比减少最多 4 倍。
Watch Connectivity 框架提供四种方法:sendMessage(即时传输)、transferUserInfo(后台)、transferFile(最大 100 MB 的文件)和 updateApplicationContext(状态同步)。所有方法通过蓝牙或 Wi-Fi 工作,在连接断开时自动排队。
Apple Watch Series 9 和 Ultra 2 包括:加速度计、陀螺仪、光学和电学心率监测器、SpO2(血氧饱和度)、手腕温度传感器、气压计、指南针、GPS L1+L5 和麦克风。传感器访问 — 通过 HealthKit 和 Core Motion。心率和 SpO2 数据需要用户的明确许可。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。