Migrar o app remetente do iOS do SDK do Cast v2 para o framework do aplicativo de transmissão (CAF)

O procedimento a seguir permite converter o app remetente do iOS do SDK do Cast v2 para o remetente do CAF, que é baseado no singleton GCKCastContext.

Introdução

  • O remetente do CAF ainda é distribuído no site para desenvolvedores do Google Cast e no CocoaPods, como v2.
  • Novas classes foram adicionadas para assumir a responsabilidade de obedecer à lista de verificação de design do Google Cast.
  • O remetente do CAF fornece widgets que obedecem aos requisitos de UX do Cast. A v2 não fornece componentes de IU e exigia a implementação desses widgets.
  • O design do remetente do CAF é consistente com o design do SDK do Cast para Android.
  • O remetente do CAF é compatível com o Bitcode, como a v2.
  • As legendas no CAF são semelhantes à v2.

Dependências

O Remetente de CAF é compatível com o iOS 8 e versões mais recentes.

Inicialização

No CAF, é necessária uma etapa de inicialização explícita para o framework do Google Cast. Isso envolve a inicialização do singleton GCKCastContext usando um GCKCastOptions apropriado para especificar o ID do aplicativo receptor da Web e outras opções globais. Isso normalmente é feito no método AppDelegate -[application:didFinishLaunchingWithOptions:]:

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

Esta etapa não era necessária na v2.

Descoberta de dispositivos

No CAF, o processo de descoberta é iniciado e interrompido automaticamente pelo framework quando o app entra em primeiro plano e vai para o segundo plano, respectivamente. As classes GCKDeviceScanner e GCKFilterCriteria da v2 foram descontinuadas e não podem ser usadas.

Botão e caixa de diálogo de transmissão

No CAF, o botão e a caixa de diálogo do Google Cast são fornecidos pelo framework. O botão "Transmitir" pode ser instanciado e adicionado à barra de navegação da seguinte maneira:

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

O botão "Transmitir" também pode ser adicionado ao storyboard.

Quando alguém toca no botão, a caixa de diálogo "Transmitir" é apresentada automaticamente.

Controle do dispositivo

No CAF, o controle do dispositivo é amplamente tratado pelo framework. O aplicativo de remetente não precisa processar a conexão com o dispositivo e iniciar o aplicativo de receptor da Web. A classe v2 GCKDeviceManager foi descontinuada e não pode ser usada. A interação entre o remetente e o receptor da Web agora é representada como uma "sessão". A classe GCKSessionManager do CAF processa o ciclo de vida da sessão e inicia e interrompe automaticamente as sessões em resposta a gestos do usuário. Uma sessão é iniciada quando o usuário seleciona um dispositivo de transmissão na caixa de diálogo para transmissão e termina quando o usuário toca no botão "Parar transmissão" na caixa de diálogo ou quando o próprio app do remetente é encerrado. O aplicativo remetente pode ser notificado sobre eventos de ciclo de vida da sessão registrando um GCKSessionManagerListener com o GCKSessionManager. O protocolo GCKSessionManagerListener define métodos de callback para todos os eventos do ciclo de vida da sessão.

A classe GCKCastSession representa uma sessão com um dispositivo de transmissão. A classe tem métodos para controlar o volume do dispositivo e os estados de silenciamento, o que era anteriormente feito na v2 usando métodos em GCKDeviceManager.

Na v2, o protocolo GCKDeviceManagerDelegate forneceu notificações de mudanças no estado do dispositivo, incluindo volume, estado mudo, status em espera e assim por diante. No CAF, as notificações de mudança de estado de volume/mute são entregues por métodos de callback no protocolo GCKSessionManagerListener. Esses listeners são registrados com o GCKSessionManager. Todas as outras notificações de estado do dispositivo são enviadas por um protocolo GCKCastDeviceStatusListener. Esses listeners são registrados no GCKCastSession.

Lógica de reconexão

Assim como na v2, o CAF tenta restabelecer as conexões de rede que foram perdidas devido à perda temporária de sinal Wi-Fi ou a outros erros de rede. Isso agora é feito no nível da sessão. Uma sessão pode entrar no estado "suspenso" quando a conexão for perdida e voltar para um estado "conectado" quando a conectividade for restaurada. O framework faz a reconexão ao app Web Receiver e a reconexão de todos os canais de transmissão como parte desse processo.

