WWDC Quick Look 💓 By SwiftGGTeam
Meet Group Activities

Meet Group Activities

元の動画を見る

ハイライト

Apple は iOS 15 で SharePlay とグループ アクティビティを導入し、開発者が FaceTime 通話でのメディア再生とカスタム コラボレーション エクスペリエンスをシステム レベルのセッション、同期再生、エンドツーエンドの暗号化データ チャネルに統合できるようにしました。

主要内容

動画アプリを作りました。 2 人のユーザーが同じビデオを一緒に視聴したい場合、最も原始的な方法は、音声で「3、2、1、再生」とカウントダウンすることです。誰かが一時停止し、誰かが進行状況バーをドラッグすると、他の人は手動で追い続ける必要があります。

同期を自分で実装すると、作業がすぐに複雑になる可能性があります。同じ部屋に誰がいるのかを把握し、再生、一時停止、ジャンプの状態を伝達し、通話、音量、ピクチャ イン ピクチャ、およびマルチデバイスの切り替えを処理する必要があります。メディア コンテンツ自体を通話を通じて再送信することはできません。そうしないと、画質、著作権、帯域幅に問題が発生します。

SharePlay はこのシーンを FaceTime とメッセージに組み込みます。ユーザーはまずシステム セッションに入り、次にアプリでグループ アクティビティを開始します。システムは、招待、参加、退出、およびクロスデバイスの認識を担当します。アプリは共有するアクティビティを定義する必要があります。

メディア アプリの場合、グループ アクティビティと AVFoundation (オーディオおよびビデオ インフラストラクチャ) が連携します。再生コンテンツは引き続きアプリとサーバーから取得され、システムは再生ステータスのみを同期します。ユーザーが再生、一時停止を押すか、進行状況をドラッグすると、グループ内の他のデバイスが同期に従います。

カスタム コラボレーション アプリの場合、GroupSession はエンドツーエンドの暗号化チャネルを提供します。これを使用して、「ストロークを描く」または「ページ 3 に切り替える」などの状態を渡すことができます。大きなファイルの転送には適していませんが、ユーザーの同期を保つために必要な小さなメッセージの転送には適しています。

詳細

SharePlay で起動できるアクティビティを定義する

07:24

GroupActivity (グループ アクティビティ) は、フレームワークの中心となるオブジェクトです。これは、FaceTime 通話中の相手に対してできることを表します。

メディア アプリでは、現在再生中のコンテンツの URL を保存できます。お絵描きアプリでは、入力したいキャンバス情報を保存できます。講演の中で、アプリケーションが最初に実装を作成することが明確に述べられました。GroupActivityプロトコルのオブジェクトを呼び出しますprepareForActivation

import Foundation
import GroupActivities

struct MovieActivity: GroupActivity {
    let contentURL: URL

    var metadata: GroupActivityMetadata {
        var metadata = GroupActivityMetadata()
        metadata.title = "Movie Night"
        metadata.type = .watchTogether
        return metadata
    }
}

キーポイント:

  • import Foundation供給URLタイプ。
  • import GroupActivitiesSharePlay の背後にあるフレームワークを紹介します。
  • MovieActivity従うGroupActivity、アプリが共有をサポートするアクティビティを示します。
  • contentURL「GroupActivity は、エクスペリエンスを共有するために必要な情報を保持しています」というスピーチの説明に対応して、このイベントで再生されるコンテンツの場所を保存します。
  • metadataアクティビティ情報をシステムに表示します。
  • metadata.type = .watchTogetherこれが一緒に視聴されるメディア エクスペリエンスであることを示します。

アクティビティを開始する前にユーザーに確認を求める

07:48

ユーザーが FaceTime 通話中にアプリを開いて再生ボタンをクリックしたとき、アプリは全員をアクティビティに直接引き込むべきではありません。スピーチでは次のように述べられました。prepareForActivationユーザーは、「FaceTime で全員と共有する」か「ローカルのみで続行する」のどちらかを選択するよう求められます。

確認後、アプリが再度呼び出しますactivate、共有エクスペリエンスを開始するようにシステムに指示します。

import Foundation
import GroupActivities

func startMovieNight(contentURL: URL) async throws {
    let activity = MovieActivity(contentURL: contentURL)
    let result = await activity.prepareForActivation()

    if result == .activationPreferred {
        try await activity.activate()
    }
}

キーポイント:

  • MovieActivity(contentURL:)このイベントを作成して共有します。
  • prepareForActivation()ユーザーが突然共有エクスペリエンスに持ち込まれることを避けるために、システム確認プロセスをトリガーします。
  • result == .activationPreferredユーザーの選択とグループの共有を表します。
  • activate()アクティビティを開始し、対応する GroupSession が参加デバイスに配布されます。

GroupSession を聞いてセッションに参加する

12:44

アクティビティが開始されると、開始デバイスと受信デバイスの両方が着信セッションをリッスンします。スピーチでは、アプリケーションはトラバースする必要があると述べていますGroupSessionの上AsyncSequence。セッションを受けたら、まず準備をしてから電話してくださいjoin

準備はアプリの種類によって異なります。描画アプリは最初にキャンバス リソースを読み込むことができます。メディア アプリは、まずプレーヤーを準備し、プレーヤーのコーディネーターをセッションに接続します。

import AVFoundation
import GroupActivities

func observeMovieSessions(player: AVPlayer) async {
    for await session in MovieActivity.sessions() {
        player.playbackCoordinator.coordinateWithSession(session)
        session.join()
    }
}

