WWDC Quick Look 💓 By SwiftGGTeam
What's new in SharePlay

What's new in SharePlay

观看原视频

Highlight

WWDC 2022 的 SharePlay 更新主要围绕一个变化:开发者现在可以用自己的按钮和入口来发起 SharePlay,不再完全依赖系统提供的 FaceTime 入口。同时 GroupSessionMessenger 获得了可靠性增强,让共享体验的消息传递更稳定。


核心内容

WWDC 2021 推出的 SharePlay 让用户可以在 FaceTime 通话中同步观看视频、听音乐或使用 App。它的入口是 FaceTime——用户在通话中看到 App 支持 SharePlay,点击系统提供的按钮来启动。

但这就有一个问题:如果用户不在 FaceTime 通话中呢?如果你的 App 内部有一个”和朋友一起看”的按钮,用户点击后还要先发起 FaceTime 通话,再回来点 SharePlay——这个流程太长了。

WWDC 2022 的更新解决了这个痛点。你现在可以在 App 内部放一个按钮,点击后直接拉起 SharePlay 会话。系统会帮你处理 FaceTime 通话的建立,用户不需要离开你的 App。同时,GroupSessionMessenger 获得了可靠性改进,让参与者之间的消息传递在不可靠网络下也能正常工作。


详细内容

注册 GroupActivity 的新方式

02:06)过去,GroupActivity 是通过 App 的 Info.plist 中声明来注册的。WWDC 2022 提供了新的编程式注册方式,使用 NSItemProviderregisterGroupActivity

// Register GroupActivity
let itemProvider = NSItemProvider()
itemProvider.registerGroupActivity(WatchTogether())

// Provide the ItemProvider to the ShareSheet
let configuration = UIActivityItemsConfiguration(itemProviders: [itemProvider])

UIActivityViewController(activityItemsConfiguration: configuration)

关键点:

  • registerGroupActivity(_:) 在运行时注册一个 GroupActivity 实例,不再需要在 Info.plist 中静态声明。
  • UIActivityItemsConfiguration 接收 NSItemProvider 数组,用于配置分享菜单的内容。
  • 这个方式与系统分享菜单(ShareSheet)集成,SharePlay 会作为一个 activity 出现在分享选项中。

控制 SharePlay 在分享菜单中的显示方式

系统分享菜单中 SharePlay 的显示方式可以灵活控制。如果你的场景不需要 SharePlay 出现在分享菜单中,或者不需要它作为突出选项,有对应的 API:

let shareSheet = UIActivityViewController(activityItemsConfiguration: configuration)

// Show SharePlay non-prominently
shareSheet.allowsProminentActivity = false
let shareSheet = UIActivityViewController(activityItemsConfiguration: configuration)

// Exclude SharePlay activity
shareSheet.excludedActivityTypes = [.sharePlay]

关键点:

  • allowsProminentActivity = false02:14)让 SharePlay 不作为分享菜单中的突出选项,适合不希望 SharePlay 抢眼的场景。
  • excludedActivityTypes = [.sharePlay]02:15)完全从分享菜单中移除 SharePlay 选项,适合暂时不提供 SharePlay 功能的场景。
  • 这两个属性可以让你精细控制 SharePlay 在分享菜单中的存在方式,而不需要改动 GroupActivity 注册本身。

用自己的按钮发起 SharePlay

02:44)核心的新增 API 是 GroupActivitySharingController。你可以在 App 的任何位置放置一个按钮,点击后直接呈现 SharePlay 联系人选择器:

let controller = GroupActivitySharingController(WatchTogetherActivity())
present(controller, animated: true)

关键点:

  • GroupActivitySharingController 接收一个 GroupActivity 实例,初始化后直接 present 即可。
  • 用户看到的界面是系统提供的联系人选择器,选择联系人后自动发起 FaceTime 通话并启动 SharePlay 会话。
  • 这意味着用户全程不需要离开你的 App,也不需要手动发起 FaceTime 通话。
  • 按钮的放置位置由你决定——可以放在视频播放器旁边、导航栏右侧,或者任何你觉得自然的地方。

