Você provavelmente já sabe
que o Firebase Cloud Messaging não apenas envia mensagens
para dispositivos Android, mas também pode rotear notificações
usando APNS, o Serviço de Notificações Push da Apple
para se comunicar com dispositivos iOS.
Vale a pena explicar como isso é feito.
Em parte, porque é interessante, mas mais importante
porque mostra o que procurar se algo der errado.
Vamos nos aprofundar nisso neste episódio de Firecasts.
Firecasts Para Desenvolvedores Firebase
Para um serviço se comunicar pelo APNS, é necessário duas coisas.
Primeiro, precisamos de um certificado
que basicamente permite a comunicação com os servidores APNS.
Hoje em dia também podemos usar uma chave de autenticação APNS
que é um pouco mais conveniente
se fizer seu próprio código de comunicação.
Mas agora vou focar no certificado
porque é o que o Firebase Cloud Messaging usa atualmente.
Em segundo lugar, você precisa dizer ao APNS
para qual dispositivo enviar a notificação.
Para isso, precisamos de um token do dispositivo
que é um modo de identificar o dispositivo de um usuário com um token identificador
que funciona apenas com o seu app.
Esse token é solicitado ao APNS pelo dispositivo
e então enviado até o seu servidor.
Já que o Firebase Cloud Messaging está fazendo o papel do servidor
precisa destas duas coisas: o certificado e o token do dispositivo.
Uma das primeiras coisas a serem feitas na configuração
do Firebase Cloud Messaging é carregar o seu certificado APNS
na forma de um arquivo p12 para o console Firebase.
E isso permite que o servidor FCM se comunique com o APNS.
Na inicialização do app, o dispositivo do usuário
enviará uma solicitação do token do dispositivo para o APNS
que enviará o token para o Firebase Cloud Messaging.
E o Firebase Cloud Messaging
criará e enviará de volta uma cópia de seu próprio token de dispositivo.
Até aqui, o FCM possui o necessário
para se comunicar com o seu dispositivo usando o APNS.
E agora podemos enviar sua solicitação através do Firebase Cloud Messaging.
Assim como no APNS, precisamos de duas coisas
para enviar uma solicitação de notificação através do FCM:
uma forma de comunicação com o serviço
e uma forma de identificar o dispositivo alvo.
Em vez de um certificado
você vai usar uma chave API, que podemos imaginar como a senha secreta
que precisa para se comunicar com o servidor FCM pelo seu app.
E você consegue isso no console Firebase.
Supondo que quer se comunicar com dispositivos individuais
também vai precisar do token FCM que consegue com o seu cliente.
Essas duas informações são então armazenadas
em uma notificação que é enviada ao Firebase Cloud Messaging.
Agora o Firebase vai procurar registros
para o dispositivo com o respectivo token FCM
e vai notar que está associado a um token APNS.
Então diz, "Provavelmente preciso rotear esta mensagem usando APNS
para me comunicar com o dispositivo".
O Firebase irá então criar uma nova versão APNS desta notificação
usando o certificado e o token que tem armazenado.
Essa nova notificação é enviada ao APNS
que irá notificar o dispositivo iOS
e a sua notificação finalmente vai aparecer. Eba!
Sei que é muita coisa para lembrar.
Mas quero que entenda duas informações desta apresentação:
primeiro, a maior parte do trabalho está acontecendo nos bastidores.
Na maior parte do tempo, não precisa saber ou se importar com nada disso.
Em segundo lugar, até chegarmos aqui
isso é apenas uma notificação APNS normal.
Para o seu aplicativo, esta notificação é como todas as outras
que possa ter recebido da Apple.
Vamos pensar no trabalho que nosso dispositivo fez durante esse processo.
Teve que, primeiro, solicitar um token do dispositivo ao APNS
segundo, enviar o token APNS para o FCM
e então receber de volta o token do dispositivo FCM.
Para obter um token APNS do dispositivo
temos que chamar registerForRemoteNotifications
da mesma forma de sempre.
E para todos os outros passos
não precisa fazer nada para que funcionem.
Contanto que seu app tenha o Firebase habilitado
fazemos a maior parte do trabalho por você, graças ao swizzling de métodos.
Se nunca ouviu falar sobre swizzling de métodos
é uma forma para desenvolvedores adicionarem funcionalidades
a métodos preexistentes no iOS chamando uma versão customizada do método
que então chama pelo método original quando está pronto.
Isso é frequentemente usado para customizar métodos
que fazem parte da biblioteca iOS básica.
Mas aqui, estamos usando acima de qualquer método delegate.
Então em nossa chamada swizzle didRegisterForRemoteNotifications
recebemos o token APNS
e o enviamos para o Firebase Cloud Messaging
em troca de um token FCM do dispositivo.
Aliás, na verdade estou mentindo um pouco.
Este token é realmente conhecido como token InstanceID
que em teoria pode ser usado para identificar
o seu dispositivo para outros serviços, além do FCM.
E é por isso que será criado pela biblioteca InstanceID
em nosso código e porque é chamado de token de registro na documentação.
Mas para entender o FCM
acho que ficamos melhor chamando-o de token do dispositivo FCM
porque é basicamente isso.
Também devo dizer que aplicamos o swizzle
em alguns dos métodos para receberem notificações.
E estamos nos certificando de que registramos
as informações sobre o Analytics destas notificações.
É assim fornecemos informações como:
"30% destas notificações foram relatórios abertos"
que pode ver no painel de notificações.
E se não gostar da ideia de outra pessoa usar swizzle
em seus métodos, é fácil desativar o recurso.
Precisa apenas adicionar ao código o necessário para fazer este trabalho.
E temos documentação para isso.
Outra coisa sobre os métodos com o swizzle
é que não chamamos automaticamente nada que possa trazer
a caixa padrão de diálogo iOS
perguntando se pode mostrar qualquer notificação visível ao usuário.
Sabemos que isso é algo que não quer chamar
até ter certeza de que os usuários dirão sim.
Então essa parte do código vai depender de você
para fazer a chamada no melhor momento para seu app.
Claro que agora que eu mostrei
que isso não passa de uma notificação APNS
e que não precisa fazer nada de especial para usar o FCM
você pode notar a seção em nossa documentação
onde pedimos para você se conectar ao Firebase Cloud Messaging.
Para que isso?
Veja bem, além de ser capaz de se comunicar
com o seu dispositivo através do APNS
você também consegue se conectar através do FCM
para receber notificações diretamente através deste serviço.
Mas temos algumas restrições aqui.
Em primeiro lugar, isso só funciona se o seu app
estiver em primeiro plano.
Em segundo, isso funciona apenas para mensagens de dados
nada de mensagens de alerta, badges, sons, nada disso.
Também não funciona com mensagens de conteúdo disponível.
Estas vão sempre ser enviadas através do APNS.
Na verdade, em APNS, não é possível enviar uma notificação silenciosa
que não inclua conteúdo disponível.
Então esse tipo de mensagem é válida somente através do FCM
pelo o que eu sei.
Se enviar esse tipo de notificação e o seu app não estiver em primeiro plano
e não estiver explicitamente conectado ao FCM
não vai receber a mensagem até que se reconecte.
Então claro que a dúvida que pode ter é, por que alguém iria querer isso?
A comunicação direta através do FCM tem algumas vantagens.
Um exemplo, o FCM tende a ser mais agressivo
no envio das mensagens de dados ao seu dispositivo alvo.
Outro, sua mensagem passa por uma etapa a menos
o que é sempre bom.
E também, o seu dispositivo
pode mandar mensagens de volta através do FCM
para lhe informar que, por exemplo, que a mensagem foi recebida.
Mas como só trabalham em primeiro plano, seu uso é meio limitado a apps
que não se importam em receber essas notificações em segundo plano.
Um bom exemplo: YouTube.
O seu aplicativo iOS usa conexão FCM para entregar as mensagens de chat
em seus eventos YouTube Live.
Já que o app só entrega essa avalanche de mensagens em primeiro plano
é um ótimo caso de uso do Firebase Cloud Messaging.
Mas se não acha que seu app vai precisar desse tipo de mensagem
eu recomendaria não conectar diretamente com o serviço FCM
pelo menos não até ter o resto do FCM funcionando.
Seria apenas um fator a mais para resolver
quando rastrear problemas na implementação APNS.
Pronto, é assim que o FCM funciona em dispositivos iOS
explicado de forma super simples.
Espero que isso tenha esclarecido um pouco mais
sobre o que acontece em segundo plano.
E se achou este vídeo útil, inscreva-se no canal.
Nos vemos em breve em outro episódio de Firecasts.
Muito obrigado por assistir.
Quer saber mais sobre o Firebase?
Dê uma olhada nesses vídeos.