通过以下步骤,您可以将 iOS 发送者应用从 Cast SDK v2 转换为 CAF 发送者(基于 GCKCastContext 单例)。
简介
- CAF 发件人仍通过 Google Cast 开发者网站和 CocoaPods 分发,例如 v2。
- 添加了新类,这些类负责遵循 Google Cast 设计核对清单。
- CAF Sender 提供符合 Cast 用户体验要求的 widget;v2 不提供任何界面组件,并且要求您实现这些 widget。
- CAF 发送者设计与 Cast Android SDK 设计一致。
- CAF 发送者支持 Bitcode(如 v2)。
- CAF 中的字幕与 v2 类似。
依赖项
CAF Sender 支持 iOS 8 及更高版本。
初始化
在 CAF 中,投放框架需要明确的初始化步骤。这包括初始化 GCKCastContext
单例,使用适当的 GCKCastOptions
指定 Web 接收器应用 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 接收器应用的过程。v2 类 GCKDeviceManager
已被弃用,不应继续使用。发送者和网络接收器之间的互动现在以“会话”的形式表示。CAF GCKSessionManager
类会处理会话生命周期,并自动启动和停止会话以响应用户手势:用户在 Cast 对话框中选择 Cast 设备时,会话即开始;当用户在 Cast 对话框中点按“Stop Casting”按钮时,或发送者应用本身终止时,会话便会结束。您可以向 GCKSessionManager
注册 GCKSessionManagerListener
,以便让发送者应用接收有关会话生命周期事件的通知。GCKSessionManagerListener
协议为所有会话生命周期事件定义了回调方法。
GCKCastSession
类表示与投放设备的会话。该类具有用于控制设备音量和静音状态的方法,以前在 v2 中通过 GCKDeviceManager
中的方法来完成。
在 v2 中,GCKDeviceManagerDelegate
协议提供了设备状态变化(包括音量、静音状态、待机状态等)的通知。在 CAF 中,音量/静音状态更改通知通过 GCKSessionManagerListener
协议中的回调方法传递;这些监听器通过 GCKSessionManager
注册。所有剩余的设备状态通知均通过 GCKCastDeviceStatusListener
协议传送;这些监听器通过 GCKCastSession
注册。
重新连接逻辑
与 v2 一样,CAF 会尝试重建因暂时 Wi-Fi 信号丢失或其他网络连接错误而丢失的网络连接。此操作现在在会话级别完成;会话可以在连接中断时进入“挂起”状态,并在连接恢复时回到“已连接”状态。在此过程中,框架会负责重新连接到 Web 接收器应用以及重新连接任何投放渠道。
此外,CAF 还会自动恢复会话。如果投放应用正在发送到后台,或者由于投放会话发生滑动(或因崩溃而终止)而终止,则框架会在发送方应用返回前台或重新启动时尝试恢复该会话;该操作将由 GCKSessionManager
自动处理,它会在所有已注册的 GCKSessionManagerListener
实例上发出适当的回调。
自定义频道注册
在 v2 中,自定义渠道(使用 GCKCastChannel
子类或 GCKGenericChannel
和委托实现)是通过 GCKDeviceManager
注册的。在 CAF 中,自定义渠道改为通过 GCKCastSession
实例注册。注册可以在 GCKSessionManagerListener
-[sessionManager:didStartCastSession:]
回调方法中完成。对于媒体应用,不再需要明确注册 GCKMediaControlChannel
;如需了解详情,请参阅下文。
媒体控件
v2 类 GCKMediaControlChannel
已被弃用,不应继续使用。在 CAF 中,它已被新的 GCKRemoteMediaClient
类取代,后者在更方便的 API 中提供等效功能。无需显式初始化或注册此对象;如果连接的 Web 接收器应用支持媒体命名空间,则框架会在会话启动时自动实例化该对象并注册底层媒体通道。
您可以使用 GCKCastSession
对象的 -[remoteMediaClient]
属性访问 GCKRemoteMediaClient
。
在 v2 中,通过 GCKMediaControlChannel
发出的所有媒体请求都会返回一个数字请求 ID,GCKMediaControlChannelDelegate
上的方法会在发送有关请求完成或失败的通知时提供此 ID。
在 CAF 中,对 GCKRemoteMediaClient
发出的所有媒体请求都将返回一个 GCKRequest
对象;此对象具有关联的 GCKRequestDelegate
协议,可用于跟踪请求的进度和最终结果。
v2 GCKMediaControlChannel
;将通过 GCKMediaControlChannelDelegate
发送有关网络接收器上的媒体播放器状态变化的通知。在 CAF 中,GCKRemoteMediaClient
通过其 GCKRemoteMediaClientListener
协议提供等效回调。可以向 GCKRemoteMediaClient
注册任意数量的监听器,这样多个发送者组件就可以共享与会话关联的单个 GCKRemoteMediaClient
实例。
在 v2 中,发送者应用必须负责确保界面与网络接收器上的媒体播放器状态保持同步。在 CAF 中,GCKUIMediaController
类承担了大部分职责;如需了解如何使用该组件,请参阅 Codelab 教程文档。
介绍性叠加层
V2 不提供简介叠加层界面。
CAF 添加了类GCKCastContext
以及一个-[presentCastInstructionsViewControllerOnce]
方法,供发送者应用用来在首次向用户展示“投放”按钮时突出显示。
迷你控制器
在 v2 中,您需要在发送者应用中从头开始实现迷你控制器。
在 CAF 中,框架提供了一个控制栏 GCKUIMiniMediaControlsViewController
,您可以将其添加到要显示持久性控件的场景中。您可以通过以下两种方式将迷你控制器添加到发送者应用中:
让 Cast 框架管理迷你控制器的布局,方法是用
GCKUICastContainerViewController
封装现有视图控制器,并在其视图底部添加GCKUIMiniMediaControlsViewController
。使用
-[createMiniMediaControlsViewController]
直接将小型控制器添加到现有视图控制器,以创建GCKUIMiniMediaControlsViewController
实例,然后将其作为子视图添加到容器视图控制器中。
展开的控制器
在 v2 中,您需要在发送者应用中从头开始实现扩展的控制器。
CAF 添加了 GCKUIMediaController
,您可以使用它更轻松地实现扩展控制器。
CAF 添加了一个预构建的扩展控制器 widget GCKUIExpandedMediaControlsViewController
,您可以直接将其添加到应用中。您不再需要使用 GCKUIMediaController
实现自定义的展开控制器。
调试日志记录
v2 中的 GCKLogger
和 GCKLoggerDelegate
类已转至 CAF,并做出了一些更改和增强功能。
GCKLoggerDelegate
-[logFromFunction:message:]
方法已被弃用,取而代之的是 -[logMessage:fromFunction:]
。
框架日志消息现在可以通过以下方式进行过滤:构造相应的 GCKLoggerFilter
实例,然后通过设置 GCKLogger
单例的 -[filter]
属性进行分配。