Expand your SiriKit Media Intents to more platforms
System & Services 进阶 20m

将 SiriKit Media Intents 扩展到更多平台

Expand your SiriKit Media Intents to more platforms

2020年6月24日

在 Apple 官方观看视频

一句话判断

watchOS 和 HomePod 现在也支持 Siri Media Intents 了——如果你已经实现了 iOS 端的媒体 Intent Handler,扩展到新平台的代码改动不大,但需要注意各平台的交互差异。

这场 Session 讲了什么

2020 年,SiriKit Media Intents 扩展到了 watchOS 和 HomePod。这意味着你的音频/视频 App 可以通过 Siri 在 Apple Watch 和 HomePod 上播放内容。

Session 讲解了各平台的差异:watchOS 上播放依赖蓝牙耳机或 AirPlay,UI 反馈通过腕部触感和小屏幕展示;HomePod 没有屏幕,所有反馈都通过 Siri 的语音回应和音效表达。你的 Intent Handler 需要根据目标平台调整响应方式。

技术实现上,核心的 INPlayMediaIntent 处理逻辑是跨平台共享的。主要的适配工作是:确保你的 App 在 watchOS 上有对应版本、配置正确的 Entitlement、以及处理平台特定的播放路由(如选择 AirPlay 输出设备)。

值得深挖的点

HomePod 的无屏交互设计。 没有屏幕意味着你不能展示列表让用户选择。当用户说”播放周杰伦”时,如果搜索结果有多条匹配,你不能弹出一个选择列表。设计策略是:自动选择最匹配的结果播放,同时通过语音告诉用户”正在播放周杰伦的《晴天》”。

跨平台的播放会话管理。 用户可能在 iPhone 上开始播放,然后在 HomePod 上说”继续播放”。这需要你的后端维护统一的播放会话状态,Siri 只负责触发播放,实际的会话同步由你的 App 逻辑处理。

代码片段

import Intents

// 跨平台的 INPlayMediaIntent 处理
class MediaIntentHandler: NSObject, INPlayMediaIntentHandling {
    func handle(intent: INPlayMediaIntent, completion: @escaping (INPlayMediaIntentResponse) -> Void) {
        // 获取当前平台
        #if os(watchOS)
        handleForWatchOS(intent: intent, completion: completion)
        #elseif os(iOS)
        handleForIOS(intent: intent, completion: completion)
        #endif
    }
    
    private func handleForWatchOS(
        intent: INPlayMediaIntent,
        completion: @escaping (INPlayMediaIntentResponse) -> Void
    ) {
        // watchOS:自动选择最佳结果,不展示选择列表
        guard let query = intent.mediaSearch?.mediaName else {
            completion(INPlayMediaIntentResponse(code: .failure, userActivity: nil))
            return
        }
        
        searchMedia(query: query) { results in
            guard let firstResult = results.first else {
                completion(INPlayMediaIntentResponse(code: .failureNoContentViewable, userActivity: nil))
                return
            }
            
            // 自动播放第一个结果
            self.playbackManager.play(firstResult)
            
            let response = INPlayMediaIntentResponse(code: .success, userActivity: nil)
            completion(response)
        }
    }
}
// 配置 Info.plist 支持多平台
// 在 watchOS 和 iOS 的 Intent Handler Extension 中
// 确保以下配置一致:
// - INMediaSupportedIntentMediaTypes
// - INSupportedMediaCategories

// 注册 App 为 Siri 媒体提供者
// 在 App 的 Info.plist 中:
// <key>INIntentsSupported</key>
// <array>
//     <string>INPlayMediaIntent</string>
//     <string>INSearchForMediaIntent</string>
//     <string>AddMediaIntent</string>
//     <string>UpdateMediaAffinityIntent</string>
// </array>

最佳实践

  • HomePod 上自动选择最佳结果,不要弹选择列表。 没有屏幕,列表无法展示。
  • watchOS 上利用触感反馈。 播放开始时给一个轻击反馈,让用户感知到操作已执行。
  • 确保跨平台的播放队列状态同步。 用户可能频繁在设备间切换,后端要维护统一的播放状态。
  • 测试各种网络条件。 HomePod 和 Watch 的网络可能不如 iPhone 稳定,超时处理要健壮。

还有什么值得关注

  • AirPlay 2 支持让 HomePod 可以作为输出设备被其他设备发现
  • watchOS 的独立 App 现在可以直接处理 Siri 媒体请求
  • INAddMediaIntent 和 INUpdateMediaAffinityIntent 是新增的媒体相关 Intent
  • Siri 的媒体推荐功能会学习用户的使用习惯来优化搜索结果
WWDC 2020