Highlight
Apple 在 iOS 15 推出 SharePlay 的基础上,进一步开放了从 App 内直接启动 SharePlay 的能力,并提供了设计最佳实践,让开发者可以在 FaceTime 和 Messages 中构建同步的群组活动体验。
核心内容
从”一起看”到”一起玩”
以前,视频通话只能传递声音和画面。两个人异地通话时,最多做到”同时看同一个视频”,但操作不同步、体验割裂。一方暂停了,另一方还在继续播放;一方想讨论某个画面,另一方已经跳到了下一段。
SharePlay 的核心思路是把”共享体验”从通话中剥离出来,变成一个独立的群组活动(Group Activity)。当有人在 FaceTime 通话中启动一个活动时,整个群组会被带入同一个 App,所有人看到的是同步的状态。
(02:18)
三种体验类型
SharePlay 支持三种不同的体验模式,开发者需要根据自己的场景选择:
单视图同步体验(Single-view coordinated)。所有人看到同样的内容,操作同步。Apple TV+ 是典型例子:一个人按暂停,所有人的画面都暂停,播放进度保持完全一致。
(09:15)
多视图同步体验(Multiview coordinated)。参与者看到不同的视图,但体验是协调的。Heads Up! 游戏就是一个例子:猜词的人看不到答案,朋友能看到答案并给出提示。
(10:07)
独立体验(Individual)。每个人在自己的设备上独立操作,但通过活动保持连接。比如一起健身、一起冥想,每个人的进度可能不同,但知道彼此在一起。
营造”在场感”
数字工具通常用来弥补距离感,但 SharePlay 的目标是让人真正感觉彼此在场。
Apple 推荐一个设计练习:想象 SharePlay 是一个传送门,把人们通过手机传送到同一个物理空间。他们会怎么使用你的 App?
(06:17)
从这个练习中可以推导出几个设计原则:
- 共享控制:像真实的唱片机一样,任何人都可以走过去操作。不要把控制权只交给活动发起者。
- 显示参与者:人们在现实中会环顾四周看看谁在场。App 中也要提供参与者列表。
- 上下文反馈:当 UI 因为别人的操作发生变化时,要说明是谁做的。比如”Ryan 暂停了视频”。
从 App 内启动 SharePlay
以前 SharePlay 只能从 FaceTime 启动。现在用户可以在 App 内找到想分享的内容,直接邀请朋友加入。
(04:35)
实现方式有两种:
- 通过 Share Sheet:注册 Group Activity 后,Share Sheet 会自动显示 SharePlay 选项。
- 通过 SharePlay 按钮:使用
GroupActivitySharingController在 App UI 中直接展示邀请界面。
用户可以选择通过 FaceTime 或 Messages 发起。通过 Messages 时,不需要正在通话,对方收到消息后点击即可加入。
处理活动生命周期
一个完整的 SharePlay 活动有三个阶段:
开始阶段。注册 Group Activity,配置描述性的 metadata(标题、副标题、图片)。如果可能,提供一个网页 URL,方便没有安装 App 的人下载后加入。
(11:44)
进行阶段。显示参与者状态,支持画中画(Picture in Picture)让用户可以暂时离开 App 而不中断体验。如果状态栏被隐藏,提供简单手势让用户可以重新显示。
(15:43)
结束阶段。自然地结束活动,不要突然中断。
详细内容
注册 Group Activity
在 App 中注册 Group Activity,让系统知道你的 App 支持 SharePlay:
import GroupActivities
struct MovieActivity: GroupActivity {
var metadata: GroupActivityMetadata {
var metadata = GroupActivityMetadata()
metadata.title = "Watching Inception"
metadata.subtitle = "Sci-Fi · 2010"
metadata.type = .watchTogether
return metadata
}
}
关键点:
GroupActivity协议定义了一个可共享的活动metadata提供活动的描述信息,会显示在邀请界面type指定活动类型,系统会根据类型优化展示
通过 Share Sheet 启动
import UIKit
import GroupActivities
class ViewController: UIViewController {
func shareMovie(_ movie: Movie) {
let activity = MovieActivity(movie: movie)
// 注册 Group Activity
activity.register()
let activityItems: [Any] = [movie.title, movie.shareURL]
let vc = UIActivityViewController(
activityItems: activityItems,
applicationActivities: nil
)
present(vc, animated: true)
}
}
关键点:
register()方法让 Share Sheet 显示 SharePlay 选项- 用户选择 SharePlay 后,系统会展示联系人选择器
- 选择 FaceTime 或 Messages 作为传输方式
同步媒体播放
对于媒体类 App,使用 AVPlaybackCoordinator 实现同步播放:
import AVFoundation
class PlayerViewController: UIViewController {
let player = AVPlayer()
var playbackCoordinator: AVPlaybackCoordinator?
func joinGroupSession(_ session: GroupSession<MovieActivity>) {
// 将会话与播放器协调器关联
playbackCoordinator = player.playbackCoordinator
playbackCoordinator?.coordinateWithSession(session)
}
}
关键点:
AVPlaybackCoordinator自动处理播放、暂停、跳转的同步coordinateWithSession(_:)将播放器绑定到 Group Session- 系统会保持所有参与者的播放进度一致
发送定向消息
对于多视图体验,使用 GroupSessionMessenger 向特定参与者发送消息:
import GroupActivities
class GameViewController: UIViewController {
var messenger: GroupSessionMessenger?
func sendClueToGuesser(_ clue: String, guesser: Participant) {
let message = GameMessage(type: .clue, content: clue)
messenger?.send(message, to: [guesser]) { error in
if let error = error {
print("Failed to send: \(error)")
}
}
}
}
关键点:
GroupSessionMessenger提供组内通信能力send(_:to:)的to参数指定接收者子集- 适合需要隐藏信息的场景,如游戏、问答
核心启发
做一个同步观影 App
- 做什么:一个专门用于和朋友远程同步看电影的 App,支持实时弹幕和语音评论
- 为什么值得做:SharePlay 的
AVPlaybackCoordinator已经解决了最困难的同步问题,开发者只需要专注社交体验 - 怎么开始:用
AVPlayerViewController+AVPlaybackCoordinator搭建播放基础,通过GroupSessionMessenger传递弹幕消息
做一个远程协作健身 App
- 做什么:和远方的朋友一起完成健身课程,实时看到对方的进度和心率
- 为什么值得做:SharePlay 支持非媒体类的独立体验,健身场景天然适合”在一起做同一件事”的模型
- 怎么开始:定义一个
WorkoutActivity,用GroupSessionMessenger同步进度数据,在 UI 上显示参与者的状态
做一个家庭游戏夜 App
- 做什么:一系列支持 SharePlay 的派对游戏,如猜词、你画我猜、 trivia 问答
- 为什么值得做:多视图协调模式让”一个人看答案、其他人猜”这类游戏成为可能
- 怎么开始:用
GroupSessionMessenger的定向发送功能控制信息可见性,为不同角色渲染不同视图
做一个同步烹饪 App
- 做什么:和朋友一起跟着同一个食谱做菜,每一步都同步,可以互相看到进度
- 为什么值得做:SharePlay 的”在场感”设计原则特别适合需要按步骤协作的场景
- 怎么开始:定义
CookingActivity,用 Group Session 同步当前步骤,支持画中画让对方在切菜时也能看到
关联 Session
- What’s new in SharePlay — 了解 SharePlay 的新 API 和启动方式
- Meet Apple Music API and MusicKit — 音乐共享体验的技术基础
- Design for Collaboration with SharePlay — SharePlay 协作设计指南
评论
GitHub Issues · utterances