Watch App:什么是Watch App,Apple Watch 和 Wear OS 开发

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

Watch App — 适用于可穿戴设备的应用程序:运行 watchOS 的 Apple Watch 和 Google 的 Wear OS 智能手表。与移动应用程序不同,Watch App 针对小屏幕(对角线 1.5–2 英寸)、短交互会话(5–15 秒)和特定场景进行了优化——健身、通知、快速回复、语音输入。开发使用 SwiftUI 面向 Apple Watch,使用 Kotlin 和 Jetpack Compose for Wear OS 面向 Android。我们将探讨两个平台的关键概念、架构、导航和代码示例。

要点

  • Watch App — 适用于智能手表的应用程序,会话短(5–15 秒),屏幕有限
  • Apple Watch 使用 watchOS 和 SwiftUI、WatchKit,严格的层级导航
  • Wear OS 使用 Kotlin 和 Jetpack Compose for Wear OS、Material You 及侧边导航
  • 独立性 — 手表的 LTE 版本允许应用程序无需连接智能手机即可工作
  • 传感器 — 加速度计、陀螺仪、心率监测器、GPS 均可通过两个平台的原生 API 访问

什么是 Watch App

Watch App — 是专为可穿戴设备设计的应用程序:Apple Watch(watchOS)和 Wear OS 智能手表。与移动应用的主要区别在于形态因素。手表屏幕对角线为 1.5–2 英寸(而智能手机为 6–7 英寸),这限制了同时显示的信息量。与应用交互时间短——用户在 5–15 秒内检查时间、通知、心率或步数,然后放下手腕。

Watch App 的关键场景:健身追踪器(步数、心率、卡路里、睡眠)、通知(消息、电话、日历)、快速操作(启动计时器、语音回复消息、控制音乐)、伴侣(相机遥控器、汽车钥匙、NFC 支付)。根据 Counterpoint Research(2026)的数据,全球智能手表市场每年超过 1.5 亿部,其中 Apple Watch 占 35%,Wear OS 占 20%,其余为 Fitbit、Garmin 等。

Watch App 的限制:小屏幕(不超过 2 英寸)、电池续航有限(18–24 小时)、没有完整键盘(仅语音输入或听写)、后台任务限制(watchOS — 最多 10 分钟,Wear OS — 最多 5 分钟)、大多数功能需要与手机同步。从 watchOS 6(2019)和 Wear OS 3(2022)开始,应用程序可以通过 LTE 模块独立运行,无需与手机配对。

Apple Watch:watchOS 和 SwiftUI

watchOS — 苹果公司为智能手表开发的操作系统,基于 iOS 并使用相同的框架(Foundation、UIKit 的适配版本、SwiftUI)。开发在 Xcode 中使用 Swift 进行。主要 UI 框架是 SwiftUI,它提供 watchOS 特定组件:带轮播的 TabView、NavigationStack、通过 DigitalCrownModifier 的数字表冠(Digital Crown)、长按菜单。

watchOS 的导航基于层级范式。主要元素:层级栈(NavigationStack 带自动返回)、模态展示(sheet)、基于页面的导航(通过 TabView 和 .tabViewStyle(.page))、长按时上下文菜单。Digital Crown 允许滚动内容和更改值。手势:点击、长按、滑动、Force Touch(watchOS 7 之前)、旋转 Digital Crown。

watchOS 的关键框架:HealthKit(访问健康数据——心率、步数、睡眠、心电图)、CoreMotion(加速度计、陀螺仪)、WatchConnectivity(与 iPhone 的数据交换)、ClockKit(表盘上的复杂功能)、BackgroundTasks(后台更新最多 10 分钟)、ARKit(Series 9+ 上带效果的 FaceTime)。Watch App 可以是完整的(Dock 中的独立应用程序)或扩展(与 iOS 版本同时运行)。

Wear OS:Kotlin 和 Compose

Wear OS — Google 用于智能手表的平台,基于 Android。现代开发使用 Kotlin 和 Jetpack Compose for Wear OS 进行——一套针对圆形屏幕优化的组件:Scaffold、ScalingLazyColumn、Chip、Button、Card、Stepper。与移动 Compose 不同,Wear OS 使用自己的修饰符:scrollable 用于垂直滚动,swipable 用于滑动,RotaryInput 用于控制表冠。

Wear OS 的导航使用侧边面板(SwipeToDismiss)和卡片式屏幕。主要元素:SwipeDismissableNavHost(通过滑动返回的导航)、屏幕定位(用于列表的 ScalingLazyColumn)、水平轮播(Carousel)、表盘(通过 WatchFaceService 的 WatchFace)。Google 建议使用侧边滑动返回和垂直滚动列表。手表上的电源按钮打开最近应用列表。

Wear OS 的健康和传感器:Health Services API(通过数据提供商获取步数、心率、卡路里、睡眠、SpO2)、SensorManager(加速度计、陀螺仪、气压计、磁力计)、Location Services(通过 FusedLocationProvider 的 GPS)。Wear OS 5+ 支持跑步、步行、骑自行车和游泳的跟踪,并自动检测活动类型。数据通过 Health Connect 与 Google Fit 同步。

代码示例:用于 Apple Watch 的 Swift

我们来看一个使用 SwiftUI 和 HealthKit 在 Apple Watch 上追踪心率的应用。

swift
import SwiftUI
import HealthKit

// 心率数据模型
struct HeartRateData: Identifiable {
    let id = UUID()
    let bpm: Double
    let date: Date
}

// HealthKit 的 ViewModel
@Observable
final class HealthViewModel {
    private let healthStore = HKHealthStore()
    var currentHeartRate: Double = 0
    var isAuthorized: Bool = false

