iOS 送信者アプリを Cast SDK v2 からキャスト アプリケーション フレームワーク(CAF)に移行する

次の手順で、iOS の送信者アプリを Cast SDK v2 から GCKCastContext シングルトンに基づく CAF Sender に変換できます。

はじめに

  • CAF Sender は、Google Cast デベロッパー ウェブサイトv2 などの CocoaPods で引き続き配信されます。
  • Google Cast の設計チェックリストの遵守を担う新しいクラスが追加されました。
  • CAF Sender は Cast UX の要件を遵守するウィジェットを提供していますが、v2 では UI コンポーネントが提供されず、これらのウィジェットを実装する必要がありました。
  • CAF 送信者の設計は、Cast Android SDK の設計と同じです。
  • CAF 送信者は v2 などのビットコードをサポートします。
  • CAF のクローズド キャプションは v2 の機能です。

依存関係

CAF Sender は iOS バージョン 8 以降をサポートしています。

初期化

CAF では、Cast フレームワークに明示的な初期化手順が必要です。これには、適切な GCKCastOptions を使用して GCKCastContext シングルトンを初期化し、ウェブレシーバー アプリケーション ID とその他のグローバル オプションを指定することが含まれます。これは通常、AppDelegate -[application:didFinishLaunchingWithOptions:] メソッドで行います。

GCKCastOptions *options = [[GCKCastOptions alloc]
    initWithReceiverApplicationID:applicationID];
[GCKCastContext setSharedInstanceWithOptions:options];

v2 では、このステップは不要です。

デバイス検出

CAF では、アプリがフォアグラウンドに移行してバックグラウンドに移行すると、フレームワークによって検出プロセスが自動的に開始、停止されます。v2 の GCKDeviceScanner クラスと GCKFilterCriteria クラスは非推奨です。使用しないでください。

キャスト ボタンとキャスト ダイアログ

CAF では、キャスト アイコンとダイアログはフレームワークによって提供されます。キャスト ボタンをインスタンス化し、ナビゲーション バーに次のように追加できます。

GCKUICastButton *castButton =
    [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor whiteColor];
self.navigationItem.rightBarButtonItem =
    [[UIBarButtonItem alloc] initWithCustomView:castButton];

キャスト アイコンはストーリーボードに追加することもできます。

ユーザーがボタンをタップすると、キャスト ダイアログが自動的に表示されます。

デバイス コントロール

CAF では、デバイス制御の大部分はフレームワークによって処理されます。送信者アプリは、デバイスへの接続と Web Receiver アプリの起動を処理する必要はありません。v2 クラス GCKDeviceManager は非推奨です。使用しないでください。送信者と Web Receiver の間のやり取りを「セッション」と表記します。CAF の GCKSessionManager クラスは、セッションのライフサイクルを処理し、ユーザーの操作に応じてセッションを自動的に開始、停止します。ユーザーがキャスト ダイアログでキャスト デバイスを選択するとセッションが開始し、ユーザーがキャスト ダイアログの [キャストを停止] ボタンをタップすると、または送信側アプリ自体が終了したときにセッションが終了します。GCKSessionManagerListenerGCKSessionManager に登録することで、送信者のアプリにセッション ライフサイクル イベントの通知を受け取ることができます。GCKSessionManagerListener プロトコルは、すべてのセッション ライフサイクル イベントのコールバック メソッドを定義します。

GCKCastSession クラスは、キャスト デバイスとのセッションを表します。このクラスには、デバイスの音量とミュート状態を制御するメソッドが用意されています。これらは、以前は GCKDeviceManager のメソッドを使用して v2 で行われていました。

v2 では、GCKDeviceManagerDelegate プロトコルにより、音量、ミュート状態、スタンバイ ステータスなど、デバイスの状態の変化が通知されます。CAF では、音量 / ミュート状態変化の通知は、GCKSessionManagerListener プロトコルのコールバック メソッドを介して配信されます。これらのリスナーは GCKSessionManager に登録されます。残りのデバイス状態通知はすべて、GCKCastDeviceStatusListener プロトコルを介して配信されます。これらのリスナーは GCKCastSession に登録されます。

再接続ロジック

v2 と同様に、CAF は、一時的な Wi-Fi 信号の損失やその他のネットワーク エラーによって失われたネットワーク接続の再確立を試みます。これはセッション レベルで行われるため、セッションは接続が失われたときに「一時停止」状態になり、接続が回復すると「接続」状態に戻ります。フレームワークは、このプロセスの一環として Web Receiver アプリケーションに再接続し、キャスト チャンネルを再接続します。

