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:
Deixe que o framework do Google Cast gerencie o layout do minicontrole encapsulando seu controlador de visualização com o
GCKUICastContainerViewController
e adicionando umGCKUIMiniMediaControlsViewController
na parte de baixo da visualização.Adicione o minicontrolador diretamente ao controlador de visualização usando
-[createMiniMediaControlsViewController]
para criar uma instância deGCKUIMiniMediaControlsViewController
e, em seguida, adicioná-la ao controlador de visualização de contêiner como uma subvisualização.
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.