What's new in SiriKit and Shortcuts
System & Services 进阶 26m

SiriKit 和快捷指令的新特性

What's new in SiriKit and Shortcuts

2020年6月25日

在 Apple 官方观看视频

一句话判断

Siri 快捷指令在 2020 年的更新重点是”可发现性”——你的 App 的快捷指令现在可以自动出现在 Siri 建议中,用户不需要手动添加就能使用。

这场 Session 讲了什么

SiriKit 和 Shortcuts 在 2020 年有几个重要更新。最核心的是 Intent 的可发现性改进:系统会根据用户的使用模式自动建议相关的快捷指令。这意味着即使你的 App 没有被用户显式配置到 Shortcuts 中,系统也可能在合适的时机建议用户使用你的 Intent。

新增了几个 Intent 类型:INSearchForMediaIntent(搜索媒体内容)、INAddMediaIntent(添加到播放列表)、INUpdateMediaAffinityIntent(标记喜欢/不喜欢)。这些 Intent 丰富了媒体 App 的 Siri 集成能力。

Shortcuts App 本身也有了重大更新——新的快捷指令动作构建方式、更好的变量处理、以及与 Widget 的集成(快捷指令可以直接通过 Widget 触发)。

值得深挖的点

自动建议的工作原理。 系统通过分析你的 App 的 Intent Donation(捐赠)来学习用户的使用模式。每次用户在 App 中执行某个操作时,你应该通过 INInteraction.donate() 告诉系统。系统积累足够的捐赠数据后,会在合适的场景(锁屏、搜索、Siri 面板)自动建议用户使用这个快捷指令。

Intent Donation 的策略。 不是所有操作都值得捐赠。Session 建议只捐赠那些用户经常重复执行、且适合语音触发的操作。比如”播放我的跑步歌单”值得捐赠,但”修改账号设置”就不值得。

代码片段

import Intents

// 捐赠 Intent——告诉系统用户执行了什么操作
func donatePlayPlaylistIntent(playlist: Playlist) {
    let intent = INPlayMediaIntent()
    intent.mediaItems = [
        INMediaItem(
            identifier: playlist.id,
            title: playlist.name,
            type: .playlist,
            artwork: INImage(imageData: playlist.artworkData)
        )
    ]
    
    let interaction = INInteraction(intent: intent, response: nil)
    interaction.donate { error in
        if let error = error {
            print("Intent 捐赠失败: \(error)")
        }
    }
}
// 新增的搜索媒体 Intent
class SearchMediaIntentHandler: NSObject, INSearchForMediaIntentHandling {
    func handle(
        intent: INSearchForMediaIntent,
        completion: @escaping (INSearchForMediaIntentResponse) -> Void
    ) {
        guard let searchTerm = intent.mediaSearch?.mediaName else {
            completion(INSearchForMediaIntentResponse(code: .failure, userActivity: nil))
            return
        }
        
        searchCatalog(query: searchTerm) { results in
            let mediaItems = results.map { result in
                INMediaItem(
                    identifier: result.id,
                    title: result.title,
                    type: .song,
                    artwork: INImage(imageData: result.artwork)
                )
            }
            
            let response = INSearchForMediaIntentResponse(code: .success, userActivity: nil)
            response.mediaItems = mediaItems
            completion(response)
        }
    }
}
// 配置 Intent 的交互方式
// 在 Intent 定义中设置支持的交互方式
// - Siri: 语音触发
// - Shortcuts App: 手动添加到快捷指令
// - Suggestions: 自动出现在系统建议中

// 在 Info.plist 中声明支持的 Intent
// INIntentsSupported:
//   - INPlayMediaIntent
//   - INSearchForMediaIntent
//   - INAddMediaIntent

最佳实践

  • 在用户执行关键操作时及时捐赠 Intent。 捐赠数据是自动建议的基础,数据越多建议越准确。
  • 只捐赠用户可能想重复执行的操作。 一次性操作(如删除账号)不应该捐赠。
  • 为 Intent 提供丰富的参数描述。 让用户在 Shortcuts App 中可以看到并编辑参数,增加灵活性。
  • 测试 Siri 建议是否正确触发。 在设置中确保你的 App 的 Siri 建议权限已开启。

还有什么值得关注

  • Shortcuts 现在支持在 Widget 中触发,配合 WidgetKit 使用
  • 新的 INShortcut API 可以更方便地创建快捷指令
  • Intent 的参数现在支持枚举类型和自定义类型
  • Siri 的语音理解能力在 2020 年有所提升,支持更自然的表达方式
WWDC 2020