Visão geral de APNs
O serviço Apple Push Notification (APNs) é a peça central do recurso de notificações remotas. É um serviço robusto, seguro e altamente eficiente para desenvolvedores de aplicativos propagarem informações para dispositivos iOS (e, indiretamente, watchOS), tvOS e macOS.
Na inicialização inicial de seu aplicativo no dispositivo de um usuário, o sistema estabelece automaticamente uma conexão IP credenciada, criptografada e persistente entre seu aplicativo e APNs. Esta conexão permite que seu aplicativo execute a configuração para habilitá-lo a receber notificações, conforme explicado em Configurando o Suporte de Notificação Remota.
A outra metade da conexão para enviar notificações - o canal persistente e seguro entre um servidor provedor e APNs - requer configuração em sua conta de desenvolvedor online e o uso de certificados criptográficos fornecidos pela Apple. Um provedor é um servidor que você implanta e gerencia, que você configura para trabalhar com APNs. A Figura 1-1 mostra o caminho de entrega de uma notificação remota.
Figura 1-1 Entrega de notificação remota de um provedor para um aplicativo
Com a configuração de notificação push concluída em seus provedores e em seu aplicativo, seus provedores podem enviar solicitações de notificação para APNs. APNs transporta cargas úteis de notificação correspondentes para cada dispositivo de destino. Ao receber uma notificação, o sistema entrega a carga útil ao aplicativo apropriado no dispositivo e gerencia as interações com o usuário.
Se uma notificação para seu aplicativo chegar com o dispositivo ligado, mas com o aplicativo não em execução, o sistema ainda pode exibir a notificação. Se o dispositivo estiver desligado quando o APNs enviar uma notificação, o APNs manterá a notificação e tentará novamente mais tarde (para obter detalhes, consulte Qualidade de serviço, Armazenamento e encaminhamento e Notificações combinadas).
Responsabilidades do Provedor
Os servidores de seu provedor têm as seguintes responsabilidades de participação com APNs:
- Receber, por meio de APNs, tokens de dispositivo globalmente exclusivos e específicos do aplicativo e outros dados relevantes de instâncias do seu aplicativo nos dispositivos do usuário. Isso permite que um provedor saiba sobre cada instância em execução do seu aplicativo.
- Determinar, de acordo com o design do seu sistema de notificação, quando notificações remotas precisam ser enviadas para cada dispositivo.
- Criação e envio de solicitações de notificação para APNs, cada solicitação contendo uma carga útil de notificação e informações de entrega; APNs então entrega notificações correspondentes aos dispositivos pretendidos em seu nome.
Para cada solicitação de notificação remota enviada por um provedor, ele deve:
- Construa um dicionário JSON contendo a carga útil da notificação, conforme descrito em Criando a carga útil da notificação remota.
- Adicione a carga útil, um token de dispositivo globalmente exclusivo e outras informações de entrega a uma solicitação HTTP / 2. Para obter informações sobre tokens de dispositivo, consulte Confiança de conexão de APNs para dispositivo e Tokens de dispositivo. Para obter informações sobre o formato de solicitação HTTP / 2 e as possíveis respostas e erros de APNs, consulte Comunicação com APNs.
- Envie a solicitação HTTP / 2 para APNs, incluindo credenciais criptográficas na forma de um token ou certificado, por meio de um canal seguro e persistente.
- O estabelecimento desse canal seguro é descrito em Arquitetura de segurança.
Usando vários provedores
A Figura 1-2 descreve o tipo de rede virtual que o APNs habilita para os dispositivos que executam seus aplicativos. Para lidar com a carga de notificação, você normalmente implantaria vários provedores, cada um com sua própria conexão persistente e segura para APNs. Cada provedor pode enviar solicitações de notificação visando qualquer dispositivo para o qual o provedor tenha um token de dispositivo válido.
Figura 1-2 Empurrando notificações remotas de vários provedores para vários dispositivos
Qualidade de serviço, armazenamento e envio e notificações combinadas
O serviço Apple Push Notification inclui um componente Quality of Service (QoS) que executa uma função de armazenamento e encaminhamento. Se o APNs tentar entregar uma notificação e o dispositivo de destino estiver offline, o APNs armazenará a notificação por um período limitado de tempo e a entregará quando o dispositivo ficar disponível novamente. Este componente armazena apenas a notificação mais recente por dispositivo e por aplicativo. Se um dispositivo estiver offline, o envio de uma solicitação de notificação direcionada a esse dispositivo faz com que a solicitação anterior seja descartada. Se um dispositivo permanecer offline por um longo tempo, todas as notificações armazenadas em APNs serão descartadas.
Para permitir a união de notificações semelhantes, você pode incluir um identificador de recolhimento em uma solicitação de notificação. Normalmente, quando um dispositivo está online, cada solicitação de notificação que você envia aos APNs resulta em uma notificação entregue ao dispositivo. No entanto, quando a chave apns-collapse-id está presente em seu cabeçalho de solicitação HTTP / 2, os APNs unem solicitações cujo valor para essa chave é o mesmo. Por exemplo, um serviço de notícias que envia o mesmo título duas vezes pode usar o mesmo valor de identificador de colapso para ambas as solicitações. APNs então uniriam as duas solicitações em uma única notificação para entrega ao dispositivo. Para obter detalhes sobre a chave apns-collapse-id.
Arquitetura de Segurança
APNs impõe validação e autenticação criptográfica de ponta a ponta usando dois níveis de confiança: confiança de conexão e confiança de token de dispositivo.
A confiança de conexão funciona entre provedores e APNs e entre APNs e dispositivos.
A confiança do token do dispositivo funciona de ponta a ponta para cada notificação remota. Ele garante que as notificações sejam encaminhadas apenas entre os pontos de início (provedor) e de término (dispositivo) corretos.
Um token de dispositivo é uma instância NSData opaca que contém um identificador exclusivo atribuído pela Apple a um aplicativo específico em um dispositivo específico. Apenas APNs podem decodificar e ler o conteúdo de um token de dispositivo. Cada instância do aplicativo recebe seu token de dispositivo exclusivo quando se registra com APNs e deve então encaminhar o token para seu provedor, conforme descrito em Configurando o Suporte de Notificação Remota. O provedor deve incluir o token do dispositivo em cada solicitação de notificação push que visa o dispositivo associado; O APNs usa o token do dispositivo para garantir que a notificação seja entregue apenas à combinação exclusiva de aplicativo-dispositivo para a qual se destina.
APNs podem emitir um novo token de dispositivo por vários motivos:
- O usuário instala seu aplicativo em um novo dispositivo
- O usuário restaura o dispositivo de um backup
- O usuário reinstala o sistema operacional
- Outros eventos definidos pelo sistema
Como resultado, os aplicativos devem solicitar o token do dispositivo no momento da inicialização, conforme descrito em APNs-to-Device Connection Trust e Device Tokens. Para obter exemplos de código, consulte Registrando-se para receber notificações remotas.
Para estabelecer sessões TLS baseadas em HTTP / 2 com APNs, você deve garantir que um certificado raiz GeoTrust Global CA esteja instalado em cada um de seus provedores. Se um provedor estiver executando o macOS, esse certificado raiz estará no keychain por padrão. Em outros sistemas, este certificado pode exigir instalação explícita. Você pode baixar este certificado no site de certificados raiz da GeoTrust. Aqui está um link direto para o certificado.
A Figura 1-3 ilustra o uso da API do provedor de APNs com base em HTTP / 2 para estabelecer confiança e o uso de tokens de autenticação do provedor JWT para enviar notificações.
Figura 1-3 Estabelecendo e usando confiança de conexão de provedor baseada em token
Conforme mostrado na Figura 1-3, a confiança do provedor baseado em token funciona da seguinte maneira:
Seu provedor solicita uma conexão segura com APNs usando a segurança da camada de transporte (TLS), representada pela seta com o rótulo “iniciação TLS” na figura.
O APNs então fornece ao seu provedor um certificado de APNs, representado pela próxima seta na figura (rotulado como “certificado de APNs”), que seu provedor então valida.
Nesse ponto, a confiança da conexão é estabelecida e o servidor do seu provedor está habilitado para enviar solicitações de notificação push remota baseada em token para APNs. Cada solicitação de notificação que seu provedor envia deve ser acompanhada por um token de autenticação JWT, representado na figura como a seta chamada "Push de notificação".
Respostas de APNs a cada push, representado na figura como a seta chamada “Resposta HTTP / 2”.
Para obter detalhes sobre as respostas que seu provedor pode receber para esta etapa, consulte Resposta HTTP / 2 de APNs.
A Figura 1-4 ilustra o uso de um certificado SSL emitido pela Apple para estabelecer confiança entre um provedor e APNs. Ao contrário da Figura 1-3, esta figura não mostra um push de notificação em si, mas para no estabelecimento de uma conexão Transport Layer Security (TLS). No esquema de confiança baseado em certificado, as solicitações de notificação por push não são autenticadas, mas são validadas usando o token de dispositivo que o acompanha.
Figura 1-4 Estabelecendo confiança de conexão de provedor com base em certificado
Conforme mostrado na Figura 1-4, a confiança de provedor para APNs baseada em certificado funciona da seguinte maneira:
Seu provedor solicita uma conexão segura com APNs usando a segurança da camada de transporte (TLS), representada pela seta com o rótulo “iniciação TLS” na figura.
O APNs então fornece ao seu provedor um certificado de APNs, representado pela próxima seta na figura (rotulado como “certificado de APNs”), que seu provedor então valida.
Seu provedor deve então enviar seu certificado de provedor provisionado pela Apple (que você obteve anteriormente de sua conta de desenvolvedor online, conforme explicado em “Gerar um certificado SSL de cliente APNs universal” na Ajuda do Xcode) de volta para APNs, representado pela seta rotulada “Provedor certificado."
O APNs então valida seu certificado de provedor, confirmando assim que a solicitação de conexão foi originada de um provedor legítimo e estabelece sua conexão TLS.
Nesse ponto, a confiança da conexão é estabelecida e o servidor do seu provedor está habilitado para enviar solicitações de notificação por push remota com base em certificado para APNs.
Confiança de conexão de APNs para dispositivo e tokens de dispositivo
A confiança entre APNs e cada dispositivo é estabelecida automaticamente, sem a participação de seu aplicativo, conforme descrito nesta seção.
Cada dispositivo possui um certificado criptográfico e uma chave criptográfica privada, fornecida pelo sistema operacional na ativação inicial do dispositivo e armazenada nas chaves do dispositivo. Durante a ativação, o APNs autentica e valida a conexão com o dispositivo, com base no certificado e na chave, conforme mostrado na Figura 6-5.
Figura 1-5 Estabelecendo conexão confiável entre um dispositivo e APNs
Conforme mostrado na Figura 1-5, a confiança de APNs para dispositivo funciona da seguinte maneira:
- A negociação de confiança começa quando o dispositivo inicia uma conexão TLS com APNs, conforme mostrado na seta superior na figura.
- APNs retorna um certificado de APNs para o dispositivo.
- O sistema operacional valida este certificado e, em seguida, conforme mostrado na seta “Certificado do dispositivo”, envia o certificado do dispositivo para APNs.
- Finalmente, conforme indicado pela seta inferior na figura, o APNs valida o certificado do dispositivo, estabelecendo confiança.
- Com uma conexão TLS estabelecida entre APNs e o dispositivo, os aplicativos no dispositivo podem se registrar com APNs para receber seus tokens de dispositivo específicos do aplicativo para notificações remotas. Para obter detalhes e exemplos de código, consulte Registrando-se para receber notificações remotas em Configurando o suporte de notificação remota.
Depois de receber o token do dispositivo, um aplicativo deve se conectar ao provedor associado do aplicativo e encaminhar o token para ele. Esta etapa é necessária porque um provedor deve incluir o token do dispositivo posteriormente, quando enviar uma solicitação de notificação, para APNs, visando o dispositivo. O código que você escreve para encaminhar o token também é mostrado em Registrando-se para receber notificações remotas.
Esteja um usuário ativando um dispositivo pela primeira vez ou se os APNs emitiram um novo token de dispositivo, o processo é semelhante e é mostrado na Figura 6-6.
Figura 1-6 Gerenciando o token do dispositivo
A obtenção e manipulação de um token de dispositivo específico do aplicativo funciona da seguinte maneira:
Seu aplicativo se registra com APNs para notificações remotas, conforme mostrado na seta superior. Se o aplicativo já estiver registrado e o token de dispositivo específico do aplicativo não tiver mudado, o sistema retorna rapidamente o token existente para o aplicativo e este processo pula para a etapa 4.
Quando um novo token de dispositivo é necessário, os APNs geram um usando as informações contidas no certificado do dispositivo. Ele criptografa o token usando uma chave de token e o retorna ao dispositivo, conforme mostrado na seta central apontando para a direita.
O sistema entrega o token do dispositivo de volta ao seu aplicativo chamando seu aplicativo: didRegisterForRemoteNotificationsWithDeviceToken: método delegate.
Ao receber o token, seu aplicativo (dentro do método delegado) deve encaminhá-lo ao seu provedor em formato binário ou hexadecimal. Seu provedor não pode enviar notificações ao dispositivo sem este token. Para obter detalhes, consulte Registrando-se para receber notificações remotas em Configurando o suporte a notificações remotas.
IMPORTANTE
Os tokens de dispositivo APNs são de comprimento variável. Não codifique seu tamanho.
Quando seu provedor envia uma solicitação de notificação push para APNs, ele inclui um token de dispositivo que identifica uma combinação única de aplicativo-dispositivo. Esta etapa é mostrada na seta “Token, Payload” entre o provedor e os APNs na Figura 6-7. APNs descriptografa o token para garantir a validade da solicitação e determinar o dispositivo de destino. Se o APNs determinar que o remetente e o destinatário são legítimos, ele enviará a notificação ao dispositivo identificado.
Figura 1-7 Caminho de notificação remota do provedor para o dispositivo
Depois que o dispositivo recebe a notificação (e após a etapa final mostrada na Figura 1-7), o sistema encaminha a notificação remota para seu aplicativo.
Ref: Apple Push Notification Service
Agora, olhe aqui para entender o fluxo técnico: Como implementar o Apple Push Notification Service no aplicativo iOS?