APNS (Apple Push Notification Service) é o serviço de infraestrutura da Apple para entregar notificações push aos dispositivos do ecossistema: iPhone, iPad, Mac, Apple Watch e Apple TV. O serviço garante a entrega confiável de mensagens através de uma conexão TLS persistente entre o dispositivo e os servidores da Apple. De acordo com a Documentação do Desenvolvedor Apple, o APNS usa o protocolo HTTP/2 para comunicação bidirecional com servidores de aplicativos.
Pontos Principais
O Apple Push Notification Service (APNS) é o serviço proprietário da Apple para rotear notificações push do servidor do aplicativo para os dispositivos dos usuários. Ao contrário do FCM, o APNS não suporta Android ou outras plataformas — ele está totalmente vinculado ao ecossistema Apple.
O serviço opera através de uma conexão TLS persistente que cada dispositivo Apple estabelece com os servidores APNS na inicialização. Esta conexão é mantida em segundo plano e usada para entregar notificações com latência mínima.
O APNS lida com toda a infraestrutura de entrega: criptografia, autenticação, priorização e retransmissão quando o dispositivo está indisponível. O desenvolvedor só precisa fornecer um payload formatado corretamente e um token push válido.
Originalmente, o APNS funcionava através de um protocolo binário nas portas 2195–2196. Desde 2015, a Apple migrou o serviço para o moderno protocolo HTTP/2, que suporta multiplexação, compressão de cabeçalhos e notificações push do servidor. O HTTP/2 tornou-se obrigatório em junho de 2020.
O processo de entrega de notificações push através do APNS consiste em cinco etapas: registro do dispositivo, obtenção do token push, envio da solicitação pelo servidor, roteamento APNS e entrega ao dispositivo.
Se o dispositivo estiver indisponível (desligado ou sem rede), o APNS armazena a mensagem mais recente para cada app e a entrega quando a conexão é restaurada. A duração máxima de armazenamento é de 4 semanas, após as quais a mensagem é excluída.
A Apple suporta dois métodos para autenticar o servidor do aplicativo ao enviar notificações push. Cada método tem suas próprias características quanto ao período de validade, gerenciamento e facilidade de uso.
| Parâmetro | Baseado em Token (p8) | Baseado em Certificado (.p12) |
|---|---|---|
| Validade | Indefinida (a chave não expira) | Limitada à validade do certificado (geralmente 1 ano) |
| Rotação | Não necessária a menos que a chave seja comprometida | Substituição anual obrigatória |
| Multiapp | Uma chave para todos os apps da conta | Certificado separado para cada app |
| Ambiente | Uma chave para Sandbox e Production | Certificados diferentes para Sandbox e Production |
A autenticação baseada em Token é o método recomendado pela Apple desde 2019. Você cria uma única chave p8 no Apple Developer Console, a envia para o seu servidor e assina cada solicitação APNS com ela. A chave nunca expira e funciona para todos os apps da sua conta.
Para novos projetos, a autenticação baseada em Token é claramente preferível: uma chave p8 para toda a conta, indefinida, sem vínculo com ambiente. O método baseado em Certificado (.p12) ainda é usado em projetos legados, mas requer substituição anual e certificados separados para Sandbox e Production. Considere a expiração do certificado ao planejar CI/CD.
O APNS suporta três tipos de notificações push, que diferem em comportamento no dispositivo e requisitos de atributos da solicitação. A escolha do tipo depende do cenário de UX e da urgência da mensagem.
Para notificações Background, você deve especificar a chave content-available: 1 e definir a prioridade como 5 (entrega eficiente em energia). O sistema pode limitar o número de notificações em segundo plano se o app não as processar pontualmente.
O APNS suporta dois valores de prioridade: 10 (entrega imediata) e 5 (eficiente em energia). Para notificações alert, use 10 — o usuário deve recebê-las imediatamente. Para notificações background, use 5 — o sistema pode atrasar a entrega para economizar bateria. Prioridade incorreta para background pode levar à rejeição do APNS.
O APNS aceita payload no formato JSON com tamanho máximo de 4 KB para notificações regulares e 5 KB para VOIP. O payload contém o dicionário aps obrigatório com configurações de exibição e campos personalizados opcionais.
{
"aps": {
"alert": {
"title": "Nova mensagem",
"body": "Você tem 3 chats não lidos"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
A chave thread-id agrupa notificações na Central de Notificações do iOS. A chave category vincula a notificação a uma UNNotificationCategory para exibir botões de ação. Sem essas chaves, todas as notificações são exibidas individualmente.
Além do dicionário aps obrigatório, o payload do APNS pode conter qualquer campo personalizado no nível superior. Esses campos são acessíveis ao aplicativo através do dicionário userInfo ao processar a notificação. Dados personalizados são convenientes para passar identificadores de entidades, telas ou links. O tamanho máximo do payload é de 4 KB, portanto evite transferir grandes volumes de dados via push; carregue-os via API após abrir a notificação.
Para enviar uma notificação push do servidor, você precisa executar uma solicitação POST ao endpoint APNS com os cabeçalhos de autenticação corretos. Abaixo está um exemplo em Node.js usando autenticação baseada em Token.
const http2 = require("http2")
const fs = require("fs")
const jwt = require("jsonwebtoken")
const token = jwt.sign(
{ iss: "TEAM_ID", iat: Math.floor(Date.now() / 1000) },
fs.readFileSync("AuthKey.p8"),
{ algorithm: "ES256", keyid: "KEY_ID" }
)
const payload = JSON.stringify({
aps: { alert: { title: "Olá!", body: "Push de teste" } }
})
const client = http2.connect(
"https://api.push.apple.com"
)
const req = client.request({
":method": "POST",
":path": "/3/device/DEVICE_PUSH_TOKEN",
"authorization": "bearer " + token,
"apns-push-type": "alert",
"apns-topic": "com.example.app",
"apns-priority": "10"
})
req.end(payload)
req.on("response", (headers) => {
if (headers[":status"] === 200) {
console.log("Push enviado com sucesso")
}
})
Após o envio, o APNS retorna o status HTTP 200 em caso de entrega bem-sucedida ou um código de erro com descrição no corpo da resposta. É importante tratar erros token-unregistered (410) — esses tokens devem ser removidos do servidor, pois o aplicativo foi deletado do dispositivo.
O APNS retorna códigos de status HTTP para cada solicitação de envio. A entrega bem-sucedida retorna o status 200. Erros exigem diferentes estratégias de tratamento. BadDeviceToken (400) ou Unregistered (410) — o token do dispositivo está desatualizado e deve ser removido do servidor. PayloadTooLarge (413) — o limite de 4 KB foi excedido, reduza o payload.
TooManyRequests (429) — limite de solicitações excedido. O APNS estabelece uma cota no número de envios por segundo. Ao receber 429, implemente um backoff exponencial (exponential backoff) e tente novamente. Recomenda-se não exceder 100 solicitações por segundo por conexão HTTP/2.
Erros do lado do APNS — 500 e 503 (Erro Interno do Servidor / Serviço Indisponível). São falhas temporárias na infraestrutura da Apple. Nesses casos, tente novamente com um atraso de 1 a 5 segundos, no máximo 3 tentativas. Erros 5xx persistentes com um servidor totalmente operacional são raros e geralmente relacionados a problemas de conexão TLS.
Para ambientes de Production, certifique-se de implementar o log de todos os erros do APNS com o token, código de erro e hora. Isso ajudará a identificar rapidamente problemas com certificados, cotas ou tokens de dispositivos específicos. Verifique regularmente as datas de expiração dos certificados se estiver usando autenticação baseada em Certificado.
Perguntas Frequentes
O APNS funciona através da porta TCP 443 (HTTPS) para a API HTTP/2. Anteriormente, as portas 2195 e 2196 eram usadas para o protocolo binário. Desde junho de 2020, a Apple exige o uso exclusivo de HTTP/2 na porta 443. Certifique-se de que seu servidor tenha acesso a api.push.apple.com.
Sandbox é o ambiente de teste do APNS para depurar notificações push. Production é o ambiente real para usuários finais. Com a autenticação baseada em Token, uma chave funciona para ambos os ambientes — o endpoint difere: api.sandbox.push.apple.com ou api.push.apple.com.
O token push pode mudar ao: restaurar o aplicativo de um backup, reinstalar o aplicativo, atualizar o SO, redefinir as configurações de rede. O token não muda durante atualizações regulares do aplicativo pela App Store. O servidor deve tratar o erro BadDeviceToken (400) como um sinal para remover o token.
4 KB (4096 bytes) para notificações alert/background regulares. Para notificações VOIP via PushKit — 5 KB (5120 bytes). Exceder o tamanho retorna um erro PayloadTooLarge (413). Recomenda-se manter o payload mínimo e carregar dados adicionais através do servidor.
O APNS não pode entregar uma notificação a um dispositivo sem conexão com a internet. Se o dispositivo estiver offline, o APNS armazena a mensagem mais recente (por app por dispositivo) por até 28 dias. Quando a conexão é restaurada, a mensagem é entregue imediatamente. Mensagens mais antigas não são preservadas.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também