What's new in watchOS 26
Health & Fitness 进阶 0m

What's new in watchOS 26

2025年6月9日

在 Apple 官方观看视频

一句话判断

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 中被建议。

值得深挖的点

  1. Controls 的远程执行模式是个新范式。iPhone app 注册的 control 在 Watch 上显示,点击后在 iPhone 上执行操作。这意味着你不需要 Watch app 就能把手表变成 iPhone 的遥控器。但 foreground iPhone app 的 control 不会在 Watch 上显示。

  2. Relevant Widget 解决了 Timeline Widget 的固有缺陷。当同一时间有多个事件时,Timeline Widget 只能显示一个视图(可能被截断),Relevant Widget 可以建议多个独立卡片。

  3. associatedKind 避免重复显示。如果用户手动添加了你的 Timeline Widget,系统建议的 Relevant Widget 会替换它而不是并存,确保每个事件只显示一张卡片。

  4. 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") // 避免重复

最佳实践

  1. 优先做 Controls。这是投入产出比最高的新功能 — 用与 iOS 相同的 API,用户可以在 Control Center 和 Smart Stack 中快速访问你的 app 功能。

  2. 如果你有 Watch app 但没有独立 Watch 功能,至少让 iOS controls 在 Watch 上可用。用户在 Watch 上点击,在 iPhone 上执行。

  3. 用 RelevanceKit 增强 widget 适时性。如果你的 widget 内容与位置/时间/活动相关,用 RelevantContext 告诉系统什么时候建议它。

  4. 测试 arm64 兼容性。虽然大部分代码不需要改,但涉及底层指针运算和类型转换的代码需要验证。

  5. Widget push updates 是 ClockKit complication 迁移的最后拼图。如果你之前因为缺少 push 更新而没有迁移 ClockKit,现在是时候了。

还有什么值得关注

  • MapKit 路由(驾车/步行/骑行)和本地搜索首次登陆 watchOS,独立 Watch app 可以直接显示路线。
  • RelevanceKit 的 POI 类别支持意味着”到达超市时自动显示购物清单 widget”这类场景可以轻松实现。
  • 如果你的 Watch app 使用 HealthKit 记录 workout,系统可能在 Smart Stack 中基于用户习惯建议你的 workout app。
Health & Fitness Maps & Location SwiftUI