WWDC Quick Look 💓 By SwiftGGTeam
Make a great SharePlay experience

Make a great SharePlay experience

观看原视频

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

实现方式有两种:

  1. 通过 Share Sheet:注册 Group Activity 后,Share Sheet 会自动显示 SharePlay 选项。
  2. 通过 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

评论

GitHub Issues · utterances