WWDC Quick Look 💓 By SwiftGGTeam
Design great actions for Shortcuts, Siri, and Suggestions

Design great actions for Shortcuts, Siri, and Suggestions

观看原视频

Highlight

Apple 用 actions(动作)把应用里的常用任务暴露给 Shortcuts、Siri 和 Suggestions,让用户在应用未打开时完成可重复、可组合、可语音触发的操作。

核心内容

开发者通常先设计应用界面。按钮放在哪里,表单怎么填,列表怎么筛选,这些都发生在应用打开之后。

Shortcuts 处理的是另一个场景:用户没有打开你的应用,但仍然想完成一个任务。比如日历应用可以添加事件、查找今天的事件、修改事件。这些任务如果变成动作,用户就可以把它们拖进快捷指令,和其他应用的动作组合起来。

Apple 在这场 session 里给出的核心判断很直接:动作要有用、模块化、支持多种交互方式、表达清楚,并且容易被发现。

从应用功能到可组合动作

以前,一个应用功能通常只在应用内部可用。用户想把多个应用串起来,就要在不同界面之间切换。日历查下一场会议,再打开信息应用通知参会人自己会迟到,这就是典型例子。

动作把这个流程拆成可组合的积木。日历提供“获取下一场事件”,信息应用提供“发送消息”。用户在 Shortcuts 里把它们连起来,就得到一个新的自动化流程。

从打开应用到就地完成任务

一个好的动作应该尽量在后台完成任务。添加提醒事项时,如果标题已经给出,动作应该直接添加提醒事项,而不是把用户拉回 Reminders 应用。

如果信息不够,动作应该先问一个后续问题。比如“你想被提醒什么?”。只有当目标本身需要完整界面时,才打开应用。

从单个大动作到多个小动作

演讲里的 To Do 应用例子很关键。一个“清理旧任务”动作能做事,但含义模糊,也很难复用。拆成“获取一周前创建的任务”和“归档任务”后,用户可以用同一组动作做更多事。

“获取任务”的输出还可以接给“显示结果”或“保存文件”。如果动作输出了提醒、附件、父任务、截止日期、备注和列表,快捷指令作者就能围绕这些字段继续组合。

详细内容

1. 有用的动作:完成应用内的真实任务

04:01)Apple 对“有用”的定义很具体:动作执行用户原本会在应用里做的任务,并尽量完整完成,不主动打开应用。

Reminders 的“添加提醒事项”适合作为动作,因为它可以通过参数完成。相反,“自定义 Watch 表盘”包含大量视觉预览和控件,交互很沉浸,不适合变成快捷指令动作。已经配置好的表盘之间切换,更适合作为动作。

action: Add New Reminder
parameters:
  title:
    required: true
    prompt: "What do you want to be reminded about?"
  list:
    required: false
  dueDate:
    required: false
runBehavior:
  opensApp: false
  asksFollowUpQuestionWhenMissingRequiredValue: true

关键点:

  • action 表示要暴露给 Shortcuts 的任务,来自应用里的常用功能。
  • parameters 对应 Shortcuts 动作卡片里可配置的字段。
  • title.required: true 表示添加提醒事项必须知道标题。
  • prompt 是运行时信息不足时向用户提出的问题。
  • opensApp: false 对应演讲里的建议:能直接完成就不要打开应用。
  • asksFollowUpQuestionWhenMissingRequiredValue 对应“缺少标题时询问用户”的处理方式。

2. 模块化动作:一个动作只做一件事

08:21)演讲用两个 To Do 应用对比模块化设计。Dog Do’s 做了一个“Clean up old tasks”动作。Shortcats 拆成“Get Tasks”和“Archive”。

拆开之后,动作本身更清楚,组合方式也更多。Siri 在执行归档前还能展示要归档的任务预览,并要求确认。

shortcut: Clean up old tasks
actions:
  - action: Get Tasks
    parameters:
      createdBefore: "one week ago"
    output: Cat Tasks
    outputProperties:
      - Reminder
      - Attachment
      - Parent task
      - Deadline
      - Notes
      - List
  - action: Archive Task
    parameters:
      tasks: Cat Tasks

