WWDC Quick Look 💓 By SwiftGGTeam
Make a great SharePlay experience

Make a great SharePlay experience

元の動画を見る

ハイライト

iOS 15 での SharePlay の開始を基に、Apple はアプリ内から直接 SharePlay を起動できる機能をさらに開放し、開発者が FaceTime とメッセージで同期されたグループ アクティビティ エクスペリエンスを構築できるように設計のベスト プラクティスを提供しました。

主要内容

「一緒に見る」から「一緒に遊ぶ」へ

以前は、ビデオ通話は音声と画像しか送信できませんでした。 2人が別々の場所で会話している場合、せいぜい「同じビデオを同時に見る」ことができるが、操作が同期せず、体験が断片化してしまう。一方のパーティは一時停止し、もう一方のパーティはプレイを続けます。一方は特定の場面について議論したいと考えていますが、もう一方は次の段落にジャンプしています。

SharePlay の中心となるアイデアは、「共有エクスペリエンス」を通話から分離し、それを独立したグループ アクティビティ (グループ アクティビティ) に変えることです。 FaceTime 通話中に誰かがアクティビティを開始すると、グループ全体が同じアプリに取り込まれ、全員が同期された状態になります。

02:18

3つの体験タイプ

SharePlay は 3 つの異なるエクスペリエンス モードをサポートしており、開発者は独自のシナリオに応じて選択する必要があります。

単一ビューで調整されたエクスペリエンス (単一ビューで調整)。全員が同じコンテンツを見て、同期して操作します。 Apple TV+ は典型的な例です。1 人が一時停止を押すと、全員の写真が一時停止され、再生の進行状況はまったく同じままになります。

09:15

マルチビュー同期エクスペリエンス (マルチビュー調整)。参加者はさまざまな視点から見えますが、体験は調整されています。ゲーム「ヘッズアップ!」は例です。単語を推測した人は答えを見ることができませんが、友達は答えを見てヒントを与えることができます。

10:07

個人の経験 (個人)。誰もが自分のデバイスで独立して作業しますが、アクティビティを通じてつながりを保ちます。たとえば、一緒にワークアウトしたり、一緒に瞑想したりすると、進捗状況は誰もが異なるかもしれませんが、彼らは自分たちが一緒であることを知っています。

「臨場感」を生み出す

デジタル ツールは距離を埋めるためによく使用されますが、SharePlay の目標は、人々がお互いに本当に存在していると感じられるようにすることです。

Apple は、設計演習を推奨しています。SharePlay が、人々を携帯電話を通じて同じ物理空間に移動させるポータルであると想像してください。彼らはあなたのアプリをどのように使用するでしょうか?

06:17

この演習から、いくつかの設計原則を導き出すことができます。

  • 共有コントロール: 本物のレコードプレーヤーと同様に、誰でも歩いて操作できます。イベント作成者だけに制御を与えないでください。
  • 参加者を表示: 現実の人々は誰が出席しているかを確認するために周囲を見回します。参加者のリストもアプリで提供する必要があります。
  • 状況に応じたフィードバック: 他の人の操作により UI が変更された場合、誰が変更したかを説明します。たとえば、「ライアンはビデオを一時停止しました。」

アプリ内から SharePlay を起動する

以前は、SharePlay は FaceTime からのみ起動できました。ユーザーはアプリ内で共有したいコンテンツを見つけて、友達を直接招待できるようになりました。

04:35

これを実現するには 2 つの方法があります。

  1. 共有シート経由: グループ アクティビティを登録すると、共有シートに SharePlay オプションが自動的に表示されます。
  2. SharePlay ボタン経由: 使用しますGroupActivitySharingController招待インターフェイスをアプリ UI に直接表示します。

ユーザーは、FaceTime またはメッセージ経由で開始することを選択できます。メッセージを使用する場合、通話中である必要はありません。相手はメッセージを受信した後、クリックして参加できます。

アクティビティのライフサイクルを処理する

完全な SharePlay アクティビティには 3 つの段階があります。

開始フェーズ。グループアクティビティを登録し、説明的なメタデータ(タイトル、サブタイトル、画像)を設定します。可能であれば、アプリを持っていない人がダウンロードして参加できるように、Web URL を提供します。

11:44

処理フェーズ。参加者のステータスを表示し、ピクチャー・イン・ピクチャーをサポートするため、ユーザーはエクスペリエンスを中断することなく一時的にアプリを離れることができます。ステータス バーが非表示になっている場合は、簡単なジェスチャを提供して、ユーザーがステータス バーを再表示できるようにします。

15:43

フェーズ終了。アクティビティは自然に終了し、突然中断しないでください。

詳細

グループアクティビティの登録

アプリにグループ アクティビティを登録して、アプリが 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アクティビティのタイプを指定すると、システムはそのタイプに基づいて表示を最適化します。

共有シート経由で起動

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()シェアシートにSharePlayオプションを表示させる方法
  • ユーザーが SharePlay を選択すると、システムは連絡先ピッカーを表示します。
  • 転送方法としてFaceTimeまたはメッセージを選択します

同期メディア再生

メディア アプリの場合は、次を使用します。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(_:)プレーヤーをグループセッションにバインドする
  • システムは、すべての参加者の再生の進行状況を一貫して保ちます。

ターゲットを絞ったメッセージを送信する

マルチビューエクスペリエンスを実現するには、次を使用します。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パラメータは受信者のサブセットを指定します
  • ゲームやQ&Aなど、情報を隠す必要があるシナリオに適しています。

重要ポイント

同期視聴アプリを作成する

  • 機能: 友人とリモートで同期して映画を視聴するために特に使用されるアプリで、リアルタイムの集中砲火と音声コメントをサポートします。
  • 実行する価値がある理由: SharePlayAVPlaybackCoordinator最も困難な同期の問題は解決され、開発者はソーシャル エクスペリエンスだけに集中する必要があります。
  • 開始方法: を使用しますAVPlayerViewController + AVPlaybackCoordinator再生基盤を構築するGroupSessionMessenger集中砲火メッセージを配信する

リモート コラボレーション フィットネス アプリを作成する

  • やるべきこと: 遠く離れた友人と一緒にフィットネス クラスを完了し、お互いの進捗状況と心拍数をリアルタイムで確認します
  • 実行する価値がある理由: SharePlay はメディアに依存しないエクスペリエンスをサポートしており、フィットネス シーンは当然、「同じことを一緒に行う」モデルに適しています。
  • 開始方法: を定義します。WorkoutActivity、使用GroupSessionMessenger進行状況データを同期し、参加者のステータスを UI に表示します

ファミリー ゲーム ナイト アプリを作成する

  • やるべきこと: Guess the Word、Draw and Guess、トリビア クイズなど、SharePlay 対応の一連のパーティー ゲーム
  • 実行する価値がある理由: マルチビュー調整モードにより、「1 人が答えを見て、他の人が推測する」ようなゲームが可能になります
  • 開始方法: を使用しますGroupSessionMessengerターゲット送信機能はメッセージの可視性を制御し、役割ごとに異なるビューを表示します。

同期クッキングアプリを作る

  • やるべきこと: 同じレシピに従って友達と料理を作ります。すべてのステップが同期され、お互いの進捗状況を確認できます。
  • 実行する価値がある理由: SharePlay の「存在感」設計原則は、段階的なコラボレーションが必要なシナリオに特に適しています。
  • 開始方法: 定義CookingActivity、グループセッションを使用して現在のステップを同期し、ピクチャーインピクチャーをサポートしているため、野菜を切りながら相手がそれを見ることができます。

関連セッション

コメント

GitHub Issues · utterances