    func requestAuthorization() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let types = Set([heartRateType])
        healthStore.requestAuthorization(toShare: nil, read: types) { success, _ in
            Task { @MainActor in
                self.isAuthorized = success
                if success { self.startHeartRateQuery() }
            }
        }
    }

    func startHeartRateQuery() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let query = HKObserverQuery(
            sampleType: heartRateType, predicate: nil
        ) { [weak self] _, _, _ in
            self?.fetchLatestHeartRate()
        }
        healthStore.execute(query)
    }

    private func fetchLatestHeartRate() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let query = HKSampleQuery(
            sampleType: heartRateType, predicate: nil,
            limit: 1, sortDescriptors: [sort]
        ) { _, samples, _ in
            guard let sample = samples?.first as? HKQuantitySample else { return }
            let bpm = sample.quantity.doubleValue(for: HKUnit.count().unitDivided(by: .minute()))
            Task { @MainActor in
                self.currentHeartRate = bpm
            }
        }
        healthStore.execute(query)
    }
}

// 主屏幕
struct HeartRateView: View {
    @State private var viewModel = HealthViewModel()

    var body: some View {
        VStack {
            Image(systemName: "heart.fill")
                .foregroundColor(.red)
                .font(.largeTitle)

            Text("\(Int(viewModel.currentHeartRate))")
                .font(.system(size: 60, weight: .bold, design: .rounded))
                .foregroundColor(.red)

            Text("BPM")
                .font(.caption)
                .foregroundColor(.secondary)
        }
        .padding()
        .onAppear(perform: viewModel.requestAuthorization)
    }
}

关键点:HKHealthStore 请求访问 HealthKit 数据;HKObserverQuery 实时通知心率变化;HKSampleQuery 获取最新值。由于 @Observable,Watch App 在 currentHeartRate 变化时自动更新 UI。HealthKit 在设备本地处理数据——不需要服务器请求。

代码示例:用于 Wear OS 的 Kotlin

使用 Kotlin、Jetpack Compose 和 Health Services API 为 Wear OS 开发类似应用。

kotlin
// MainActivity.kt
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.wear.compose.material.*
import androidx.wear.compose.foundation.arc.BasicArcParams
import com.google.android.horologist.health.HealthService

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            WearAppTheme {
                HeartRateScreen()
            }
        }
    }
}

@Composable
fun HeartRateScreen() {
    var heartRate by remember { mutableIntStateOf(0) }
    var isConnected by remember { mutableStateOf(false) }

    LaunchedEffect(Unit) {
        // HealthService — 用于访问传感器的 API
        val healthService = HealthService()
        healthService.connect().onSuccess {
            isConnected = true
        }
    }

    Scaffold(
        timeText = { TimeText() },
        vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }
    ) {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .scrollable(state = ScrollState),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            Icon(
                imageVector = Icons.Filled.Favorite,
                contentDescription = "心率",
                modifier = Modifier.size(40.dp),
                tint = MaterialTheme.colors.error
            )

            Text(
                text = heartRate.toString(),
                style = MaterialTheme.typography.display1
            )
            Text(
                text = "BPM",
                style = MaterialTheme.typography.caption2
            )
        }
    }
}

Wear OS 的关键组件:Scaffold 搭配 TimeText 和 Vignette 实现典型布局;.scrollable() 修饰符确保与圆形屏幕兼容;HealthService(Horologist)用于访问心率传感器。Jetpack Compose for Wear OS 自动适配圆形和方形屏幕——开发者无需手动处理不同的形态因素。

常见问题

Watch App 与移动应用有何不同?

Watch App 屏幕有限(对角线 1.5–2 英寸),使用小容量电池并通过手势控制。交互时间短——5–15 秒,应用应尽可能简洁并显示 1–2 个关键指标。

Watch App 使用哪些编程语言?

Apple Watch 使用 Swift 语言和 SwiftUI、WatchKit 框架。Wear OS 使用 Kotlin 语言和 Jetpack Compose for Wear OS。两个平台都支持声明式方法来构建界面。

Watch App 可以在没有 iPhone 的情况下工作吗?

可以,从带 LTE 的 Apple Watch Series 3 和 watchOS 6+ 开始,应用可以通过手表上的 App Store 独立运行。Wear OS 也支持带 LTE 的版本,通过手表上的 Google Play 独立运行。

Watch App 有哪些限制?

主要限制:屏幕尺寸(不超过 2 英寸)、电池续航有限(不超过 18 小时)、没有完整的浏览器和键盘、后台任务限制(watchOS — 最多 10 分钟,Wear OS — 最多 5 分钟)。

如何访问手表上的传感器?

在 Apple Watch 上,使用 HealthKit(HKHealthStore、HKSampleQuery)访问心率、步数、睡眠,使用 CoreMotion 访问加速度计。在 Wear OS 上,使用 Health Services API(通过 Horologist)获取健康指标,使用 SensorManager 获取传感器原始数据。

总结

  • Watch App — 适用于智能手表的应用程序,会话 5–15 秒,屏幕限制在 2 英寸以内
  • Apple Watch 使用 watchOS 和 SwiftUI、NavigationStack、Digital Crown 以及用于传感器访问的 HealthKit
  • Wear OS 使用 Kotlin 和 Jetpack Compose for Wear OS、Scaffold、ScalingLazyColumn 以及 Health Services API
  • 独立性 — LTE 模块允许应用在两个平台上无需连接智能手机即可工作
  • HealthKit(watchOS)和 Health Services(Wear OS)提供对心率、步数、睡眠和 SpO2 的访问
  • 限制 — 小屏幕、18–24 小时电池、后台任务限制、缺少键盘
  • 主要场景 — 健身追踪器、通知、快速回复、遥控器、NFC 支付

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

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

讨论项目

另请阅读