Migra la app emisora de iOS de la versión 2 del SDK de Cast al framework de aplicaciones de Cast (CAF)

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:

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.