将自定义协作应用集成到信息 App
Integrate your custom collaboration app with Messages
2022年6月6日
一句话判断
如果你的应用有协作功能,这场 Session 展示了如何让用户通过信息 App 一键分享协作内容,并且接收方可以零操作直接获得访问权限。
这场 Session 讲了什么
Messages 团队的 Devin 和 Lance 详细讲解了 iOS 16 和 macOS Ventura 中新增的自定义协作 API。这套 API 允许第三方协作应用深度集成到信息 App 的对话流程中,用户可以在不离开对话的情况下分享文档、设置权限、即时验证访问。
Session 的核心内容围绕协作消息的完整生命周期展开:创建元数据 -> 通过分享面板或拖拽发送 -> 即时验证接收方身份 -> 响应参与者变更 -> 在对话中发布协作通知。
整个流程中最亮眼的部分是”即时验证”机制:发送方设备提供加密身份标识,接收方设备在打开链接时提供经过签名的身份证明,服务端验证后直接授权访问——整个过程不需要交换任何账户信息。
值得深挖的点
协作元数据的精细控制。 SWCollaborationMetadata 允许你配置内容标题、本地标识符、发起人信息,以及用户可调整的分享选项。分享选项支持两种模式:开关组(独立的开关选项,如是否允许提及和评论)和选择器组(互斥选项,如只读或读写权限)。
延迟创建通用链接的策略。 协作内容必须通过通用链接表示,但链接不必在分享时就创建。最佳实践是延迟到消息即将发送时才生成链接,因为链接可能依赖于用户在分享面板中选择的权限设置和接收人列表。
零摩擦的访问验证。 这是整个 API 最精妙的设计。发送时,Messages 获取接收方的加密身份标识,你的服务端存储这些标识。接收方打开链接时,系统提供经过设备签名的身份证明,你的服务端匹配验证后直接授权——不需要登录、不需要密码、不需要任何用户操作。
与 SwiftUI 和 UIKit 的双轨支持。 SwiftUI 通过新的 ShareLink API 和 ProxyRepresentation 实现协作分享,UIKit/AppKit 则通过 NSItemProvider 注册多种表示形式(包括协作元数据和文件副本)来最大化分享渠道。
代码片段
import SharedWithYou
// 创建协作元数据
let localId = SWLocalCollaborationIdentifier("document-123")
let metadata = SWCollaborationMetadata(localIdentifier: localId)
metadata.title = "项目计划书"
metadata.initiatorAccountHandle = "user@example.com"
metadata.initiatorName = PersonNameComponents()
// 配置分享选项 - 权限选择器组(互斥)
let permissionGroup = SWCollaborationOptionsPickerGroup(
identifier: "permissions",
options: [
SWCollaborationOption(identifier: "readwrite", title: "可编辑"),
SWCollaborationOption(identifier: "readonly", title: "只读")
]
)
permissionGroup.selectedOption = permissionGroup.options.first
permissionGroup.title = "权限设置"
// 配置分享选项 - 功能开关组(独立)
let featureGroup = SWCollaborationOptionsGroup(
identifier: "features",
options: [
SWCollaborationOption(identifier: "mentions", title: "允许提及"),
SWCollaborationOption(identifier: "comments", title: "允许评论")
]
)
// 组合分享选项
let shareOptions = SWCollaborationShareOptions(
optionGroups: [permissionGroup, featureGroup]
)
metadata.defaultShareOptions = shareOptions
// SwiftUI 中使用 ShareLink 支持协作分享
struct Document: Transferable {
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation { item in
return item.collaborationMetadata
}
}
}
// 在视图中使用
ShareLink(item: document) {
Text("分享协作")
}
最佳实践
- 通用链接的创建尽量延迟到消息发送前,这样可以获取到最终的权限设置和接收人信息
- 为 NSItemProvider 注册多种表示形式(协作元数据 + 文件副本),这样 Messages 可以在没有协作支持时退回为发送文件副本
- 发起人的账户信息只用于本地展示,帮助用户确认当前使用的分享账户
- 本地标识符只需要在你的应用内唯一,不需要跨设备一致
- 利用 App Store Server Notifications 和
originalTransactionId在服务端维护协作状态 - 在协作参与者发生变更时及时响应,通过 Shared with You 框架更新对话中的协作状态
还有什么值得关注
- 这套 API 假设你的应用已有协作基础设施和通用链接支持,如果还没有需要先完成这两项
- 配套观看 “Enhance collaboration experiences with Messages” 和 “Add Shared with You to your app” 可以获得更完整的上下文
- 加密身份验证机制的安全模型值得深入研究——它不暴露用户账户信息,仅通过设备级别的加密签名完成验证
- 你的应用还可以在对话中直接发布协作通知(如”张三编辑了第三章”),这为协作场景提供了更紧密的对话集成