また、CAF により、セッションが自動的に再開されます。キャスト セッションの進行中に、送信側アプリがバックグラウンドに送信されるか、(スワイプによって、またはクラッシュが原因で)終了した場合、送信側アプリがフォアグラウンドに戻ったとき、または再起動したときに、フレームワークはそのセッションを再開しようとします。これは GCKSessionManager によって自動的に処理されます。これにより、登録された GCKSessionManagerListener インスタンスで適切なコールバックが発行されます。

カスタム チャンネル登録

v2 では、GCKCastChannel サブクラスまたは GCKGenericChannel とデリゲートのいずれかを使用して実装されたカスタム チャネルが GCKDeviceManager に登録されました。CAF では、カスタム チャネルは GCKCastSession インスタンスに登録されます。登録は、GCKSessionManagerListener -[sessionManager:didStartCastSession:] コールバック メソッドで行うことができます。メディアアプリの場合、GCKMediaControlChannel を明示的に登録する必要がなくなりました。詳しくは次のセクションをご覧ください。

メディア コントロール

v2 クラス GCKMediaControlChannel は非推奨です。使用しないでください。CAF には、新しい GCKRemoteMediaClient クラスに置き換えられました。このクラスは、より便利な API で同等の機能を提供します。このオブジェクトを明示的に初期化または登録する必要はありません。ウェブ レシーバ アプリケーションが接続されてメディア名前空間がサポートされている場合、フレームワークは自動的にオブジェクトをインスタンス化し、基盤となるメディア チャネルを登録します。

GCKRemoteMediaClient には、GCKCastSession オブジェクトの -[remoteMediaClient] プロパティを使用してアクセスできます。

v2 では、GCKMediaControlChannel で発行されたすべてのメディア リクエストは数値のリクエスト ID を返します。GCKMediaControlChannelDelegate のメソッドでは、リクエストの完了または失敗に関する通知を送信するときにこの ID が提供されます。

CAF では、GCKRemoteMediaClient で発行されたすべてのメディア リクエストは GCKRequest オブジェクトを返します。このオブジェクトには、GCKRequestDelegate プロトコルが関連付けられています。これを使用して、リクエストの進捗状況と最終的な結果を追跡できます。

v2 の GCKMediaControlChannel は、GCKMediaControlChannelDelegate を介してウェブ レシーバーのメディア プレーヤーの状態の変化に関する通知を送信します。CAF では、GCKRemoteMediaClientGCKRemoteMediaClientListener プロトコルを介して同等のコールバックを提供します。任意の数のリスナーを GCKRemoteMediaClient に登録できます。これにより、複数の送信者コンポーネントが、セッションに関連付けられている GCKRemoteMediaClient の単一インスタンスを共有できます。

v2 では、送信側アプリがウェブ レシーバのメディア プレーヤーの状態との同期を維持する必要がありました。CAF では、クラス GCKUIMediaController がこの役割の大部分を担います。このコンポーネントの使用方法の例については、Codelab チュートリアルのドキュメントをご覧ください。

案内用のオーバーレイ

V2 には、概要オーバーレイ UI がありません。

CAF は、-[presentCastInstructionsViewControllerOnce] メソッドを含むクラス GCKCastContext を追加します。送信アプリは、このメソッドがユーザーに初めて表示されるときにキャスト アイコンをハイライト表示するために使用できます。

ミニ コントローラ

v2 では、送信アプリにミニ コントローラをゼロから実装する必要があります。

CAF では、フレームワークにコントロール バー GCKUIMiniMediaControlsViewController が用意されています。このバーは、永続コントロールを表示するシーンに追加できます。送信者アプリにミニ コントローラを追加するには、次の 2 つの方法があります。

拡張コントローラ

v2 では、拡張されたコントローラを送信者アプリにゼロから実装する必要があります。

CAF は、GCKUIMediaController を追加します。これにより、拡張コントローラの実装が容易になります。

CAF は、ビルド済みの拡張コントローラ ウィジェット GCKUIExpandedMediaControlsViewController をアプリに追加するだけです。GCKUIMediaController を使用してカスタム拡張コントローラを実装する必要はありません。

デバッグ ロギング

v2 の GCKLogger クラスと GCKLoggerDelegate クラスは CAF に引き継がれ、いくつかの変更が加えられています。

GCKLoggerDelegate-[logFromFunction:message:] メソッドのサポートが終了し、-[logMessage:fromFunction:] に置き換えられました。

フレームワークのログメッセージをフィルタリングするには、適切な GCKLoggerFilter インスタンスを作成し、GCKLogger シングルトンの -[filter] プロパティを設定することでそれを割り当てます。

サンプルアプリ

CAF 用に作成された Codelabサンプルアプリを確認することをおすすめします。