Design great actions for Shortcuts, Siri, and Suggestions
System & Services 进阶 15m

为快捷指令、Siri 和建议设计出色的操作

Design great actions for Shortcuts, Siri, and Suggestions

2021年6月9日

在 Apple 官方观看视频

一句话判断

你 App 里的每一个核心功能都应该是一个 Shortcut Action——不是因为你需要支持 Shortcuts,而是因为这是让 Siri 能理解你 App 能做什么的唯一途径。

这场 Session 讲了什么

这个 Session 不是技术教程——它不教你如何定义 INIntent 或实现 IntentHandler。它讲的是设计层面的问题:你的 App 应该暴露哪些操作给 Shortcuts?参数怎么设计才能让 Siri 正确理解用户的意图?Shortcut 的描述怎么写才能让用户在 Shortcuts App 里一眼看懂?

Session 提出了几个设计原则。第一,操作应该是「用户意图」而不是「App 功能」——与其暴露「调用 API endpoint /send-message」,不如暴露「发送消息」。第二,参数设计要有合理的默认值和可选性——用户说「发消息给张三」时,Siri 不应该追问「消息内容是什么」如果你的 App 支持发送空白消息。第三,为你的操作提供清晰的分类和关键词——这决定了你的 Action 在 Shortcuts App 的搜索结果中能否被找到。

Session 还讨论了 iOS 15 中新增的 Suggestions(建议)功能——系统会根据用户的使用习惯,在 Spotlight 搜索和锁屏界面上主动建议你的 App 的 Shortcut Action。要让这个功能生效,你的 App 需要正确设置 INShortcutsuggestedInvocationPhrase

值得深挖的点

参数的可选性与对话流程。 当你定义一个 INIntent 时,每个参数可以标记为 Required 或 Optional。这个设计决策直接影响 Siri 的对话流程:Required 参数意味着 Siri 一定会追问用户,Optional 参数意味着 Siri 可能会跳过。Session 的建议是:只把真正影响操作结果的参数标记为 Required。比如「发送消息」操作,收件人应该是 Required,但消息内容可以是 Optional(发送一个「嗨」作为默认值,比强制用户输入一句话体验更好)。

INShortcut 的 donating 时机。 你需要通过 INInteraction.donate() 来告诉系统用户刚刚执行了什么操作。但不要在每个操作完成时都 donate——只有那些用户可能想重复执行的操作才值得 donate。比如用户在 App 里搜索了一个咖啡店,这个操作值得 donate(用户可能想对其他咖啡店执行同样的搜索);但用户关闭了一个设置弹窗,这个操作不值得 donate。过度 donate 会稀释你的 App 在 Suggestions 中的相关性。

代码片段

import Intents

// 捐赠一个 Shortcut,让系统学习用户的使用习惯
func donateSendMessageShortcut(recipient: String) {
    let intent = INSendMessageIntent()
    intent.recipients = [INPerson(personHandle: INPersonHandle(value: recipient, type: .unknown),
                                   nameComponents: nil,
                                   displayName: recipient)]
    intent.content = nil // 可选参数,不设置

    let interaction = INInteraction(intent: intent, response: nil)
    interaction.donate { error in
        if let error = error {
            print("捐赠 Shortcut 失败: \(error)")
        }
    }
}
// 为 Shortcut 设置建议的触发短语
func createShortcut() -> INShortcut? {
    let intent = CustomOrderIntent()
    intent.suggestedInvocationPhrase = "点一杯咖啡"

    // 提供参数选项,让用户在 Shortcuts App 中能选择
    if let shortcut = INShortcut(intent: intent) {
        return shortcut
    }
    return nil
}
// 在 Info.plist 中定义 Intent 的参数描述
// Key: NSExtension > NSExtensionAttributes > IntentsSupported
// 列出你的 App 支持的所有 Intent 类型
//
// Key: IntentsRestrictedWhileLocked
// 列出在锁屏时不允许执行的 Intent(涉及敏感操作的)
//
// 在 Intent Definition 文件 (.intentdefinition) 中:
// - 为每个参数设置 Prompt Dialogs(Siri 会用这些文字询问用户)
// - 设置 Shortcut Types(决定在 Shortcuts App 中的组合方式)
// - 设置 Support Background Execution(决定是否可以在后台执行)

最佳实践

  • 为每个 Shortcut Action 提供至少 2-3 个 suggested invocation phrase,覆盖不同的表达习惯(比如「点咖啡」「我要喝咖啡」「帮我买杯咖啡」)
  • 在 Intent Definition 文件里认真写每个参数的 description 和 prompt——这些文字会直接展示给用户,写得好能大幅降低学习成本
  • 测试时用 Siri 实际语音触发,而不仅仅在 Shortcuts App 里手动配置。语音输入和文字输入的差异会暴露参数设计的缺陷
  • 对于需要后台执行的操作,确保你的 IntentHandler 实现了 handle(intent:completionHandler:) 而不是 confirm(intent:completionHandler:),否则系统会认为你的操作无法在后台完成

还有什么值得关注

  • iOS 15 的 Spotlight 搜索会直接展示 App 的 Shortcut Actions,这是一个新的用户发现入口
  • App Clips 也支持 Shortcuts,用户使用完 App Clip 后系统会建议相关操作
  • INRelevantShortcutStore 可以用来在特定场景下主动推送 Shortcut 建议到用户的手表或手机
WWDC 2021