Além disso, o CAF também adiciona a retomada automática da sessão. Se o aplicativo de remetente for enviado para o segundo plano ou for encerrado (deslizando para fora ou por uma falha) durante uma sessão de transmissão em andamento, o framework tentará retomar essa sessão quando o aplicativo remetente voltar para o primeiro plano ou for reiniciado. Isso é processado automaticamente pelo GCKSessionManager, que emite os callbacks adequados em qualquer instância GCKSessionManagerListener registrada.

Registro de canal personalizado

Na v2, os canais personalizados (implementados usando uma subclasse GCKCastChannel ou uma GCKGenericChannel e delegados) eram registrados com o GCKDeviceManager. No CAF, os canais personalizados são registrados com a instância GCKCastSession. O registro pode ser feito no método de callback GCKSessionManagerListener -[sessionManager:didStartCastSession:]. Para aplicativos de mídia, não é mais necessário registrar explicitamente o GCKMediaControlChannel. Consulte a seção a seguir para saber mais.

Controle de mídia

A classe v2 GCKMediaControlChannel foi descontinuada e não deve ser usada. No CAF, ela foi substituída pela nova classe GCKRemoteMediaClient, que oferece recursos equivalentes em uma API mais conveniente Não é necessário inicializar ou registrar explicitamente esse objeto. O framework vai instanciar automaticamente o objeto e registrar o canal de mídia subjacente no horário de início da sessão se o app Web Receiver estiver conectado ao suporte de namespace de mídia.

O GCKRemoteMediaClient pode ser acessado com a propriedade -[remoteMediaClient] do objeto GCKCastSession.

Na v2, todas as solicitações de mídia emitidas em GCKMediaControlChannel retornavam um ID numérico, e os métodos em GCKMediaControlChannelDelegate fornecevam esse ID ao enviar notificações sobre conclusão ou falha da solicitação.

No CAF, todas as solicitações de mídia emitidas no GCKRemoteMediaClient retornarão um objeto GCKRequest. Esse objeto tem um protocolo GCKRequestDelegate associado que pode ser usado para acompanhar o progresso e o resultado final da solicitação.

A GCKMediaControlChannel da v2 envia notificações sobre mudanças no estado do player de mídia no receptor da Web via GCKMediaControlChannelDelegate. No CAF, o GCKRemoteMediaClient fornece callbacks equivalentes usando o protocolo GCKRemoteMediaClientListener. Qualquer número de listeners pode ser registrado no GCKRemoteMediaClient, o que permite que vários componentes de remetente compartilhem a única instância de GCKRemoteMediaClient associada à sessão.

Na v2, o aplicativo do remetente tinha a obrigação de manter a interface do usuário sincronizada com o estado do player de mídia no Web Receiver. No CAF, a classe GCKUIMediaController assume a maior parte dessa responsabilidade. Consulte a documentação do tutorial do codelab para ver exemplos de como usar esse componente.

Sobreposição introdutória

A V2 não oferece uma IU de sobreposição introdutória.

O CAF adiciona a classe GCKCastContext com um método -[presentCastInstructionsViewControllerOnce] que um app remetente pode usar para destacar o botão Transmitir quando ele for exibido pela primeira vez aos usuários.

Minicontrole

Na v2, você precisa implementar um minicontrolador do zero no app remetente.

No CAF, o framework fornece uma barra de controle, GCKUIMiniMediaControlsViewController, que pode ser adicionada às cenas em que você quer exibir os controles permanentes. Há duas maneiras de adicionar o minicontrole a um app remetente:

Controle expandido

Na v2, você precisa implementar um controlador expandido do zero no app remetente.

O CAF adiciona o GCKUIMediaController, que pode ser usado para implementar um controlador expandido com mais facilidade.

O CAF adiciona um widget de controlador expandido GCKUIExpandedMediaControlsViewController pré-criado que você pode simplesmente adicionar ao seu app. Não é mais necessário implementar um controlador expandido personalizado usando GCKUIMediaController.

Registro de depuração

As classes GCKLogger e GCKLoggerDelegate da v2 são transferidas para o CAF, com algumas mudanças e melhorias.

O uso do método GCKLoggerDelegate -[logFromFunction:message:] foi descontinuado e substituído por -[logMessage:fromFunction:].

As mensagens de registro do framework agora podem ser filtradas construindo uma instância GCKLoggerFilter adequada e atribuindo-a configurando a propriedade -[filter] do Singleton GCKLogger.

Apps de exemplo

Recomendamos que você consulte os codelabs e os apps de exemplo escritos para CAF.