关键点:

  • Get Tasks 只负责查找任务,不负责归档。
  • createdBefore 是可编辑参数,用户可以把一周改成两周。
  • output: Cat Tasks 表示第一个动作的结果可以传给后续动作。
  • outputProperties 对应演讲中提到的输出属性,快捷指令作者可以取出备注、附件、截止日期等字段。
  • Archive Task 接收 Cat Tasks,只负责归档。

3. 多模态动作:同一个参数要适配点击、语音和编辑器

13:15)Shortcuts 动作会出现在三种场景:用户点击运行、通过 Siri 语音运行、在 Shortcut Editor(快捷指令编辑器)里配置。

同一个截止日期参数,在 iPhone 上可以弹出日历选择器,在 HomePod 上只能由 Siri 提问。Apple 的建议是把 prompt 写成问题,比如“When is the deadline?”。如果只写“Deadline:”,放在 UI 里还行,读出来就不自然。

parameter: deadline
type: Date
prompt: "When is the deadline?"
configurationUI:
  input: text
  recognizedValuePreview: true
resolutionUI:
  compactPicker: calendar
siriResolution:
  spokenPrompt: "When is the deadline?"

关键点:

  • parameter 表示动作里的一个输入字段。
  • type: Date 使用系统参数类型,系统可以在不同设备上处理日期。
  • prompt 写成问题,点击运行和 Siri 语音运行都能复用。
  • configurationUI 对应用户在编辑器里设置动作时看到的界面。
  • recognizedValuePreview 对应演讲里输入日期文本后出现的识别提示。
  • siriResolution.spokenPrompt 表示同一个问题会被 Siri 读出来。

4. Dynamic Enumerations:给自定义参数提供可视化选择

15:39)系统参数类型不一定覆盖应用里的所有实体。Set Playback Destination 动作要展示 AirPods 或蓝牙音箱,系统没有一个通用“播放设备”参数,所以动作定义了自定义参数和配套 UI。

Apple 把这类 UI 称为 Dynamic Enumerations(动态枚举)。它有两个出现时机:配置动作时选择值,运行动作时解析值。

parameter: catTask
type: CustomEntity
configuration:
  dynamicEnumeration: TaskListForEditor
  purpose: "pick a task while building the shortcut"
resolution:
  dynamicEnumeration: TaskListForRuntime
  purpose: "pick a task when the shortcut runs"

关键点:

  • catTask 是应用自己的实体,系统内置类型无法准确表达。
  • type: CustomEntity 表示这是自定义参数类型。
  • configuration.dynamicEnumeration 对应编辑快捷指令时显示的任务列表。
  • resolution.dynamicEnumeration 对应 Siri 追问“归档哪一个任务”时显示的列表。
  • 两个列表填充的是同一个参数,所以数据来源应该保持一致。

5. 参数摘要:让动作在编辑器里读起来像一句话

18:44)iOS 15 重新设计了 Shortcuts 编辑器里的动作外观,重点突出 parameter summary(参数摘要)。应用名被移除,应用图标被放进行内,动作本身要靠摘要说清楚任务。

Apple 给出的规则很细:摘要从动词开始,写成一句话,不加句号;只放最重要的参数;可选参数放进 Options UI(选项界面)。动作标题要和摘要使用相同的动词,并尽量共享词语。

actionTitle: "Start Breathing"
parameterSummary: "Start breathing for ${duration}"
requiredParameters:
  duration:
    defaultValue: "15 minutes"
optionalParameters:
  music:
    location: Options UI
prompts:
  duration: "How long do you want to breathe?"

关键点:

  • actionTitle 用在动作列表里,帮助用户快速找到动作。
  • parameterSummary 用在动作卡片里,必须从动词开始。
  • ${duration} 是摘要里的核心参数,用户一眼能看到呼吸时长。
  • defaultValue 对应演讲里的 15 分钟默认值,可以减少运行时提问。
  • music.location: Options UI 表示播放音乐是可选项,不应该占据摘要。
  • prompts.duration 保证用户使用 Ask Each Time(每次询问)时仍有问题可问。

6. Snippets:在高风险动作前展示结果预览

