View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

大多数浏览器和
Developer App 均支持流媒体播放。

  • 简介
  • 转写文稿
  • 代码
  • watchOS 26 的新功能

    了解 watchOS 26 的新功能,以及如何将这些功能整合到你的 watchOS 和 iOS App 中。探索 ARM64 架构,并深入了解全新设计系统。我们还将介绍小组件方面的更新,并就如何将控件引入 Apple Watch 提供一些建议。

    章节

    • 0:00 - 简介
    • 0:56 - 为迎接 watchOS 26 更新 App
    • 3:48 - 将 App 引入新位置
    • 9:44 - 提供相关且最新的信息

    资源

    • Creating controls to perform actions across the system
    • Increasing the visibility of widgets in Smart Stacks
    • Making a configurable widget
    • MapKit
    • Migrating ClockKit complications to WidgetKit
    • Workouts and activity rings
      • 高清视频
      • 标清视频

    相关视频

    WWDC25

    • 了解 Liquid Glass
    • 使用 Icon Composer 构建图标
    • 小组件的新功能

    WWDC24

    • 将 App 控制扩展到系统级别

    WWDC23

    • 认识 SwiftUI 版 MapKit

    WWDC22

    • 进一步了解 WidgetKit 中的复杂功能
  • 搜索此视频…

    大家好 欢迎观看这个视频 我是 Anne 很高兴在这里跟大家分享 watchOS 26 一些出色的新功能 以及在 App 中使用新功能的方法 我将介绍 watchOS 26 的新变化 如何让你的 watchOS 和 iOS App 在 Apple Watch 中的更多位置呈现 如何通过新方法 及时推送 App 的相关内容 在介绍过程中 我将构建一个 App 它能显示附近海滩的健康和娱乐活动 当用户参加海滩活动时它会报告海况 跟踪用户的正念分钟数 即使用户在别处进行冥想 它也能模拟海边的环境 让我们开始吧 watchOS 26 从里到外都进行了升级 不仅外观焕然一新 还采用了新的系统架构 为了使 App 能够充分利用 watchOS 你需要了解几项新变化 watchOS 使用了新的设计系统 整个操作系统焕然一新 具体变化包括 材质和控件更新、App 图标更新 表盘和控制中心等系统空间也有变化 watchOS 26 的工具栏和控件样式 进行了更新 所有为 watchOS 10 及更高版本构建 的 App 都会自动应用新样式 与系统的整体风格保持一致 运行你的 App 来验证界面外观 检查自定样式 确保用户界面元素 在新的系统样式下可正常显示 有关 App 设计和更新的更多信息 请观看视频“了解 Liquid Glass”

    在 iOS 和 watchOS 26 中 App 图标有了新外观

    请使用 Icon Composer 来更新你的 App 图标 更新后的 iOS App 图标会显示在 从 iPhone 转发到 Apple Watch 的通知中 更新后的 Watch App 图标会显示在 App 网格和列表中 以及直接发送到 Apple Watch 的通知中 要进一步了解 Icon Composer 以及 App 图标的所有新特性 请观看视频 “使用 Icon Composer 构建图标” 除了新的设计系统 watchOS 还支持新的系统架构 Apple Watch Series 9 及更新表款 和 Apple Watch Ultra 2 现在 在 watchOS 26 中使用 ARM64 架构 在 Xcode 中 为你的 Apple Watch 目标 使用标准架构的构建设置 这会将你的目标配置为 支持所有 Apple Watch 架构 注意 ARM64 上的类型差异 特别是在使用 Float 和 Int 以及运行基于指针的计算时 务必在模拟器和设备上都进行测试 Xcode 14 及更高版本已支持 针对 ARM64 架构 构建 Apple Watch App Apple Watch 模拟器始终 在 Apple 芯片上使用 ARM64 架构 好消息是 如果你已经在使用标准架构进行构建 那么就表示已支持 ARM64 如果你已经在使用模拟器进行测试 那么就是在使用 ARM64 测试 watchOS 26 全新的设计系统和架构 就先介绍到这里 接下来 我们来看看用户可以在哪些新的位置 与你的 App 交互 从 watchOS 26 开始 Apple Watch 上可以使用控件 用户可以将控件放在 控制中心和智能叠放中 并将控件与 Apple Watch Ultra 上的操作按钮搭配使用 控件使用 WidgetKit 来构建 借助控件 用户无需打开 App 即可快速执行操作 或打开 App 中的特定界面 控件向系统提供图标、标题、 着色颜色和其他背景信息 用户可以将控件添加到 任何受支持的系统空间中 而系统空间会根据情境来显示控件

    用户可以将 iPhone App 的控件 添加到 Apple Watch 上的系统空间中 即使你并不提供 Watch App 在 Apple Watch 上轻点控件后 操作会在配对的 iPhone 上执行 由于操作在 iPhone 上执行 当控件操作在 iPhone App 前台运行 这些控件将不会显示 在 Apple Watch 上 如果你提供 Watch App 在构建 Apple Watch 控件时 可以使用构建 iOS 控件时 所用的相同 API 轻点控件后 操作会在 Apple Watch 上执行

    智能叠放现在支持控件、 小组件和实时活动 在智能叠放中显示内容的方式这么多 究竟应该选择哪一种? 这个时候 你应该考虑主要目的 如果主要目的是执行操作 那么请构建控件 例如在 App 中更改设置 或打开连接互联网的设备 如果需要全天持续显示信息 则应该构建小组件 例如显示天气信息或活动预告 实时活动则适合用于 有明确起点和终点的事件 例如体育比赛的比分或航班动态 要开始构建控件并了解更多详细信息 请观看 Cliff 的视频 “将 App 控制扩展到系统级别” 有些用户可能想要在 App 中 自定小组件和控件 在 iOS 中 用户编辑小组件的方法是 从你向系统提供的配置中进行选择 从 watchOS 26 开始 用户可以通过同样的方式 自定小组件和控件 小组件可以表明自己是可配置的 而不是提供预配置的建议 现在 我将更改我的小组件的配置 以查看 Amelia Island 的活动日程 要将小组件设为可配置 返回空的建议数组 以表明没有预配置的小组件 并且用户可以 在表盘或智能叠放中配置小组件 如果你想要将现有小组件设为可配置 请添加 watchOS 26 可用性检查 返回空数组 以表明 小组件在支持的版本中是可配置的 对于更早的版本 则继续返回 App Intent 建议数组 用户也可以配置控件 例如 在我的海滩 App 中 我想为冥想计时器控件 提供一个额外的配置 人们无法随时去到海边 所以我想提供一个选项 让 App 在冥想期间播放海浪的声音 要使控件可配置 请使用 AppIntentControlConfiguration 来描述控件 跟你在 iOS 上的做法一样 并将值提供程序设为 AppIntentControlValueProvider watchOS 26 中的智能叠放不仅可以 加入控件 如果你的 Watch App 使用 HealthKit 来记录用户的锻炼活动 系统可以根据用户的锻炼习惯 在智能叠放中建议你的 App 用户可以轻点它 快速开始锻炼

    为了确保系统在智能叠放中 正确建议你的体能训练 App 请指定正确的 HKWorkoutActivityType 记录准确的锻炼开始和结束时间 并使用 HKWorkoutRouteBuilder 在锻炼过程中添加位置信息 为了能让 App 在更多位置提供体验 watchOS 26 中的 MapKit 增加了许多新功能 你可以搜索一个感兴趣的地点 比如杂货店 获取到这个地点的路线 交通方式可以是驾车、步行、骑行 并使用 SwiftUI 在地图上叠加路线 所有这些功能都可以通过 你已熟悉的 iOS API 来实现 对于需要查找附近地点并显示路线的 独立 Watch App 这是一种非常好用的方法 在这里 我展示了去海滩的路线 要进一步了解路线和本地搜索 请观看 Jeff 的视频 “认识 SwiftUI 版 MapKit” 从自定控件、控制中心、 表盘上的体能训练 App 建议 到 MapKit 的新功能 watchOS 26 提供了众多方式 让你可以在系统中的更多位置 提供 App 体验

    关于 watchOS 26 我还将介绍 最后一个部分:如何通过新方法 在智能叠放中打造 基于情境的相关体验 你可以在最恰当的时候显示 用户需要的信息和操作 并使这些信息保持最新状态 watchOS 26 引入了一个新框架 RelevanceKit RelevanceKit 可以在用户需要时 显示最相关的内容

    RelevanceKit 中有许多 相关上下文类型 使你可以根据上下文线索 在智能叠放中建议小组件 相关上下文包括日期、睡眠习惯、 健身信息和位置 在 watchOS 26 中 小组件也可以与兴趣点类别相关 当用户身处某个类别的地点时 小组件即具有相关性 例如 地点类别可以是杂货店、 咖啡厅,甚至是海滩 在我的海滩 App 中 我希望当用户身处海滩时 智能叠放中显示当前的海况 为 MapKit 兴趣点类别创建 一个位置 RelevantContext 如果是不支持的类别 则返回 nil 对于小组件的所有相关上下文 返回包含属性的 WidgetRelevance 除了 RelevanceKit watchOS 26 还引入了 一个专用于智能叠放的小组件新配置 全新的相关小组件 由 RelevanceKit 实现 可让你选择小组件中显示的视图 系统会根据特定 RelevantContext 来建议视图 例如兴趣点或者一天中的某个时间 相关小组件仅在智能叠放中显示 系统可能会同时建议多个视图 在 watchOS 26 中 相关小组件有很多实用的用途 例如 显示多个即将开始的日历日程 显示小组件以快速启动 最近编辑的笔记 显示即将前往的度假地的天气预报 “我的海滩活动”小组件 显示某个地点一天之中的活动安排 我可以对它进行优化 将它设置为一个相关小组件 这是“我的海滩活动”小组件的 示例日历 有些活动的时间是重叠的 为了构建现有的“时间线”小组件 我需要把条目放到一个时间线中 但多项活动的时间有重叠 所以时间线中有些条目 包含多项活动 以表示时间有重叠 将活动日历和时间线进行对比 在 9:30 时间线显示正常 一个视图包含两项活动 分为两行显示 但 10 点钟有三项活动同时进行 我试图将三项活动都放在小组件中 但视图被截断了 我需要选择显示哪两项活动 相关小组件可以解决这个问题 当存在多个相关活动时 比如说在早上 10 点 系统可以在智能叠放中建议多个卡片 每个卡片显示一项活动 我将说明如何为海滩活动 创建相关小组件 首先我们快速回顾一下小组件的结构 小组件的基本组成部分是条目 条目包含呈现小组件视图需要的 所有数据 条目由条目提供程序创建 条目提供程序还会告知 WidgetKit 何时更新小组件的视图 配置创建条目提供程序 并使用条目和其他信息 生成 SwiftUI 视图 在创建基于时间线的小组件时 这些类型分别称为 TimelineEntry、 AppIntentTimelineProvider 和 AppIntentConfiguration 创建相关小组件与时间线小组件类似 相关小组件的基本组成部分是 RelevanceEntry

    条目由 RelevanceEntriesProvider 创建 并提供给 RelevanceConfiguration 我们来看构建相关小组件的步骤 从 RelevanceEntry 开始 我将为我的海滩 App 创建一个 RelevanceEntry 条目包含海滩活动 具有填充小组件视图所需的所有数据 活动的地点、名称和日期 接下来我将实现 RelevanceEntriesProvider 相关性方法会告诉系统 小组件何时具有相关性 我将在其中创建 WidgetRelevanceAttribute 的数组 以便将海滩活动的 WidgetConfigurationIntent 与包含线索的 RelevantContext 相关联 线索表明何时应向用户提供信息 也就是海滩活动的日期 然后 我将返回 包含这些属性的相关性 当小组件具有相关性时 系统会调用条目 并向 App 提供相关的 WidgetConfigurationIntent 和一些上下文信息 包括小组件的显示大小 以及小组件是否显示为预览 预览显示在小组件建议设置中 这个设置在“设置”App 中提供 或在编辑智能叠放时显示 返回一个预览条目 其中包含用于填充设置视图的数据 这里是预览小组件的一个示例 “在 Playalinda 冲浪” 否则 使用配置中的信息 比如我的海滩活动 来创建将填充小组件视图的条目 当小组件正在加载但尚未填充数据时 系统会向提供程序请求占位条目 例如 如果小组件需要下载新数据 来填充小组件 条目方式可能无法及时返回 返回占位条目来表明 信息过时或正在加载 在我的小组件中 我将返回一个条目 以在视图中显示加载指示器 最后 我将创建小组件 在小组件的正文中 返回 RelevanceConfiguration 使用提供程序和闭包 以及当前的 RelevanceEntry 创建 小组件的视图 现在 当有多项海滩活动即将开始时 智能叠放可以建议多个卡片 我的 App 仍然提供时间线小组件 来显示海滩活动 用户可以将它添加到智能叠放 如果用户将时间线小组件 添加到智能叠放 系统将为同一项活动显示两个卡片 一个来自用户添加的时间线小组件 另一个则是相关小组件建议的卡片 为了避免这种重复情况 将 RelevanceConfiguration 与时间线小组件的 WidgetConfiguration 相关联 系统会将时间线小组件替换为 相关小组件建议的卡片 这可确保每项活动只显示一张卡片 要关联小组件 将 associatedKind 修饰符 添加到 RelevanceConfiguration 并向它传递时间线小组件的类型 这就是构建相关小组件的方法 还有一个技巧可以帮助确保 小组件的美观:使用预览 通过预览 你可以查看相关小组件 在智能叠放中的显示效果 而不需要模拟相关条件 我将简要介绍三种预览小组件的方法 它们分别适用于不同的用例 在开发小组件的视图时 使用 relevanceEntry 预览 快速查看和微调小组件视图的外观 使它适配各种尺寸的显示屏 在这里 我尝试显示两个事件 以预览包含不同字数的视图布局 在开发条目方法时 使用相关性预览来快速检查 使用 WidgetConfigurationIntent 创建的条目 在这里 我使用一些示例配置 创建相关性 并验证条目和视图创建正确

    对相关小组件进行最终检查时 使用 RelevanceProvider 预览 在这里 我提供一个预览事件库 在预览中展示五个事件 以验证不同事件都能美观地显示 在各种尺寸的显示屏中 出色的 App 应当能够在适当的时间 向用户展示重要信息 并且信息应该是最新状态 我想介绍另一个很棒的工具 可用于更新小组件的数据 从 watchOS 26 开始 你可以 使用 APNs 向小组件发送推送更新 在所有支持 WidgetKit 的 Apple 平台上 所有小组件都支持小组件推送更新 如需详细了解如何 添加小组件推送更新支持 请观看 Tanner 的视频 “小组件的新功能” 如果你因为需要复杂功能推送更新 还没有将 ClockKit 复杂功能迁移到 小组件 现在正是时候! 想要了解如何更顺畅地完成迁移 请观看 August 的视频 “进一步了解 WidgetKit 中的 复杂功能” 我希望你喜欢 watchOS 的新功能 在 watchOS 26 上构建并运行 App 确保它与系统整体风格协调 并可在 ARM64 架构上完美运行 在 Apple Watch 上尝试 iOS 控件 并将控件添加到 Watch App 中 尤其是当你有独立的 Watch App 时 在 App 的适当位置构建相关小组件 并利用推送通知使小组件数据 保持最新状态 我很享受每天在 Apple Watch 上 使用你们的 App 无论是散步、旅行还是去海边 都能为我提供帮助 让我们继续探索 让你的 App 在系统 中更多位置为用户提供体验

    • 6:53 - Make a widget configurable

      // In the AppIntentTimelineProvider
      func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] {
        return []
      }
    • 7:06 - Support earlier versions of watchOS with a configurable widget

      // In the AppIntentTimelineProvider
      func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] {
        if #available(watchOS 26, *) {
          // Return an empty array to allow configuration of the widget in watchOS 12+
          return []
        } else {
          // Return array of recommendations for preconfigured widgets before watchOS 12
          return recommendedBeaches
        }
      }
    • 7:46 - Use AppIntentControlConfiguration to make a control configurable

      struct ConfigurableMeditationControl: ControlWidget {
        var body: some ControlWidgetConfiguration {
          AppIntentControlConfiguration(
            kind: WidgetKinds.configurableMeditationControl,
            provider: Provider()
          ) { value in
            // Provide the control's content
          }
          .displayName("Ocean Meditation")
          .description("Meditation with optional ocean sounds.")
          .promptsForUserConfiguration()
        }
      }
    • 7:56 - Use AppIntentControlValueProvider for a configurable control

      extension ConfigurableMeditationControl {
        struct Provider: AppIntentControlValueProvider {
          func previewValue(configuration: TimerConfiguration) -> Value {
            // Return the value to show in the add sheet
          }
      
          func currentValue(configuration: TimerConfiguration) async throws -> Value {
            // Return the control's value
          }
        }
      }
    • 10:53 - Relevance for a point-of-interest category

      func relevance() async -> WidgetRelevance<Void> {
        guard let context = RelevantContext.location(category: .beach) else {
          return WidgetRelevance<Void>([])
        }
        return WidgetRelevance([WidgetRelevanceAttribute(context: context)])
      }
    • 14:37 - Implement the relevance method in the RelevanceEntriesProvider

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        let store: BeachEventStore
      
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Associate configuration intents with RelevantContexts
          let attributes = events.map { event in
            WidgetRelevanceAttribute(
              configuration: BeachEventConfigurationIntent(event: event),
              context: .date(interval: event.date, kind: .default)
            )
          }
      
          return WidgetRelevance(attributes)
        }
      }
    • 15:09 - Create a RelevanceEntry when the widget is relevant

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Return relevance information for the widget
        }
        
        func entry(
          configuration: BeachEventConfigurationIntent,
          context: Context
        ) async throws -> BeachEventRelevanceEntry {
          if context.isPreview {
            return .previewEntry
          }
          return BeachEventRelevanceEntry(
            event: configuration.event
          )
        }
      }
    • 15:55 - Create a placeholder entry to display when the widget is loading

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Return relevance information for the widget
        }
        
        func entry(
          configuration: BeachEventConfigurationIntent,
          context: Context
        ) async throws -> BeachEventRelevanceEntry {
          // Return the entry for the configuration
        }
        
        func placeholder(context: Context) -> BeachEventRelevanceEntry {
          BeachEventRelevanceEntry.placeholderEntry
        }
      }
    • 16:27 - Use a RelevanceConfiguration to create a relevant widget

      struct BeachEventWidget: Widget {
        private let model = BeachEventStore.shared
      
        var body: some WidgetConfiguration {
          RelevanceConfiguration
            kind: "BeachWidget
            provider: BeachEventRelevanceProvider(store: model)
          ) { entry in
            BeachWidgetView(entry: entry)
          }
          .configurationDisplayName("Beach Events")
          .description("Events at the beach")
        }
      }
    • 17:31 - Use associatedKind to relate the relevant widget to the timeline widget

      struct BeachEventWidget: Widget {
        private let model = BeachEventStore.shared
      
        var body: some WidgetConfiguration {
          RelevanceConfiguration
            kind: "BeachWidget
            provider: BeachEventRelevanceProvider(store: model)
          ) { entry in
            BeachWidgetView(entry: entry)
          }
          .configurationDisplayName("Beach Events")
          .description("Events at the beach")
          .associatedKind(WidgetKinds.beachEventsTimeline)
        }
      }
    • 18:06 - Create a Preview with relevanceEntries

      #Preview("Entries") {
        BeachEventWidget()
      } relevanceEntries: {
        BeachEventRelevanceEntry.previewShorebirds
        BeachEventRelevanceEntry.previewMeditation
      }
    • 18:26 - Create a Preview with relevance

      #Preview("Provider and Relevance") {
        BeachEventWidget()
      } relevanceProvider: {
        BeachEventRelevanceProvider(store: .preview)
      } relevance: {
        let configurations: [BeachEventConfigurationIntent] = [
          .previewSurfing,
          .previewMeditation,
          .previewWalk
        ]
        let attributes = configurations.map {
          WidgetRelevanceAttribute(
            configuration: $0,
            context: .date($0.event.startDate, kind: .default)
          )
        }
        return WidgetRelevance(attributes)
      }
    • 18:47 - Create a Preview with a relevanceProvider

      #Preview("Provider") {
        BeachEventWidget()
      } relevanceProvider: {
        BeachEventRelevanceProvider(store: .preview)
      }

Developer Footer

  • 视频
  • WWDC25
  • watchOS 26 的新功能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则