watchOS 11 新特性一览
What’s new in watchOS 11
2024年6月10日
一句话判断
watchOS 11 让 Smart Stack 变成了 Apple Watch 上最聪明的信息入口——Live Activities 自动上屏、Widget 按场景智能推荐、按钮直接可交互,你的 App 不再需要用户刻意打开。
这场 Session 讲了什么
watchOS 11 的核心变化都围绕 Smart Stack 展开。去年 Smart Stack 引入了 Widget 卡片的概念,今年 Apple 给它加了三把火:Live Activities 从 iPhone 自动同步到手表、RelevantContext API 让 Widget 按时间和场景自动浮现、Interactive Widgets 让用户在 Widget 上直接操作而不用打开 App。
对开发者来说,这三件事叠加在一起意味着一个策略转变:与其费劲优化手表端 App 的打开率和停留时长,不如把关键信息和操作前移到 Smart Stack 里。用户转一下表冠就能看到航班状态、回复消息、控制智能家居——你的 App 能在这个场景里露脸,比等用户打开 App 有效得多。
另外还有 Double Tap 手势在 App 内的导航支持,以及 HealthKit 和 WorkoutKit 的增量更新。
值得深挖的点
RelevantContext:让系统知道你的 Widget 什么时候有用
Smart Stack 的空间有限,系统需要决定优先展示哪些 Widget。RelevantContext API 就是你的投票权——你告诉系统”这个 Widget 在什么时间、什么地点、什么状态下有用”,系统综合所有 Widget 的投票做排序。
支持的场景维度比预想的丰富:日期时间、GPS 定位(精确或模糊)、睡眠状态(起床后推荐)、健身状态(活动环未完成时推荐)。Reminders 用日期关联,Coffee Shop 用位置关联,健身类 App 用活动环状态关联。
有一个容易忽略的点:如果你的 Widget 使用 AppIntentConfiguration,可以针对不同的 Intent 配置分别提供 Relevance。比如咖啡店 App 可以为每个收藏门店设置不同的位置半径,当用户靠近某家店时只推荐对应门店的 Widget。
但要注意,系统是全局统筹的——你提交了 Relevance 不代表 Widget 一定会出现。滥用的话只会让系统降低对你 App 的信任权重。
Interactive Widgets + AccessoryWidgetGroup
watchOS 上的 Interactive Widgets 跟 iOS 17 的机制一致:在 Widget View 里放 Button 或 Toggle,在 Intent 的 perform() 方法里执行操作。但手表的屏幕太小,交互区域必须精准。
AccessoryWidgetGroup 是为手表量身定做的模板:一个 Label + 最多 3 个 Content View,字体大小和间距全部预配置好。Messages Widget 用它展示 3 个置顶联系人,Home Widget 用它控制 3 个智能设备。
requestConfirmation(.lowConfidenceSource) 是一个贴心的安全阀——当系统判断当前操作可能是误触(比如用户在上班时远程开家门),会弹出确认提示。你不需要自己判断场景,系统帮你兜底。
代码片段
Live Activity 在手表端自定义展示
ActivityConfiguration(attributes: MyAttributes.self) {
// iPhone Lock Screen 的展示
LockScreenLiveActivityView(/* ... */)
} dynamicIsland: { /* ... */ }
.supplementalActivityFamilies([.small])
// 用 environment 区分平台
.contentMargins(.vertical, isWatch ? 4 : 12)
场景:iOS 的 Live Activity 自动同步到手表 Smart Stack,但默认显示 Dynamic Island 的内容。用 .supplementalActivityFamilies(.small) 提供手表专用布局。坑:不设置这个 modifier,手表会用 Dynamic Island 的紧凑视图,信息量很少。
RelevantContext 让 Widget 按场景浮现
struct MyTimelineProvider: TimelineProvider {
func relevances() async -> WidgetRelevances<MyIntent> {
// 睡眠后推荐今日待办
let sleepContext = RelevantContext.sleep
let entry = WidgetRelevanceEntry(relevanceContexts: [sleepContext])
return WidgetRelevances([entry])
}
}
场景:Todo 类 App 在用户起床后自动推荐今日待办 Widget。坑:Relevance 不是强制展示,系统会和其他 App 竞争排序。选好时机比覆盖所有场景更重要。
AccessoryWidgetGroup 交互模板
AccessoryWidgetGroup {
Label("智能家居")
Content {
Button(intent: LockDoorIntent()) {
Image(systemName: "lock")
}
Button(intent: ToggleLightIntent()) {
Image(systemName: "lightbulb")
}
Link(destination: .allDevices) {
Image(systemName: "ellipsis")
}
}
}
.accessoryWidgetGroupStyle(.roundedSquare)
场景:手表上 3 个快捷操作按钮,最后一个点击跳转 App 查看全部设备。坑:Content 最多展示 3 个 View,多传的会被静默忽略。空位系统会自动填充空 View。
最佳实践
已有项目迁移:如果你有 iOS Live Activity,watchOS 11 自动同步,零成本获得手表端曝光。下一步是为手表提供 .small family 的自定义视图,信息密度比 iPhone 版更高。Interactive Widgets 的迁移跟 iOS 17 一样,把关键操作提取成 AppIntent 就行。
新项目起步:如果你的 App 有”时间敏感”或”场景敏感”的信息(通勤、外卖、运动、待办),RelevantContext 应该是第一优先级——投入小、回报高。AccessoryWidgetGroup 模板能让你快速做出合格的 watchOS Widget,不用在布局细节上花太多时间。
还有什么值得关注
- Double Tap 手势现在支持 App 内导航和操作触发,不需要额外适配,SwiftUI 的 Button 等控件自动响应。
- HealthKit 新增了
pregnancy相关的健康数据类型,WorkoutKit 支持自定义游泳配速区间。 - Widget 的
invalidateRelevances()方法让你在用户行为变化后(比如改了收藏门店)主动刷新推荐。