如何把 App Intents 设计成可跨设备、可撤销的安全产品动作?
1. 场景、目标与边界
协作 App 中有项目、评论和任务。用户可能通过 Siri、Spotlight、快捷指令或 Apple Intelligence 发起“完成任务”“分享项目”“删除评论”等动作。动作需要在不同入口保持同样的权限和结果,并能在手机与平板之间继续。
先定义边界:App Intents 是系统可发现的动作与实体接口,不应绕过现有服务端授权、审计或事务。系统建议提高触达率,却不代表动作天然可信;产品必须把每个 intent 当成公开调用面来设计。
2. App Intents 的产品价值
Apple 的 AppIntent 协议让应用动作被 Siri、Spotlight、快捷指令和 Apple Intelligence 发现。2026 年的 App Intents 更新还提供 app schema、跨设备稳定实体标识 SyncableEntity、敏感或破坏性操作的所有权确认 OwnershipProvidingEntity,以及把其他应用提供的内容接入参数的 IntentFile。
这些能力解决的是发现和语义互操作问题,不会替你决定业务权限、冲突处理或撤销策略。产品设计要把“用户想做什么”“系统能否安全代办”“失败后如何恢复”拆开。
3. 建模动作与实体
为每个 intent 写清楚输入、可见范围、前置条件、结果和副作用。实体展示名称可以变化,但业务 ID 必须稳定、可验证、与当前用户和租户绑定。不要把列表位置、标题或本地数据库主键直接当作跨设备标识。
struct CompleteTaskIntent: AppIntent {
static var title: LocalizedStringResource = "完成任务"
@Parameter(title: "任务")
var task: TaskEntity
func perform() async throws -> some IntentResult {
try await TaskService.complete(taskID: task.id)
return .result()
}
}实体解析失败、权限变化或版本不兼容时,应返回可理解的选择或登录路径,不能猜测相似项目后直接执行。
4. 设计跨设备稳定身份
如果任务可在多台设备继续,实体必须实现稳定标识语义,并由服务端保证同一实体 ID 在设备间指向同一资源。同步层要处理删除、归档、租户迁移和离线缓存过期;解析时再次向服务端确认当前用户是否仍拥有访问权。
不要把 SyncableEntity 当成同步数据库。它表达标识可跨设备保持稳定,实际数据同步、冲突解决和撤销仍由产品后端负责。发生合并或迁移时保留别名映射和审计记录,避免旧快捷指令指向错误实体。
5. 敏感动作的确认与所有权
删除、公开分享、转移权限等动作需要在执行前确认用户对实体的所有权或操作权限。使用 OwnershipProvidingEntity 表达实体归属,并让确认文案说明对象、影响和可逆性。确认应绑定当前请求、用户和资源版本,不能复用过期确认。
如果实体属于团队或公开空间,所有权判断必须由服务端返回,不能只看本地缓存。对“允许不再询问”的偏好设置范围要窄,并对高风险动作保留再次确认和审计。
6. 幂等、授权与副作用
系统可能重试 intent,快捷指令也可能被用户重复运行。每个改变状态的 intent 都应携带幂等键和资源版本;服务端在授权通过后执行条件更新,重复请求返回同一个业务结果。读取动作可以更快,但仍要检查可见范围。
不要把权限写在自然语言参数里。服务端根据会话、租户、实体归属和当前版本重新鉴权,并记录入口(Siri、Spotlight、快捷指令或 App 内)、调用者设备和结果。失败响应应区分登录过期、无权访问、实体已变化和服务暂时不可用。
7. 发现、观测与失败恢复
按用户价值选择 app schema 和可发现动作,避免把所有内部 API 暴露给系统。对每个 intent 监测解析成功率、权限拒绝、确认放弃、重复执行、跨设备恢复和最终完成率;分入口观察建议带来的转化,而不是只看调用量。
动作执行前显示关键摘要,执行后提供结果和撤销入口。网络中断时保存可重试的请求状态,但不要在后台无限重放破坏性动作。实体已删除或版本冲突时,返回替代选择和人工处理路径,并保留审计事件。
8. 评分要点与追问
必须说清
- 把 App Intents 视为公开产品接口,仍需服务端授权、审计、幂等和版本检查。
- 区分稳定实体标识与真正的数据同步,能处理删除、迁移、离线和冲突。
- 为敏感动作设计所有权确认、窄范围免确认偏好、撤销和失败恢复。
常见追问
- 用户在手机上确认删除后,平板离线快捷指令又执行一次,服务端如何保证结果一致?
- 团队共享项目没有单一所有者时,谁可以确认“转移权限”?
- 如何判断某个 intent 值得进入系统建议,而不是增加无效噪音?
评分参考
优秀答案会把发现、身份、授权、确认、幂等和恢复连成同一条产品链路:系统入口只负责表达意图,服务端负责最终决策,用户始终能看懂影响并在失败后继续完成任务。