キーポイント:

  • MovieActivity.sessions()受信セッションの非同期シーケンスを返します。
  • for awaitシステムが GroupSession をアプリに引き渡すのを継続的に待ちます。
  • player.playbackCoordinatorAVPlayer の再生コーディネーターです。
  • coordinateWithSession(session)AVFoundation の同期再生を GroupSession に接続します。
  • session.join()セッションに参加すると、システムはエンドツーエンドの暗号化チャネルを確立します。

メディア コンテンツではなく、GroupSession を使用して同期ステータスを送信します

10:21

GroupSession は、共有エクスペリエンスに参加しているグループを表します。参加者にアクセスでき、フレームワーク内の他の API と連携してデバイス間でデータを送受信することもできます。

このチャネルには境界があります。講演では、大量のデータの交換を目的としていないことが具体的に述べられています。曲を共有する場合、曲ファイルの転送には使用しないでください。 AVFoundation はこれを使用して、再生、一時停止、ジャンプのコマンドを交換し、両端を同じ再生状態に保ちます。

import GroupActivities

func joinDrawingSession(session: GroupSession<DrawingActivity>) {
    let participants = session.activeParticipants

    for participant in participants {
        print(participant.id)
    }

    session.join()
}

キーポイント:

  • GroupSession<DrawingActivity>描画アクティビティのグループ セッションを表します。
  • activeParticipants現在共有エクスペリエンスに参加しているユーザーのコレクションを読み取ります。
  • ループ内participant.id参加者を識別するために使用できます。
  • session.join()現在のデバイスを共有エクスペリエンスに正式に参加させます。
  • このチャネルは、描画操作、ページ位置、再生ステータスなどの同期情報の送信に適しています。

メディア再生イベントをシステムに渡して表示できます

15:28

ユーザーが一緒に映画を鑑賞するとき、グループのメンバーは何が起こっているのかを知る必要があります。誰が一時停止し、誰がセクションをスキップし、誰が次のセクションを始めたのか。グループ アクティビティは、システムがプロンプトを表示できるようにするイベントの発行をサポートしています。

スピーチでは、使用する場合は次のように述べていますAVPlayerまたはAVDelegatingPlaybackCoordinator、メディア再生イベントは、この一連の機能を自動的に取得できます。どちらも使用しないアプリでも、フレームワークを通じてイベントを発行できます。

import AVFoundation
import GroupActivities

func configureSharedPlayback(player: AVPlayer, session: GroupSession<MovieActivity>) {
    player.playbackCoordinator.coordinateWithSession(session)
    session.join()
}

キーポイント:

  • AVPlayerアプリ自体が提供するメディア コンテンツの再生を担当します。
  • GroupSession<MovieActivity>現在の SharePlay グループを表します。
  • coordinateWithSession(session)GroupSession を通じてプレーヤーに再生状態を同期させます。
  • session.join()参加関係を確立すると、グループ内で再生、一時停止、ジャンプが同期されます。
  • AVPlayer を使用する場合、再生イベント プロンプトはシステムによって処理されます。

重要ポイント

  • やるべきこと: 長編ビデオ アプリに「一緒に見る」ボタンを追加します。 実行する価値がある理由: 講演で説明されているように、SharePlay を使用すると、FaceTime のユーザーは、AVFoundation によって再生状態が同期され、アプリから直接共有メディア エクスペリエンスを起動できます。 開始方法: ビデオの保存 URL を定義しますGroupActivity、再生ボタンで呼び出されますprepareForActivation()そしてactivate()、モニターMovieActivity.sessions()バックハンドルAVPlayer.playbackCoordinatorセッションを受信しました。

  • やるべきこと: ポッドキャスト アプリをリモートで共同視聴できるようにします。 実行する価値がある理由: オーディオ コンテンツも共有メディア再生シナリオに属します。システムはインテリジェントな音量を処理し、ユーザーが話すときにコンテンツの音量を下げることができます。 開始方法: 単一のエピソード用に作成するGroupActivity、使用AVPlayerオーディオを再生し、GroupSession に参加し、再生コーディネーターを使用して同期的に再生、一時停止、ジャンプします。

  • やるべきこと: FaceTime を使用して、ホワイトボード アプリと一緒に絵を描きます。 実行する価値がある理由: このスピーチではカスタム エクスペリエンスの例として描画を使用しており、GroupSession はエンドツーエンドの暗号化されたデータ チャネルを提供します。 開始方法: アクティブなオブジェクトにキャンバス ID を保存させます。セッションに入った後、キャンバス リソースをロードします。 GroupSession のメッセージング機能を使用して、ストローク、元に戻す、クリアなどの小さな状態を転送します。

  • やるべきこと: オンラインコースアプリの「クラスメイトが一緒に授業を視聴」できるようにします。 価値がある理由: コースビデオはサーバーから引き続き再生されます。SharePlay は再生状態を同期するだけで、メディアを再送信しません。 開始方法: レッスンの URL を GroupActivity に入力します。セッションに参加した後に AVPlayer を調整します。チャプターを切り替えるときにローカルプレーヤーのステータスを更新します。

  • やるべきこと: Web コンパニオン サービスの Safari 共有エクスペリエンスを計画します。 実行する価値がある理由: プレゼンテーション ノート グループ アクティビティは、macOS 上の WebKit をサポートし、SharePlay を Web サイトに拡張できます。 開始方法: まず、「グループ アクティビティを使用して Safari でのメディア再生を調整する」を読み、アプリ側のアクティビティ モデルを Web 側のメディア再生状態にマッピングします。

関連セッション

コメント

GitHub Issues · utterances