GroupSessionMessenger 可靠性增强

在 WWDC 2021 的 SharePlay 中,GroupSessionMessenger 用于在参与者之间发送自定义消息。但它有一个问题:如果某个参与者的网络不稳定,消息可能会丢失。

WWDC 2022 改进了 GroupSessionMessenger 的底层传输可靠性。Apple 没有提供新的 API,而是增强了现有 API 的底层实现,让消息在不可靠网络下也能被送达。

这对需要实时同步的 App 尤其重要。比如一个协作白板 App,用户在画布上画一笔,这条笔画数据需要通过 messenger 发送给所有参与者。如果消息丢失,其他参与者就看不到这一笔。WWDC 2022 的改进让这种场景更可靠。

笔画的实时同步示例

08:21)session 中展示了一个协作画板场景,用 SwiftUI 的 DragGesture 捕获用户笔画并同步:

var strokeGesture: some Gesture {
    DragGesture()
        .onChanged { value in
            canvas.addPointToActiveStroke(value.location)
        }
        .onEnded { value in
            canvas.addPointToActiveStroke(value.location)
            canvas.finishStroke()
        }
}

关键点:

  • onChanged 在拖拽过程中持续触发,将每个触摸点添加到当前笔画中。
  • onEnded 在拖拽结束时添加最后一个点,并调用 finishStroke() 完成笔画。
  • 在这个手势的背后,笔画数据通过 GroupSessionMessenger 发送给其他参与者,实现多人实时协作绘图。
  • 这个例子说明 SharePlay 不只是”一起看视频”,它还适用于需要实时输入同步的协作场景。

最佳实践

session 还总结了将 SharePlay 集成到 App 中的几条最佳实践:

  1. 让入口可见但不突兀。如果 SharePlay 是你的 App 的核心功能,把它放在显眼位置。如果只是辅助功能,可以考虑放在分享菜单中,不设专属按钮。

  2. 为不同参与人数设计 UI。两个人一起看视频的体验和五个人一起协作画画的体验不同。考虑参与人数对 UI 布局的影响。

  3. 处理网络中断。即使 GroupSessionMessenger 的可靠性增强了,网络仍然可能断开。你的 App 需要优雅地处理参与者断开和重连。

  4. 遵守 Human Interface Guidelines。Apple 提供了 SharePlay 的 HIG 文档,包括图标使用、入口设计和会话中的 UI 行为。


核心启发

  1. 把 SharePlay 入口放进 App 内部:如果你的 App 的核心体验适合共享(一起看视频、一起听歌、一起画画),不要等用户在 FaceTime 中发现你的 App。在 App 内放一个”一起看”或”一起听”的按钮,用 GroupActivitySharingController 直接拉起 SharePlay。为什么值得做:减少了用户的操作步骤,从”发起 FaceTime → 找到 App → 点 SharePlay”变成”在 App 内点按钮”。怎么开始:找一个自然的位置放按钮,比如视频播放器右上角或导航栏右侧。

  2. 用分享菜单作为轻量入口:如果你不想在 UI 中增加一个专属按钮,可以用 registerGroupActivityUIActivityViewController 把 SharePlay 加到系统分享菜单中。这个方式的好处是不需要改动现有 UI。为什么值得做:对于 SharePlay 不是核心功能的 App,分享菜单入口最不侵入。怎么开始:注册 GroupActivity,配置 UIActivityItemsConfiguration,在需要的地方弹出分享菜单。

  3. 为协作场景使用 GroupSessionMessenger:WWDC 2022 的 messenger 可靠性改进让实时协作更可行。如果你在做白板、文档协作或游戏,通过 messenger 发送自定义数据可以实现比”同步播放进度”更丰富的共享体验。为什么值得做:messenger 是 SharePlay 从”被动同步”到”主动协作”的关键 API。怎么开始:在 GroupSession 的回调中获取 messenger 实例,定义你的消息类型,在用户操作时发送。


关联 Session

评论

GitHub Issues · utterances