ドキュメント

共有アクティビティへの参加と管理

システムが提供するグループセッションオブジェクトを利用してアクティビティに参加し、Appの動作を同期します。

概要

FaceTime通話の参加者は誰でも、通話中にアクティビティを開始して、そのアクティビティをグループと共有できます。システムによって、共有されたアクティビティが通話の他の参加者に表示され、アクティビティに招待されます。参加者が招待を承諾すると、システムでは次の処理が実行されます。

  • 必要に応じて、Appが起動します。

  • 選択したアクティビティのGroupSession(英語)オブジェクトが作成されます。

  • セッションがAppに非同期に配信されます。

参加者がセッションの特定のアクティビティを変更すると、更新されたセッションがAppに非同期に配信されます。例えば、参加者が番組の別のエピソードを視聴することを選択した場合は、新しいセッションと更新されたセッションの両方で、選択されたコンテンツに合わせてAppのUIが構成されます。

Appでサポートされているアクティビティを知らせる方法について、詳しくは「アクティビティの共有への参加者の招待」を参照してください。

セッションオブジェクトの非同期での受信

システムでは、カスタムのGroupActivity(英語)sessions()(英語)メソッドを使ってGroupSession(英語)オブジェクトがAppに非同期に配信されます。このメソッドはAsyncSequenceタイプを返し、その結果、一回に1つのセッションが非同期に返されます。参加者が現在のセッションを更新すると、そのセッションがシーケンスの次の要素として追加されます。新しいセッションを1つずつ取得するには、for...inループでシーケンスを反復処理する非同期タスクを構成します。

次の例は、SwiftUIビューでセッションを取得する方法を示しています。.task修飾子が非同期タスクを新規作成し、このタスクでアクティビティのセッションが反復処理されます。新しいセッションを受け取ると、タスクによってセッションの状態を表す変数が更新され、ビューの更新がトリガーされます。


struct DrawTogetherView: View {
    @State var session: GroupSession<DrawTogether>?
    var body: some View {
        Text("Draw Together")
            .task {
                // Receive the new session asynchronously.
                for await drawingSession in DrawTogether.sessions() {
                   session = drawingSession
                }
            }
            .fullScreenCover(item: $session) { session in
                DrawingView(session: session)
            }
    }
}

SwiftUIを利用しない場合は、次の例のように、スタンドアロンのasyncブロックを使って非同期タスクを開始します。セッションを受け取ったら、関連するアクティビティを開始または更新するコードを実行します。


// Process an asynchronously delivered session.
async {
    for await drawingSession in DrawTogether.sessions() {
        // Update the app for the new session.
        self.updateActivity(session: drawingSession)
    }
}

AppのUIの準備

新しいGroupSession(英語)オブジェクトを受信したら、即座にそのアクティビティ向けにAppのUIを構成します。Appはユーザーがそのアクティビティに興味を示した場合にのみセッションを受信し、アクティビティの方が優先されます。必要に応じて新しいコンテンツ用のウインドウまたはビューコントローラを表示するか、セッションに関する変更に対応するようにAppの現在のUIを更新します。

アクティビティとセッションに対して必要な検証を実行してから、そのアクティビティ用のUIを表示するようにしてください。参加者にApp内でコンテンツの料金の支払いやログイン資格情報の入力、コンテンツのダウンロード、その他のタスクを実行するように要求する場合は、そのタスク用のUIを先に表示します。こうしたタスクが正常に完了したら、即座に参加者をアクティビティのUIに転送して、セッションへの参加に遅れが発生しないようにします。

グループセッションへの参加とコンテンツの同期の開始

Appがアクティビティをいつでも開始できる状態にあることを確認した上で、グループセッションに参加し、他の参加者のデバイスとのコンテンツの同期を開始します。新しいGroupSession(英語)オブジェクトはグループとのデータの同期をすぐには開始しません。このオブジェクトの最初の状態はGroupSession.State.waiting(英語)であるため、オブジェクトのjoin()(英語)メソッドを明示的に呼び出して、Appが関連付けられたアクティビティを開始できる状態にあることをシステムに知らせる必要があります。join()(英語)の呼び出しが成功すると、セッションの状態がGroupSession.State.joined(英語)に移行し、デバイス間での情報交換が始まります。

join()(英語)メソッドを呼び出す最適なタイミングは、アクティビティ関連のUIを画面上に表示するときです。UIが表示されたらいつでもアクティビティを開始できるようにAppを構成してください。アクティビティの準備に必要な追加の手順をあらかじめ実行します。例えば、UIを表示する前に、メディアコンテンツを利用する権利がユーザーにあることを確認し、必要な認証資格情報の入力をユーザーに求めます。

セッションに参加したら、同期が必要な他のオブジェクトにGroupSession(英語)オブジェクトを渡します。例えば、映画の再生を同期するには、セッションをAVPlaybackCoordinator(英語)オブジェクトに渡します。

アクティビティからの退出

セッションに参加した後、Appはいつでもセッションのleave()(英語)メソッドを呼び出すことでセッションから退出できます。セッションから退出すると、他のユーザーに影響を及ぼすことなくAppをアクティビティから接続解除できます。例えば、メディア再生Appがセッションから退出すると、グループの他のメンバーに対しては再生を停止せずに、ローカルで再生を停止できます。グループから抜けると、Appのセッションの状態がGroupSession.State.invalidated(reason:)(英語)に戻り、他のデバイスとの情報交換が停止します。セッションから退出したら、セッションオブジェクトを破棄します。

ユーザーが次の操作を行ったときに、セッションから退出できます。

  • AppのアクティビティUIから移動する。

  • Appを終了する。

  • 別のAppに切り替える。

他のユーザーが引き続きアクティビティに参加している場合、アクティビティから退出する参加者には、再度参加できるようにするためのUIが表示されます。参加者が再度参加すると、新しいセッションがAppに配信されます。これを使ってセッションに再度参加し、もう一度アクティビティと同期できます。

関連項目

セッション管理