What's new in watchOS 26
2025年6月9日
一句话判断
watchOS 26 三件事最重要:Controls 上表了(Control Center + Smart Stack + Action Button)、RelevanceKit 让 widget 在对的时间出现、arm64 架构迁移。如果你有 Watch app,Controls 是第一个该做的新功能。
这场 Session 讲了什么
Anne 围绕三个主题展开:
watchOS 26 基础更新:Liquid Glass 设计系统全面应用(toolbar/control 样式自动更新,不需要改代码)。App 图标通过 Icon Composer 更新,在通知、app 网格等所有位置生效。Apple Watch Series 9 和 Ultra 2 迁移到 arm64 架构。Xcode 中使用 Standard Architectures build setting 即可,Xcode 14 起就支持 arm64,Apple Watch Simulator 一直在用 arm64。
Controls 上表:watchOS 26 支持将 Controls 放入 Control Center、Smart Stack,并与 Action Button(Ultra)配合使用。Controls 基于 WidgetKit 构建,提供 symbol、title、tint color 和上下文信息。关键特性:iPhone app 的 controls 可以在 Apple Watch 上显示并远程执行 iPhone 上的操作(不需要 Watch app)。如果 Watch app 存在,可以在 Watch 上本地执行操作。Smart Stack 现在同时支持 Controls、Widgets 和 Live Activities,选择依据:Controls = 执行操作、Widgets = 显示信息、Live Activities = 有明确起止的事件。
widget 可配置化:watchOS 26 支持在 Watch 上配置 widgets 和 controls(与 iOS 相同的方式)。返回空 recommendations 数组即可标记 widget 为可配置。
RelevanceKit:新框架,基于上下文(时间、睡眠、健身、位置、POI 类别)建议 Smart Stack 中的 widget 内容。新增 Relevant Widget — 不同于 Timeline Widget 的单时间线,Relevant Widget 可以同时建议多个卡片(解决同一时间多个事件的展示问题)。使用 RelevanceEntriesProvider + RelevanceConfiguration 构建。通过 associatedKind modifier 关联 Timeline Widget 避免重复显示。
其他更新:MapKit 路由和本地搜索登陆 watchOS。Widget push updates 通过 APNs 推送更新。HealthKit workout app 可基于用户习惯在 Smart Stack 中被建议。
值得深挖的点
-
Controls 的远程执行模式是个新范式。iPhone app 注册的 control 在 Watch 上显示,点击后在 iPhone 上执行操作。这意味着你不需要 Watch app 就能把手表变成 iPhone 的遥控器。但 foreground iPhone app 的 control 不会在 Watch 上显示。
-
Relevant Widget 解决了 Timeline Widget 的固有缺陷。当同一时间有多个事件时,Timeline Widget 只能显示一个视图(可能被截断),Relevant Widget 可以建议多个独立卡片。
-
associatedKind避免重复显示。如果用户手动添加了你的 Timeline Widget,系统建议的 Relevant Widget 会替换它而不是并存,确保每个事件只显示一张卡片。 -
arm64 迁移几乎无感。如果你已经在用 Standard Architectures 并且用 Simulator 测试,你已经在用 arm64。注意 Float/Int/指针运算的类型差异。
代码片段
创建 Relevant Widget:
struct BeachEventEntry: RelevanceEntry {
let event: BeachEvent
}
struct BeachEventsProvider: RelevanceEntriesProvider {
func relevance() async throws -> WidgetRelevance<BeachEventConfig> {
var attributes: [WidgetRelevanceAttribute<BeachEventConfig>] = []
for event in events {
let context = RelevantContext.date(event.date)
attributes.append(
WidgetRelevanceAttribute(
context: context,
configuration: BeachEventConfig(event: event)
)
)
}
return WidgetRelevance(attributes)
}
func entries(
for relevance: [RelevantContext],
in context: RelevanceContext
) async throws -> [BeachEventEntry] {
// 根据 relevant context 返回对应 entry
}
}
let widget = Widget {
RelevanceConfiguration(
kind: "BeachEvents",
provider: BeachEventsProvider()
) { entry in
BeachEventView(event: entry.event)
}
}
.associatedKind("BeachEventsTimeline") // 避免重复
最佳实践
-
优先做 Controls。这是投入产出比最高的新功能 — 用与 iOS 相同的 API,用户可以在 Control Center 和 Smart Stack 中快速访问你的 app 功能。
-
如果你有 Watch app 但没有独立 Watch 功能,至少让 iOS controls 在 Watch 上可用。用户在 Watch 上点击,在 iPhone 上执行。
-
用 RelevanceKit 增强 widget 适时性。如果你的 widget 内容与位置/时间/活动相关,用 RelevantContext 告诉系统什么时候建议它。
-
测试 arm64 兼容性。虽然大部分代码不需要改,但涉及底层指针运算和类型转换的代码需要验证。
-
Widget push updates 是 ClockKit complication 迁移的最后拼图。如果你之前因为缺少 push 更新而没有迁移 ClockKit,现在是时候了。
还有什么值得关注
- MapKit 路由(驾车/步行/骑行)和本地搜索首次登陆 watchOS,独立 Watch app 可以直接显示路线。
- RelevanceKit 的 POI 类别支持意味着”到达超市时自动显示购物清单 widget”这类场景可以轻松实现。
- 如果你的 Watch app 使用 HealthKit 记录 workout,系统可能在 Smart Stack 中基于用户习惯建议你的 workout app。