watchOS:使用 SwiftUI 进行 Apple Watch 开发的基础知识

作者: IT Sectr 发布日期: 2026-02-07 阅读时间: 12 分钟

watchOS — 苹果公司为 Apple Watch 设计的操作系统,于 2015 年与第一代手表一同首次发布。watchOS 的应用程序开发使用 Swift 语言,并采用 SwiftUI 和 WatchKit 框架。特点:小型矩形屏幕、0.3 Wh 电池的有限能耗、通过蓝牙与 iPhone 紧密集成。根据 Counterpoint Research 的数据,Apple Watch 占据全球智能手表市场超过 30% 的份额。

要点

  • watchOS — 基于 XNU 内核、面向低能耗的 Apple Watch 操作系统
  • SwiftUI — 用于开发 watchOS 应用程序界面的主要框架
  • Watch Connectivity — Apple Watch 与 iPhone 之间的数据交换机制
  • Smart Stack — 在 watchOS 10 中引入的智能小组件堆栈
  • HealthKit — 用于访问传感器(心率、SpO2、温度、加速度计)的框架

什么是 watchOS?

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 开始支持。

watchOS 版本历史

首个版本 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 12015首个版本,仅限苹果原生应用程序
watchOS 22015开放 SDK,第三方应用程序,Watch Connectivity
watchOS 32016即时应用程序启动,Dock,Scribble
watchOS 62019手表上的 App Store,Cycle Tracking,Noise 应用
watchOS 92022药物管理,睡眠阶段,改进的跑步伴侣
watchOS 102023Smart Stack,Double Tap,新表盘

watchOS 架构

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 — 应用程序层

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。

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 年 9 月发布。系统从层级导航过渡到面向内容的导航:主屏幕变为 Smart Stack — 取代应用程序 Dock 的智能小组件堆栈。

Smart Stack

Smart Stack — 显示在表盘下方的垂直小组件列表。小组件根据上下文排序:早上显示天气和日历,白天显示活动和提醒,晚上显示冥想和睡眠准备。开发者可以通过 WidgetKit 为 watchOS 添加自定义小组件,使用与 iOS 17 相同的 API。

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 watchOSSmart Stack 的小组件watchOS 10
UIDoubleTapGestureDouble Tap 手势watchOS 10(S9+)
MapKit在手表上显示地图watchOS 10
NavigationStack新的导航范式watchOS 10
SwiftUI Keyframe逐帧动画watchOS 10

适用于 Apple Watch 的 SwiftUI

SwiftUI — 用于 watchOS 界面开发的主要框架。苹果从 watchOS 7 开始推荐所有新项目使用 SwiftUI。手表的 SwiftUI 使用与 iOS 相同的原则,但带有 watchOS 特定的修饰符和组件。

WatchOS 特定的 SwiftUI 组件

适用于 watchOS 的 SwiftUI 包括:带有页面样式的 TabView 用于在屏幕之间滑动,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 应用程序展示了 SwiftUI 中 watchOS 应用程序的典型结构:带有页面样式的 TabView 用于屏幕间滑动,与 HealthKit 集成以实时读取心率,WKNotificationScene 用于处理通知。带有脉冲动画的 SymbolEffect 利用 Neural Engine 的硬件加速实现流畅动画,无需 CPU 负担。

Digital Crown 和手势

Digital Crown — Apple Watch 侧面面板上的表冠。SwiftUI 提供 DigitalCrownRotation 用于将值与表冠旋转绑定。修饰符接受绑定、范围和步长。手势:tap(轻点)、longPress(长按)、swipe(轻扫)和 pan(拖动) — 所有手势均为 SwiftUI 标准手势,并针对手表屏幕尺寸进行了适配。

WatchKit 和 watchOS 应用程序组件

WatchKit — 使用 UIKit 方法的原始 watchOS 框架。虽然苹果推荐 SwiftUI,但 WatchKit 对于旧项目和特定任务仍然相关:WKInterfaceGroup 上的复杂动画以及与 SiriKit 的集成。

watchOS 应用程序的结构

watchOS 应用程序由两个目标组成:WatchKit Extension(逻辑和界面)和 iOS Companion App(设置和同步)。从 Xcode 15 开始,可以在没有 iOS 配套应用的情况下创建独立应用程序。界面在 Interface.storyboard(WatchKit)中描述,或通过 SwiftUI 以编程方式描述。