16:33)Snippet(片段界面)是在动作运行时展示的小界面。Starbucks 的点咖啡动作会在下单前显示订单预览。

Apple 建议,对删除、下单这类永久性动作,完成前和完成后显示不同 snippet。完成前的界面帮助用户理解将要发生什么。

action: Order Coffee
snippets:
  beforeCompletion:
    title: "Review Order"
    shows:
      - drink
      - size
      - pickupStore
  afterCompletion:
    title: "Order Placed"
    shows:
      - orderStatus
      - pickupTime
requiresConfirmation: true

关键点:

  • beforeCompletion 对应动作完成前的预览界面。
  • drinksizepickupStore 让用户确认动作的后果。
  • afterCompletion 对应动作完成后的状态反馈。
  • requiresConfirmation 对应归档、删除、下单这类需要用户确认的流程。

7. 分享与 Add to Siri:给用户一个可直接说出的短语

20:37)iOS 15 和 macOS Monterey 改进了 Shortcuts 分享方式。开发者可以把包含自己动作的多步骤快捷指令放到网站、社交媒体或应用帮助页面。

“Add to Siri” 也变了。如果开发者提供 suggested invocation phrase(建议唤起短语),用户点击后快捷指令会立即添加,并看到该说什么来运行它。如果没有建议短语,系统会要求用户自己命名,添加流程会变长。

sharedShortcut:
  title: "Order My Usual Coffee"
  runDestinations:
    - iPhone
    - Mac
    - HomePod
  suggestedInvocationPhrase: "Order my usual coffee"
  distribution:
    - website
    - socialMedia
    - inAppHelp

关键点:

  • title 是共享快捷指令的名称。
  • runDestinations 对应下载 UI 里显示的可运行位置。
  • suggestedInvocationPhrase 是用户对 Siri 说出的短语。
  • distribution 对应演讲中建议的三个发布入口:网站、社交媒体、应用帮助。

核心启发

1. 给任务管理 App 做“今日清理”快捷指令

  • 做什么:提供“获取过期任务”和“归档任务”两个动作,让用户一键清理一周前的任务。
  • 为什么值得做:演讲强调模块化动作可以组合,也可以单独使用。获取任务的输出还能接到显示结果或保存文件。
  • 怎么开始:先定义 Get 动作,输出任务列表和 Notes、Deadline、Attachment 等属性;再定义 Archive 动作,接收任务列表并在执行前展示确认 snippet。

2. 给习惯追踪 App 做“记录一次”动作

  • 做什么:用户说“记录喝水”或点击小组件,就能完成一次习惯打卡。
  • 为什么值得做:打卡是高频、可重复、低沉浸任务,符合演讲里的有用动作标准。
  • 怎么开始:把习惯名称做成参数;缺少习惯名时用问题式 prompt 追问;运行后返回本次记录结果。

3. 给播客 App 做“播放最新一集”动作

  • 做什么:提供“获取节目”“播放单集”“保存到稍后收听”三个动作。
  • 为什么值得做:拆成小动作后,用户可以把播客动作和日历、通勤、专注模式组合。
  • 怎么开始:让“获取节目”输出节目名、最新单集、时长和备注;播放目标使用动态枚举展示节目列表。

4. 给订餐 App 做“复购常点餐品”动作

  • 做什么:用户通过 Siri 下单常点咖啡或午餐,执行前看到订单预览。
  • 为什么值得做:演讲提到下单属于永久性动作,适合在完成前展示 snippet 说明后果。
  • 怎么开始:把餐品、规格、门店做成参数;给缺失参数写问题式 prompt;下单前展示 beforeCompletion snippet 并要求确认。

5. 给文件管理 App 做“保存附件到 iCloud”动作

  • 做什么:从应用实体中提取附件,并交给系统“Save File”动作保存。
  • 为什么值得做:演讲强调输出属性要拆开并标注,快捷指令作者可以用内置动作创造应用外的新流程。
  • 怎么开始:在 Get 动作里输出 Attachment 属性;确保变量编辑器能看到该属性;用共享快捷指令演示如何连接 Save File。

关联 Session

评论

GitHub Issues · utterances