下列程序可讓您將 iOS 寄件者應用程式從 Cast SDK 第 2 版轉換為 CAF 傳送者 (以 GCKCastContext 單例模式為基礎)。
簡介
- CAF 傳送來源仍透過 Google Cast 開發人員網站和 CocoaPods (例如 v2) 發布。
- 我們加入了新的類別,負責遵守 Google Cast 設計檢查清單。
- CAF 傳送者所提供的小工具符合 Cast UX 需求;v2 不提供任何 UI 元件,而且您必須實作這些小工具。
- CAF 傳送者設計與 Cast Android SDK 設計一致。
- CAF 傳送方支援 Bitcode,例如 v2。
- CAF 中的隱藏式輔助字幕與 v2 類似。
依附元件
CAF 傳送方支援 iOS 8 以上版本。
初始化
在 CAF 中,投放架構必須明確執行初始化步驟。這會叫用 GCKCastContext
單例模式,並使用適當的 GCKCastOptions
指定 Web Receiver 應用程式 ID 和任何其他全域選項。這通常會在 AppDelegate
-[application:didFinishLaunchingWithOptions:]
方法中完成:
GCKCastOptions *options = [[GCKCastOptions alloc]
initWithReceiverApplicationID:applicationID];
[GCKCastContext setSharedInstanceWithOptions:options];
這在第 2 版中不需要執行這個步驟。
探索裝置
在 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
已淘汰,因此不應使用。寄件者與網路接收器之間的互動現在會表示為「工作階段」。CAF GCKSessionManager
類別會處理工作階段生命週期,並自動啟動及停止工作階段,以回應使用者的手勢:當使用者在 Cast 對話方塊中選取投放裝置時,工作階段就會啟動,並在使用者輕觸 Cast 對話方塊中的「Stop Casting」按鈕時結束,或傳送者應用程式終止。透過 GCKSessionManager
註冊 GCKSessionManagerListener
,即可向傳送者應用程式通知工作階段生命週期事件的通知。GCKSessionManagerListener
通訊協定會定義所有工作階段生命週期事件的回呼方法。
GCKCastSession
類別代表與投放裝置的工作階段。該類別具有用於控制裝置音量和靜音狀態的方法,先前在 v2 中使用 GCKDeviceManager
的方法設定了。
在第 2 版中,GCKDeviceManagerDelegate
通訊協定提供了有關裝置狀態異動的通知,包括音量、靜音狀態、待機狀態等等。在 CAF 中,音量/靜音狀態變更通知是透過 GCKSessionManagerListener
通訊協定中的回呼方法傳送;這些事件監聽器會註冊 GCKSessionManager
。其餘的裝置狀態通知都是透過 GCKCastDeviceStatusListener
通訊協定提供;這些事件監聽器會以 GCKCastSession
註冊。
重新連結邏輯
與第 2 版一樣,CAF 會嘗試重新建立因暫時性的 WiFi 訊號遺失或其他網路錯誤而中斷的網路連線。這現在會在工作階段層級完成;當連線中斷時,工作階段可以進入「暫停」狀態,當連線恢復時,則會切換回「已連線」狀態。在這個過程中,架構會負責重新連線至 Web Receiver 應用程式,並重新連結任何 Cast 頻道。
此外,CAF 也會自動恢復工作階段。如果傳送者應用程式傳送至背景,或者在投放工作階段期間滑動 (或因為當機事件) 終止,則當傳送者應用程式返回前景或重新啟動時,架構會嘗試繼續執行該工作階段;GCKSessionManager
會自動處理該事件,並在所有已註冊的 GCKSessionManagerListener
執行個體發出適當的回呼。
自訂頻道註冊
在 v2 中,自訂頻道 (使用 GCKCastChannel
子類別,或 GCKGenericChannel
和委派) 已向 GCKDeviceManager
註冊。而在 CAF 中,自訂管道則改向 GCKCastSession
執行個體註冊。可以在 GCKSessionManagerListener
-[sessionManager:didStartCastSession:]
回呼方法中完成註冊。就媒體應用程式而言,不再需要明確註冊 GCKMediaControlChannel
;詳情請參閱下一節。
媒體管理
v2 類別 GCKMediaControlChannel
已淘汰,因此不應使用。在 CAF 中,它會由新的 GCKRemoteMediaClient
類別所取代,後者可在更便利的 API 中提供對等的功能。不需要明確初始化或註冊此物件;如果連線的 Web Receiver 應用程式支援媒體命名空間,架構將自動對物件執行個體化並註冊基礎媒體管道。
可使用 GCKCastSession
物件的 -[remoteMediaClient]
屬性存取 GCKRemoteMediaClient
。
在第 2 版中,GCKMediaControlChannel
上發出的所有媒體要求都會傳回數字要求 ID,而 GCKMediaControlChannelDelegate
的方法則會傳送要求完成或失敗的通知。
在 CAF 中,所有透過 GCKRemoteMediaClient
發出的媒體要求都會傳回 GCKRequest
物件;這個物件具有相關聯的 GCKRequestDelegate
通訊協定,可用於追蹤要求的進度和最終結果。
v2 GCKMediaControlChannel
會透過 GCKMediaControlChannelDelegate
傳送 Web 接收器上的媒體播放器狀態變更的通知。在 CAF 中,GCKRemoteMediaClient
透過其 GCKRemoteMediaClientListener
通訊協定提供對等的回呼。使用 GCKRemoteMediaClient
可以註冊不限數量的事件監聽器,讓多個寄件者元件能夠共用與工作階段相關聯的單一 GCKRemoteMediaClient
例項。
在第 2 版中,傳送端應用程式必須負責讓使用者介面與網路接收器上的媒體播放器狀態保持同步。在 CAF 中,GCKUIMediaController
類別負責處理大部分的責任;請參閱 程式碼研究室教學課程說明文件,瞭解如何使用此元件的範例。
簡介重疊廣告
V2 不提供入門重疊使用者介面。
CAF 會使用方法 -[presentCastInstructionsViewControllerOnce]
新增 GCKCastContext
類別,寄件者應用程式可在使用者首次看到「投放」按鈕時醒目顯示該按鈕。
迷你控制器
在第 2 版中,您需要在傳送者應用程式中從頭開始實作迷你控制器。
在 CAF 中,架構會提供一個控制列 GCKUIMiniMediaControlsViewController
,您可以在此新增要顯示持續控制項的場景。您可以透過下列兩種方式將迷你控制器新增至寄件者應用程式:
使用
GCKUICastContainerViewController
包裝現有的檢視控制器,並在其底部加入GCKUIMiniMediaControlsViewController
,以讓 Cast 架構管理迷你控制器的版面配置。使用
-[createMiniMediaControlsViewController]
建立GCKUIMiniMediaControlsViewController
執行個體,然後將該控制器新增至容器檢視控制器,作為將子控制器直接新增至現有檢視控制器。
已展開控制器
在第 2 版中,您需要在寄件者應用程式中實作全新的控制器。
CAF 新增 GCKUIMediaController
,您可以用來輕鬆實作展開的控制器。
CAF 新增預先建立的展開控制器小工具 GCKUIExpandedMediaControlsViewController
,您可以直接新增到應用程式。您不再需要使用 GCKUIMediaController
實作自訂的展開控制器。
偵錯記錄
v2 中的 GCKLogger
和 GCKLoggerDelegate
類別會轉移至 CAF,並經過一些變更和強化。
GCKLoggerDelegate
-[logFromFunction:message:]
方法已淘汰,請改用 -[logMessage:fromFunction:]
。
現在可以建構適當的 GCKLoggerFilter
執行個體並設定 GCKLogger
單例模式的 -[filter]
屬性來指派架構記錄訊息。