组件WatchKitSwiftUI
屏幕WKInterfaceControllerView
按钮WKInterfaceButtonButton
表格WKInterfaceTableList
WKInterfaceGroupVStack / HStack
图像WKInterfaceImageImage / AsyncImage
标签WKInterfaceLabelText
地图WKInterfaceMapMap(watchOS 10+)
表盘CLKComplicationDataSourceComplicationDescriptor

Complications — 表盘上的数据

Complication — 在 Apple Watch 表盘上显示数据的小组件。开发者实现 CLKComplicationDataSource 协议,为不同类型的表盘(圆形、矩形、模块化、特大)提供模板。watchOS 10 支持 ComplicationDescriptor — 适用于 SwiftUI 的简化 API。数据通过 Background Tasks 更新,周期最长为 30 分钟。

通过 Watch Connectivity 与 iPhone 集成

Watch Connectivity — 用于通过蓝牙或 Wi-Fi 在 Apple Watch 和 iPhone 之间交换数据的框架。配对的设备之间唯一的通信方式。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 MB。文件保存在接收设备的 Inbox 目录中。transferUserInfo 适用于最大 100 KB 的 JSON 数据。所有方法在后台工作:如果设备不可用,传输将排队并在连接恢复时自动继续。

发布 watchOS 应用程序

发布 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。

App Review 要求

watchOS 的特定要求:应用程序必须能在没有活动 iPhone 的情况下正常工作(如果声明为独立),界面必须无需放大即可阅读,所有交互元素 — 尺寸至少 44 点。禁止复制内置功能(例如,没有附加价值的心率监测器)的应用程序。

要求描述
应用程序大小蜂窝下载最高 50 MB,通过 Wi-Fi 最高 4 GB
独立模式Info.plist 中的 WKRunsIndependently = YES
触摸目标所有交互元素至少 44 pt
安全性未经同意,HealthKit 数据不得发送到服务器
性能应用程序启动不超过 5 秒

常见问题

watchOS 开发使用哪些语言?

主要语言是 Swift 及 SwiftUI 框架。基于 UIKit 的 WatchKit 也受支持,但苹果建议所有新的 watchOS 项目使用 SwiftUI。Objective-C 仅用于 2019 年之前发布的旧应用程序。从 watchOS 7 开始,苹果的所有示例都只使用 SwiftUI。

watchOS 应用程序需要 iPhone 吗?

从 watchOS 6 开始,Apple Watch 可以直接从 App Store 安装应用程序而无需 iPhone。但许多功能 — 数据同步、推送通知、地理位置 — 需要与 iPhone 配对。完全自主的应用程序从 watchOS 9 开始,在构建设置中设置 WKRunsIndependently 即可实现。

Apple Watch 在应用程序活动时的电池续航时间是多少?

Apple Watch Series 9 的典型电池续航 — 混合模式下最长 18 小时。在带 GPS 和心率监测器的应用程序活跃使用时 — 5-7 小时。watchOS 10 通过 Smart Stack 和 BGTaskScheduler 优化能耗,将应用程序后台活动与 watchOS 9 相比减少最多 4 倍。

如何在 iPhone 和 Apple Watch 之间传输数据?

Watch Connectivity 框架提供四种方法:sendMessage(即时传输)、transferUserInfo(后台)、transferFile(最大 100 MB 的文件)和 updateApplicationContext(状态同步)。所有方法通过蓝牙或 Wi-Fi 工作,在连接断开时自动排队。

Apple Watch 上有哪些传感器?

Apple Watch Series 9 和 Ultra 2 包括:加速度计、陀螺仪、光学和电学心率监测器、SpO2(血氧饱和度)、手腕温度传感器、气压计、指南针、GPS L1+L5 和麦克风。传感器访问 — 通过 HealthKit 和 Core Motion。心率和 SpO2 数据需要用户的明确许可。

总结

  • watchOS — 苹果基于 XNU 内核的智能手表操作系统,专注于能效和 iPhone 集成
  • SwiftUI — watchOS 的主要框架,提供声明式布局和自动屏幕尺寸适配
  • watchOS 10 引入了 Smart Stack、Double Tap(S9+)、NavigationStack 和用于小组件的 WidgetKit
  • Watch Connectivity — 通过蓝牙/Wi-Fi 与 iPhone 的唯一通信通道,具有四种传输模式
  • HealthKit 提供对 Apple Watch 传感器的访问:心率、SpO2、温度、加速度计、GPS
  • Complications — 表盘上的小组件,通过 CLKComplicationDataSource 或 SwiftUI 实现
  • 发布 需要 Apple Developer Program、最高 50 MB(蜂窝网络)的大小和严格的性能控制

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读