通过 Messages 增强协作体验
Enhance collaboration experiences with Messages
2022年6月6日
一句话判断
如果你的 App 有协作功能(文档共享、多人编辑等),这场 Session 讲解了如何通过 Messages 将协作流程与对话无缝衔接,支持 CloudKit、iCloud Drive 和自定义基础设施三种路径。
这场 Session 讲了什么
iOS 16 和 macOS Ventura 引入了 Collaboration with Messages 功能,允许用户通过 Messages 直接发起和参与协作。协作者可以将文档绑定到对话中,协作活动会实时显示在 Messages 对话和 FaceTime 通话中。
Session 覆盖了三种协作基础设施的接入方式:CloudKit(通过新的 collaboration object API)、iCloud Drive(直接使用文件 URL)、以及自定义协作基础设施(通过 SWCollaborationMetadata)。同时介绍了两种发起协作的方式:Share Sheet 的全新协作模式,以及通过拖放到 Messages。
SwiftUI 的 ShareLink API 也支持协作模式,需要配合 Transferable 协议使用。
值得深挖的点
CloudKit 协作对象的新 API 设计。 之前用的是 NSSharingService,现在改用基于 NSItemProvider 的 API,需要提供 CKShare(或创建 share 的 handler)、CKContainer 和 CKAllowedSharingOptions。这个变化意味着旧的 AppKit API 将被弃用,CloudKit 开发者需要尽快迁移。
Share Sheet 协作模式的视觉区分。 新的 Share Sheet 顶部有协作指示器,用户可以在”协作”和”发送副本”之间选择。协作模式下还会显示访问权限和许可级别的摘要信息,让用户在分享前就清楚对方的权限范围。
SwiftUI ShareLink 与 Transferable 的配合。 CloudKit 用户需要实现 CKShareTransferRepresentation,可以提供已有的 CKShare,也可以通过 prepareShare handler 在协作开始时动态创建。这个设计让 ShareLink 在 SwiftUI 中的协作体验变得非常简洁。
代码片段
// CloudKit 协作对象的创建
import CloudKit
let share = CKShare(rootRecord: rootRecord)
let container = CKContainer(identifier: "iCloud.com.example.app")
let options = CKAllowedSharingOptions.standard
// 如果协作尚未开始,使用 preparation handler
let collaborationItem = NSItemProvider()
// 注册 CKShare 作为协作对象
collaborationItem.registerCKShare(container: container, allowedSharingOptions: options) { share, container in
// 创建并保存 CKShare
try await container.share(recordZoneID: share.recordID.zoneID)
}
// SwiftUI 中使用 ShareLink 进行协作
struct NoteView: View {
let note: Note // Note 遵循 Transferable 协议
var body: some View {
ShareLink(item: note, preview: SharePreview(
"共享笔记",
image: Image(systemName: "doc.richtext")
)) {
Label("分享", systemImage: "square.and.arrow.up")
}
}
}
最佳实践
- 区分协作场景和发送副本场景。 Share Sheet 允许用户选择,但你的 App 应该根据内容类型给出合理的默认值。
- 为 Share Sheet 提供标题和图片。 CloudKit 用户需要额外提供
LPLinkMetadata(iOS)或NSPreviewRepresentingActivityItem(macOS),否则 Share Sheet 的头部会是空白的。 - 使用
CKAllowedSharingOptions.standard作为默认选项。 除非有特殊权限需求,默认选项覆盖了常见的访问和许可组合。 - macOS 用户注意新的 Share Popover。 macOS Ventura 有了全新的分享弹出窗口,包含标题、图片、对话建议等元素,体验比之前的 Share Sheet 更好。
还有什么值得关注
- 自定义协作基础设施的开发者需要观看 “Integrate your custom collaboration app with Messages” 获取
SWCollaborationMetadata的详细用法 - 协作内容可以通过拖放从 Files App(iOS)或 Finder(macOS)直接发起
- iCloud Drive 的协作接入最简单,文件 URL 就是协作对象,系统会自动处理
- macOS Ventura 的 Share Popover 还集成了对话建议行,可以快速选择最近联系的联系人