将 SiriKit Media Intents 扩展到更多平台
Expand your SiriKit Media Intents to more platforms
2020年6月24日
一句话判断
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 的媒体推荐功能会学习用户的使用习惯来优化搜索结果