AppShortcut
是你主动向系统提供的一种方式,用于展示和推广你的应用可以执行的特定操作(这些操作由 AppIntent
定义)。通过 AppShortcut
,你的应用功能可以更容易地被用户通过 Siri、聚焦搜索 (Spotlight) 的建议以及快捷指令 App 发现和使用。
一、基本概念 #
- 是什么?
AppShortcut
是一个结构体,它代表了一个预先配置好的AppIntent
实例,并附带了用户可见的元数据,如:- 调用短语 (Invocation Phrases):用户可以说给 Siri 来触发这个快捷方式的自然语言短语。
- 短标题 (Short Title):在快捷指令 App 或建议中显示的简洁名称。
- 系统图像 (System Image):一个 SF Symbol 图标,用于视觉表示。
- 目的与作用:
- 提升可发现性 (Discoverability):让用户更容易发现你的应用能做什么。系统可以将这些
AppShortcut
展示在聚焦搜索建议、Siri 建议(例如基于用户习惯在锁屏上推荐)或者快捷指令 App 中你应用的专属区域。 - 简化用户操作:用户可以直接使用这些预定义的快捷方式,而无需自己从头开始在快捷指令 App 中构建。这降低了用户使用你应用自动化功能的门槛。
- 增强 Siri 集成:通过提供明确的调用短语,Siri 可以更准确地理解用户意图并执行相应的
AppIntent
。短语中还可以包含参数占位符,Siri 会在需要时询问用户。 - 引导用户使用快捷指令:向用户展示你的应用支持哪些有用的自动化操作。
- 上下文相关性:系统可以学习何时何地向用户建议这些
AppShortcut
最为合适。
- 提升可发现性 (Discoverability):让用户更容易发现你的应用能做什么。系统可以将这些
二、如何定义和提供 AppShortcut
#
你通过实现 AppShortcutsProvider
协议来向系统提供 AppShortcut
。
创建 AppShortcutsProvider:
定义一个遵循 AppShortcutsProvider 协议的类型(通常是 struct 或 enum)。
实现 appShortcuts 静态计算属性:
在这个属性中,你返回一个 [AppShortcut] 数组,包含了你的应用希望提供的所有快捷方式。
- 从 iOS 16/17 开始,推荐使用
@AppShortcutsBuilder
,它提供了一种更简洁、声明式的 DSL (Domain Specific Language) 风格来构建AppShortcut
数组。
- 从 iOS 16/17 开始,推荐使用
定义单个 AppShortcut:
每个 AppShortcut 实例通常包含以下信息:
intent: YourAppIntent
: 一个你已经定义好的AppIntent
的实例。你可以在这里预设该意图的某些参数值。// 假设你有一个 SendMessageIntent let prefilledIntent = SendMessageIntent() prefilledIntent.recipient = "support@example.com" // 预设参数 // ... intent: prefilledIntent ...
phrases: [ Phrase<YourAppIntent.IntentParameterProvider> ]
: (使用@AppShortcutsBuilder
时的现代语法) 或者phrases: [String]
(旧式或简单字符串,但推荐使用强类型的短语构建)。 这些是用户可以对 Siri 说的短语。你可以使用\(\.$parameterName)
来引用AppIntent
中的参数,Siri 会在需要时提示用户输入该参数的值。// 示例短语,假设 StartWorkoutIntent 有 workoutType 参数 // Phrase("Start a \(\.$workoutType) in \(.applicationName)") // Phrase("Begin new workout in \(.applicationName)")
.applicationName
会被替换为你的应用名称。shortTitle: LocalizedStringResource
: 显示给用户的短标题。systemImageName: String
: SF Symbol 的名称,用作图标。description: LocalizedStringResource
(可选): 更详细的描述。
appShortcutTileColor: ShortcutTileColor (可选):
AppShortcutsProvider 还可以定义一个静态属性 appShortcutTileColor,用于自定义你的应用在快捷指令 App 中快捷方式磁贴的背景颜色。
示例代码:
假设我们有一个之前定义的 StartWorkoutIntent
(它有一个 workoutType
参数,类型为 WorkoutTypeEntity
,这是一个 AppEnum
)。
import AppIntents
// 假设 StartWorkoutIntent 和 WorkoutTypeEntity 已定义
struct MyAppShortcuts: AppShortcutsProvider {
static var appShortcutTileColor: ShortcutTileColor = .green // 自定义磁贴颜色
// 使用 @AppShortcutsBuilder (iOS 16/17+)
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
// 快捷方式 1: 开始一个通用的锻炼,Siri 会询问类型
AppShortcut(
intent: StartWorkoutIntent(), // 没有预设 workoutType,Siri会询问
phrases: [
"Start a workout with \(.applicationName)",
"Begin exercise in \(.applicationName)",
"Log a new workout using \(.applicationName)"
],
shortTitle: "Start a New Workout",
systemImageName: "figure.walk"
)
// 快捷方式 2: 开始一个跑步锻炼 (预设参数)
AppShortcut(
intent: {
let intent = StartWorkoutIntent()
// 假设 WorkoutTypeEntity 可以通过 ID 初始化,或者你有预定义的实体实例
// 为了简单,这里假设可以直接构造或查找
// intent.workoutType = WorkoutTypeEntity(id: "running", name: "Running") // 预设为跑步
// intent.duration = 30 // 也可以预设其他参数
return intent
}(), // IIFE (Immediately Invoked Function Expression) 来创建和配置 intent
phrases: [
// Phrase("Start a \(\.$workoutType) run with \(.applicationName)"), // 如果 workoutType 仍可被Siri覆盖
"Start my run with \(.applicationName)", // 一个更具体的短语
"Begin running workout in \(.applicationName)"
],
shortTitle: "Start Running",
systemImageName: "figure.running"
// description: "Quickly starts a running session." // 可选描述
)
// 快捷方式 3: 使用参数占位符的短语 (Siri会询问workoutType)
AppShortcut(
intent: StartWorkoutIntent(),
phrases: [
// \(\.$workoutType) 告诉 Siri 这个部分对应 intent 中的 workoutType 参数
// Siri 会尝试从用户的语音中提取,或者直接询问 "What type of workout?"
"Start a \(\StartWorkoutIntent.$workoutType) workout in \(.applicationName)",
"Begin \(\StartWorkoutIntent.$workoutType) with \(.applicationName)"
],
shortTitle: "Start Specific Workout",
systemImageName: "flame.fill"
)
}
}
三、AppShortcut
如何工作?
#
- 定义与提供: 你通过实现
AppShortcutsProvider
来定义和提供AppShortcut
。 - 系统索引: 应用安装或更新后,系统会调用你的
AppShortcutsProvider
并索引这些快捷方式。 - 发现与建议:
- 聚焦搜索 (Spotlight): 当用户搜索时,如果搜索词与你的
shortTitle
或应用名相关,可能会显示你的AppShortcut
。 - Siri 建议: 系统可能会根据用户的使用习惯、时间、地点等上下文信息,在锁屏、Siri 建议小组件等地方主动推荐你的
AppShortcut
。 - 快捷指令 App: 用户可以在快捷指令 App 中找到你应用提供的所有
AppShortcut
,并将它们添加到自己的自动化流程中,或直接运行。
- 聚焦搜索 (Spotlight): 当用户搜索时,如果搜索词与你的
- 调用:
- 用户点击一个建议的
AppShortcut
。 - 用户对 Siri 说出你定义的某个调用短语。
- 用户在快捷指令 App 中运行包含此
AppShortcut
的流程。
- 用户点击一个建议的
- 执行:
- 系统会实例化
AppShortcut
中引用的那个AppIntent
。 - 如果
AppShortcut
中预设了参数,这些参数会传递给AppIntent
实例。 - 如果调用短语中包含了参数占位符 (例如
\(\.$parameterName)
),并且用户在语音中指定了该参数(或者AppShortcut
中没有预设该参数),Siri 会尝试解析或询问用户以获取参数值。 - 最终,
AppIntent
的perform()
方法被调用,执行实际的应用逻辑。
- 系统会实例化
四、AppShortcut
与 AppIntent
的关系
#
AppIntent
是动作的定义:它描述了你的应用能做什么,需要什么参数,以及如何执行。它是具体功能的蓝图和执行者。AppShortcut
是通往AppIntent
的便捷入口:它为某个(可能已预设部分参数的)AppIntent
实例提供了一个用户友好的名称、调用短语和图标,使其更容易被发现和调用。
你可以将 AppIntent
想象成一个函数定义,而 AppShortcut
则像是一个带有特定参数(可选)的函数调用快捷方式,并且这个快捷方式还有个好听的名字和易于记忆的语音命令。
五、使用场景 #
- 常用操作快捷化:为用户最常使用的应用功能提供
AppShortcut
。- 音乐应用:“播放我的收藏夹”、“识别这首歌”。
- 笔记应用:“创建新笔记”、“显示我最近的笔记”。
- 咖啡店应用:“订一杯大杯拿铁”(参数预设或通过短语指定)。
- 引导用户使用新功能:通过
AppShortcut
推广应用的新功能。 - 简化复杂操作:如果某个
AppIntent
有多个参数,你可以提供一些预设了部分参数的AppShortcut
,简化用户的配置过程。
六、最佳实践 #
- 有意义的快捷方式:只为用户真正觉得有价值、常用的操作提供快捷方式。不要滥用。
- 清晰自然的短语:调用短语应该尽可能自然,符合用户的说话习惯。提供多种短语变体可以提高 Siri 的识别率。
- 简洁的标题和图标:短标题要一目了然,图标要能清晰传达快捷方式的含义。
- 测试:在真实设备上彻底测试所有
AppShortcut
,包括通过 Siri 调用、在快捷指令 App 中使用以及查看它们在建议中如何显示。 - 本地化:确保
shortTitle
、description
以及短语中的文本都已正确本地化。
通过精心设计 AppShortcut
,你可以显著提升应用的用户体验,让你的应用功能更加深入地融入到用户的日常和系统的各个层面。