Como funcionam as notificações push do iOS?

98

Como as notificações "push" do iOS são entregues a um determinado dispositivo sem que esse dispositivo precise consultar um servidor?

Por exemplo, digamos que recebi uma nova mensagem no Facebook. O Facebook notifica a Apple que meu dispositivo deve receber uma notificação como tal. Mas como a Apple sabe para qual dispositivo / IP enviar a mensagem?

Andy Hin
fonte
2
@Wain Estou procurando uma explicação detalhada a nível técnico. Esse artigo é de nível extremamente alto. Então meu dispositivo mantém uma conexão aberta com os servidores push da Apple o tempo todo?
Andy Hin
Estou mais familiarizado com o Android push, mas normalmente, quando você instala o aplicativo, ele registra o dispositivo com um ID exclusivo na Apple. Então, quando o Facebook enviar uma mensagem para a apple, a apple irá encaminhá-la para o ID exclusivo do dispositivo.
Panama Jack
6
@Pjack sim, mas com meu dispositivo mudando constantemente diferentes torres de celular, diferentes redes wi-fi, como a Apple sabe o IP do meu ID exclusivo?
Andy Hin
@whydna Obrigado por fazer esta pergunta. Eu queria entender exatamente a mesma coisa. Acredito que isso responda minha pergunta aqui: stackoverflow.com/questions/18859732/…
MightyMouse
@AndyHin O sistema operacional do dispositivo (iOS) sabe quais servidores APNs são válidos. O dispositivo está se conectando a esses servidores e mantendo uma conexão aberta. Esta conexão provavelmente está associada ao ID do dispositivo e outros metadados (número de telefone). Quando uma mensagem precisa ser "enviada", o APNs encontra a conexão certa e a envia para aquela conexão já aberta. Assim, o APNs não tenta estabelecer uma conexão com um dispositivo, é sempre o dispositivo que abre essa conexão. Uma conexão por dispositivo.
Todd

Respostas:

49

Foi demais para mim fazer um comentário assim.

Da documentação.

O serviço Apple Push Notification (APNs) propaga notificações push para dispositivos com aplicativos registrados para receber essas notificações. Cada dispositivo estabelece uma conexão de IP credenciada e criptografada com o serviço e recebe notificações por meio dessa conexão persistente. Os provedores se conectam com APNs por meio de um canal persistente e seguro enquanto monitoram os dados de entrada destinados aos seus aplicativos clientes. Quando novos dados para um aplicativo chegam, o provedor prepara e envia uma notificação por meio do canal para APNs, que empurra a notificação para o dispositivo de destino.

Sugiro ler a documentação para obter mais informações e como usar e configurar. Está tudo aí.

Notificações via push

Panama Jack
fonte
Obrigado pela resposta.
MightyMouse de
7
Então a Apple mantém um IP estático para o seu dispositivo?
CMCDragonkai
Fiquei surpreso quando entendi que meu servidor deve enviar uma notificação para APNS PARA CADA DISPOSITIVO ALVO! :(
Vladimir
4
@CMCDragonkai O dispositivo estabelece a conexão, não o servidor.
Hitechcomputergeek de
7
para que os dispositivos mantenham um longo tipo de conexão de polling / socket sempre com o serviço APN? Se for esse o caso, como o serviço APN lida com tantas conexões - se um servidor pode manter 50k conexões e sempre há 500 milhões de usuários, o serviço precisa de pelo menos 10.000 servidores corretos. Este é um cenário prático?
AV94 de
87

Cada dispositivo pode ser atualizado com dados usando seus próprios tokens de dispositivo exclusivos. Esta imagem explica tudo. .

insira a descrição da imagem aqui

Karan Alangat
fonte
Alguma ideia de qual é o uso do token de dispositivo? É usado para criptografar a comunicação entre o servidor APNS e o aplicativo ou outro lugar?
Mugen
1
@Mugen: O token do dispositivo é usado pelo APNS para identificar qual dispositivo ele deve encaminhar a carga enviada pelo provedor!
D4ttatraya
@Karan - Há alguma distinção entre notificações destinadas a um usuário (por exemplo, "Ei, usuário, você tem uma mensagem!") E aquelas destinadas a ativar um aplicativo e silenciosamente instruí-lo a fazer algum processamento em segundo plano?
Howiecamp
@Howiecamp Se você estiver usando a notificação push, será notificado sempre que uma notificação for recebida se o aplicativo estiver em execução. Além disso, os detalhes da notificação ativa são acessíveis quando o usuário toca na notificação do centro de notificação e inicia o aplicativo. Durante esse tempo, você pode realizar os processos que deseja fazer.
Karan Alangat
@KaranAlangat, Como a contagem de emblemas é tratada aqui? Como o servidor sabe disso?
GvSharma
22

Criei um infográfico para explicar o fluxo de trabalho das notificações push. Espero que isso seja útil.

insira a descrição da imagem aqui

Udit Agarwal
fonte
21

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

imagem: ../Art/remote_notif_simple.jpg

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

imagem: ../Art/remote_notif_multiple.jpg

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

imagem: ../Art/service_provider_ct.jpg

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

imagem: ../Art/service_provider_ct_certificate_2x.png

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

imagem: ../Art/service_device_ct.jpg

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

imagem: ../Art/token_generation.jpg

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

imagem: ../Art/token_trust.jpg

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?

Krunal
fonte
7
Haha, você literalmente acabou de colar toda a entrada do Apple Docs no SO!
Matt Mc
@MattMc - Sim, eu era novato em SO, quando postei esta resposta e, naquela época, postei um link para APNS, mas um link não é considerado uma resposta em SO, então fiz isso .... :)
Krunal
1
É verdade, na verdade, muito melhor do que a resposta de apenas um link;)
Matt Mc
14

O dispositivo não continua pesquisando o servidor para as notificações push.

Para simplificar, considere que um iPhone está conectado à Internet. Ao conectar-se à Internet, o iPhone estabelece conexão com o servidor Apple Push Notifications, o que significa que os dados podem ser enviados para o iPhone a partir do servidor no momento em que os dados chegam ao servidor.

A Apple não usa o protocolo HTTP para notificações push, mas se você entende o protocolo HTTP, é uma metodologia quase semelhante.

http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push

user4248688
fonte
O que eles usam senão http?
Howiecamp
2

Há uma explicação muito boa de notificações push neste artigo .

No iOS, os aplicativos não podem fazer muito em segundo plano. Os aplicativos só podem realizar um conjunto limitado de atividades, de modo que a vida útil da bateria é preservada.

Mas e se algo interessante acontecer e você desejar informar o usuário sobre isso, mesmo que ele não esteja usando seu aplicativo no momento?

Tarek
fonte