El siguiente procedimiento te permite convertir tu app emisora de iOS de Cast v2 al remitente de CAF, que se basa en el singleton GCKCastContext.
Introducción
- El remitente de CAF se sigue distribuyendo en el sitio web para desarrolladores de Google Cast y en CocoaPods, como v2.
- Se agregaron clases nuevas que asumen la responsabilidad de cumplir con la lista de tareas de diseño de Google Cast.
- El emisor de CAF proporciona widgets que satisfacen los requisitos de UX de Cast. La v2 no proporciona ningún componente de IU y requiere que los implementes.
- El diseño del remitente de CAF es coherente con el diseño del SDK de Cast para Android.
- El emisor de CAF es compatible con Bitcode, como la v2.
- Los subtítulos opcionales en CAF son similares a la v2.
Dependencias
El emisor de CAF es compatible con iOS 8 y versiones posteriores.
Inicialización
En CAF, se requiere un paso de inicialización explícito para el framework de Cast. Esto implica inicializar el singleton de GCKCastContext
, usar un GCKCastOptions
adecuado para especificar el ID de aplicación del receptor web y cualquier otra opción global. Por lo general, esto se hace en el método -[application:didFinishLaunchingWithOptions:]
de AppDelegate
:
GCKCastOptions *options = [[GCKCastOptions alloc]
initWithReceiverApplicationID:applicationID];
[GCKCastContext setSharedInstanceWithOptions:options];
Este paso no fue necesario en la v2.
Detección de dispositivos
En CAF, el framework inicia y detiene automáticamente el proceso de descubrimiento cuando la app pasa a primer plano y pasa a segundo plano, respectivamente. Las clases GCKDeviceScanner
y GCKFilterCriteria
de la versión 2 dejaron de estar disponibles y no se deben usar.
Botón para transmitir y diálogo de transmisión
En CAF, el framework proporciona el botón para transmitir y el diálogo. Se puede crear una instancia del botón para transmitir y agregarlo a la barra de navegación de la siguiente manera:
GCKUICastButton *castButton =
[[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor whiteColor];
self.navigationItem.rightBarButtonItem =
[[UIBarButtonItem alloc] initWithCustomView:castButton];
El botón para transmitir también se puede agregar al guión gráfico.
Cuando alguien presiona el botón, se muestra automáticamente el diálogo para transmitir.
Control de dispositivos
En CAF, el framework controla en gran medida el control del dispositivo. La aplicación emisora no necesita controlar la conexión al dispositivo y el inicio de la aplicación receptora web. La clase GCKDeviceManager
de la v2 está obsoleta y no se debe usar. La interacción entre el remitente y el receptor web se representa como una "sesión". La clase GCKSessionManager
de CAF controla el ciclo de vida de la sesión y, luego, inicia y detiene automáticamente las sesiones en respuesta a los gestos del usuario: una sesión se inicia cuando el usuario selecciona un dispositivo de transmisión en el diálogo de Cast y finaliza cuando el usuario presiona el botón "Detener transmisión" en el diálogo de Cast o cuando finaliza la app del remitente. La aplicación emisora puede recibir notificaciones sobre eventos del ciclo de vida de la sesión si registras un GCKSessionManagerListener
con GCKSessionManager
.
El protocolo GCKSessionManagerListener
define los métodos de devolución de llamada para todos los eventos del ciclo de vida de la sesión.
La clase GCKCastSession
representa una sesión con un dispositivo de transmisión. La clase tiene métodos para controlar el volumen del dispositivo y los estados de silencio, lo que antes se hacía en la versión 2 mediante los métodos en GCKDeviceManager
.
En la versión 2, el protocolo GCKDeviceManagerDelegate
proporcionaba notificaciones sobre los cambios en el estado del dispositivo, incluidos el volumen, el estado de silencio, el estado en espera, etcétera.
En CAF, las notificaciones de cambio de estado o silencio o volumen se envían a través de los métodos de devolución de llamada en el protocolo GCKSessionManagerListener
. Estos objetos de escucha se registran con GCKSessionManager
.
Todas las notificaciones de estado restantes del dispositivo se entregan a través de un protocolo GCKCastDeviceStatusListener
; estos objetos de escucha se registran con GCKCastSession
.
Lógica de reconexión
Al igual que con la v2, el CAF intenta restablecer las conexiones de red que se pierden debido a una pérdida temporal de la señal Wi-Fi o a otros errores de red. Ahora, esto se hace a nivel de sesión; una sesión puede entrar en un estado “suspendido” cuando se pierde la conexión y volverá al estado “conectada” cuando se restablezca la conectividad. El framework se encarga de volver a conectarse a la aplicación del receptor web y a volver a conectar los canales de transmisión como parte de este proceso.
Además, CAF también agrega la reanudación automática de sesiones. Si la aplicación emisora se envía a segundo plano o se finaliza (mediante un deslizamiento o una falla) mientras una sesión de Cast está en curso, el framework intentará reanudarla cuando la aplicación emisora regrese a primer plano o se reinicie. Esto se controla automáticamente mediante GCKSessionManager
, que emitirá las devoluciones de llamada apropiadas en cualquier instancia registrada de GCKSessionManagerListener
.
Registro de canales personalizados
En la v2, los canales personalizados (implementados mediante una subclase GCKCastChannel
o un GCKGenericChannel
y un delegado) se registraban con el GCKDeviceManager
.
En CAF, los canales personalizados se registran con la instancia GCKCastSession
. El registro se puede realizar en el método de devolución de llamada GCKSessionManagerListener
de -[sessionManager:didStartCastSession:]
. En el caso de las aplicaciones multimedia, ya no es necesario registrar de manera explícita GCKMediaControlChannel
. Consulta la siguiente sección para obtener más detalles.
Control multimedia
La clase GCKMediaControlChannel
de la v2 está obsoleta y no se debe usar. En CAF, se reemplazó por la nueva clase GCKRemoteMediaClient
, que proporciona una funcionalidad equivalente en una API más conveniente.
No es necesario inicializar ni registrar este objeto de forma explícita. El framework creará una instancia del objeto de forma automática y registrará el canal multimedia subyacente en el momento de inicio de la sesión si la aplicación del receptor web se conecta para admitir el espacio de nombres de medios.
Se puede acceder a GCKRemoteMediaClient
con la propiedad -[remoteMediaClient]
del objeto GCKCastSession
.
En la versión 2, todas las solicitudes de contenido multimedia emitidas en GCKMediaControlChannel
mostrarían un ID de solicitud numérico, y los métodos en GCKMediaControlChannelDelegate
proporcionarían este ID cuando se envíen notificaciones sobre la finalización de la solicitud o el error.
En CAF, todas las solicitudes de contenido multimedia emitidas en GCKRemoteMediaClient
mostrarán un objeto GCKRequest
. Este objeto tiene un protocolo GCKRequestDelegate
asociado que se puede usar para realizar un seguimiento del progreso y el resultado final de la solicitud.
La GCKMediaControlChannel
v2 enviará notificaciones sobre los cambios en el estado del reproductor multimedia en el receptor web mediante GCKMediaControlChannelDelegate
.
En CAF, el GCKRemoteMediaClient
proporciona devoluciones de llamada equivalentes a través del protocolo GCKRemoteMediaClientListener
. Se puede registrar cualquier cantidad de objetos de escucha con el GCKRemoteMediaClient
, lo que permite que varios componentes del remitente compartan la única instancia de GCKRemoteMediaClient
asociada con la sesión.
En la v2, la aplicación emisora tenía que hacerse cargo de mantener la interfaz de usuario sincronizada con el estado del reproductor multimedia en el receptor web. En CAF, la clase GCKUIMediaController
asume la mayor parte de esta responsabilidad. Consulta la documentación del instructivo del codelab para ver ejemplos sobre cómo usar este componente.
Superposición introductoria
V2 no proporciona una IU de superposición de introducción.
El CAF agrega la clase GCKCastContext
con un método -[presentCastInstructionsViewControllerOnce]
que una app emisora puede usar para destacar el botón para transmitir cuando se muestra por primera vez a los usuarios.
Minicontrolador
En la versión 2, debes implementar un minicontrolador desde cero en la app de remitente.
En CAF, el framework proporciona una barra de control, GCKUIMiniMediaControlsViewController
, que puedes agregar a las escenas en las que deseas mostrar los controles persistentes. Hay dos formas de agregar el minicontrolador a una app emisora:
Permite que el framework de Cast administre el diseño del minicontrolador. Para ello, une tu controlador de vista existente con
GCKUICastContainerViewController
y agrega unGCKUIMiniMediaControlsViewController
en la parte inferior de su vista.Agrega el minicontrolador directamente al controlador de vista existente. Para ello, usa
-[createMiniMediaControlsViewController]
a fin de crear una instanciaGCKUIMiniMediaControlsViewController
y, luego, agrégala al controlador de vista de contenedor como subvista.
Control expandido
En la versión 2, debes implementar un controlador expandido desde cero en la app emisora.
CAF agrega GCKUIMediaController
, que puedes usar para implementar un controlador expandido con mayor facilidad.
CAF agrega un widget de controlador expandido compilado previamente GCKUIExpandedMediaControlsViewController
que puedes agregar a tu app. Ya no necesitas implementar un control expandido personalizado usando GCKUIMediaController
.
Registro de depuración
Las clases GCKLogger
y GCKLoggerDelegate
de la v2 se transfieren a CAF, con algunos cambios y mejoras.
El método GCKLoggerDelegate
-[logFromFunction:message:]
dejó de estar disponible y se reemplazó por -[logMessage:fromFunction:]
.
Los mensajes de registro del framework ahora se pueden filtrar mediante la construcción de una instancia de GCKLoggerFilter
adecuada y su asignación mediante la configuración de la propiedad -[filter]
del singleton GCKLogger
.
Apps de ejemplo
Recomendamos observar los codelabs y las apps de muestra escritas para CAF.