PushKit é um framework da Apple para entregar notificações push com entrega instantânea garantida, projetado principalmente para aplicativos VoIP. Ao contrário dos APNs padrão (Apple Push Notification service), que podem sofrer atrasos ou agrupamento, o PushKit usa uma conexão TCP persistente entre o dispositivo e os servidores da Apple. De acordo com a Apple Developer Documentation, 2026, o PushKit fornece latência de entrega de ponta a ponta inferior a 500 milissegundos, o que é crítico para aplicações em tempo real — chamadas de voz e vídeo.
Principais conclusões
PushKit é um framework da Apple apresentado no iOS 8 que fornece um mecanismo de entrega de notificações push com prioridade garantida através de uma conexão persistente com os servidores APNs. Ao contrário das notificações comuns que passam por um único canal APNs e podem sofrer atrasos, as notificações PushKit usam um fluxo dedicado com maior prioridade, garantindo entrega quase em tempo real.
Tecnicamente, o PushKit funciona através de uma conexão TCP persistente entre o dispositivo e os servidores push da Apple. Quando um servidor envia uma notificação VoIP, a conexão a entrega instantaneamente ao dispositivo, que ativa o aplicativo e chama o delegado PKPushRegistry. O aplicativo não precisa estar em estado ativo — o PushKit pode ativá-lo do segundo plano, estado terminado ou mesmo após uma reinicialização do dispositivo.
De acordo com uma pesquisa da Microsoft Research (2024) sobre latência de notificações push em plataformas móveis, a latência mediana das notificações PushKit é de 120–350 ms, enquanto as notificações APNs padrão mostram uma mediana de 1–5 segundos. A diferença de ordem de grandeza é explicada pelo canal TCP dedicado e pelo processamento prioritário no lado da Apple.
O PushKit suporta quatro tipos: VoIP (para chamadas), Complication (para dados de mostradores de relógio), FileProvider (para sincronização de arquivos) e PushToTalk (para funções de walkie-talkie). Desde o iOS 13, apenas o tipo VoIP permanece amplamente disponível para desenvolvedores terceiros. Complication e FileProvider têm aplicações de nicho e estão limitados aos próprios ecossistemas da Apple.
| Tipo PushKit | Propósito | Disponibilidade |
|---|---|---|
| VoIP | Indicação de chamadas de voz e vídeo recebidas | iOS 8+, App Store |
| Complication | Atualização de dados em mostradores do Apple Watch | watchOS 6+ |
| FileProvider | Sinal sobre novos arquivos no File Provider Extension | iOS 11+, limitado |
| PushToTalk | Função walkie-talkie em aplicativos empresariais | iOS 16+, acesso limitado |
APNs (Apple Push Notification service) é um serviço universal de entrega de notificações push que opera através de um único canal para todos os aplicativos. A Apple pode armazenar em buffer, agrupar ou até descartar notificações APNs quando o canal está congestionado. O PushKit, por outro lado, usa uma conexão dedicada para cada tipo de notificação, e a Apple garante a entrega de cada push VoIP sem buffer.
A diferença torna-se evidente em cenários críticos de tempo: uma chamada recebida entregue via APNs pode chegar com um atraso de 10–30 segundos ou não chegar se o dispositivo estiver no modo de economia de energia. O PushKit entrega a mesma notificação em 100–500 ms, independentemente do estado do dispositivo, porque seu canal TCP é mantido ativo pelo sistema com prioridade.
| Parâmetro | PushKit | APNs |
|---|---|---|
| Tipo de conexão | TCP persistente (canal dedicado) | Canal compartilhado com buffer |
| Latência mediana | 120–350 ms | 1–5 segundos |
| Ativação do app | Sempre, de qualquer estado | Apenas se o app não foi encerrado |
| Tamanho do payload | Até 5 KB | Até 4 KB |
| Agrupamento iOS | Não | Sim |
A arquitetura do PushKit é construída em torno do PKPushRegistry — um objeto que registra o aplicativo para receber notificações de um tipo específico. O aplicativo cria uma instância do PKPushRegistry, especifica o tipo desejado (por exemplo, PKPushTypeVoIP) e atribui um delegado. Após o registro, o sistema mantém automaticamente a conexão com os APNs e entrega notificações push através do delegado.
Cada notificação é representada por um objeto PKPushPayload, que contém um dictionaryPayload com dados do servidor. O tamanho do payload é limitado a 5 KB, suficiente para transmitir metadados da chamada: identificador do chamador, tipo de chamada (áudio/vídeo), nome do contato e token de sessão. O próprio fluxo de mídia é transmitido separadamente via WebRTC ou outro protocolo em tempo real.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
O PushKit chama o método delegado ao receber uma notificação. Neste ponto, o aplicativo deve extrair os dados do dictionaryPayload e exibir imediatamente a chamada através do CallKit, caso contrário o sistema pode encerrar a tarefa em segundo plano. A Apple recomenda concluir o processamento em 30 segundos, mas para chamadas VoIP é crítico exibir a tela de chamada no primeiro segundo.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType
) {
guard let caller =
payload.dictionaryPayload["caller"] as? String
else { return }
CallKitManager.shared.reportIncomingCall(
uuid: UUID(),
handle: caller
)
}
}
Com o lançamento do iOS 13, a Apple introduziu restrições rigorosas ao uso do PushKit. Os desenvolvedores estavam usando amplamente o VoIP push como um mecanismo oculto para atualizações de aplicativos em segundo plano — a ativação via PushKit permitia carregar conteúdo, sincronizar dados e atualizar a interface sem permissão explícita do usuário. A Apple considerou isso uma violação do conceito de economia de energia e limitou o PushKit apenas à indicação de chamadas recebidas.
Agora, cada notificação PushKit deve resultar imediatamente na exibição de uma chamada recebida através do CallKit. Se o sistema detectar que o PushKit está sendo usado para outros fins — por exemplo, sincronização em segundo plano ou atualizações de conteúdo sem exibir uma chamada — o aplicativo pode ser rejeitado durante a revisão ou desativado do serviço PushKit. A Apple também removeu a capacidade de usar o PushKit para atualizações de dados em segundo plano a partir do iOS 13.
A integração completa do PushKit inclui registro, obtenção de um token push e tratamento de notificações recebidas. O PushKit solicita permissão automaticamente para enviar notificações — uma chamada adicional ao UNUserNotificationCenter não é necessária para o próprio PushKit, mas pode ser necessária para notificações locais do aplicativo. Após o registro, o sistema chama pushRegistry:didUpdatePushCredentials para entregar o token push, que precisa ser enviado ao servidor.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let token = pushCredentials.token
.map { String(format: "%02x", $0) }
.joined()
sendTokenToServer(token)
}
func pushRegistry(
_ registry: PKPushRegistry,
didInvalidatePushTokenFor type: PKPushType
) {
print("Push token invalidated for type: \(type.rawValue)")
}
}
O servidor envia uma notificação PushKit via APNs com push-type = voip e o cabeçalho apns-push-type: voip. Ao contrário dos APNs comuns, o VoIP push usa seu próprio certificado e não requer configuração de topic. O payload deve conter dados mínimos para identificação da chamada.
// Exemplo de payload de push VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
A depuração do PushKit é mais complexa que os APNs padrão porque o PushKit não funciona no simulador iOS. É necessário um iPhone ou iPad físico para diagnóstico. O primeiro sinal de operação correta é uma chamada a pushRegistry:didUpdatePushCredentials na inicialização e o aparecimento de um token push em um formato específico (64 caracteres hexadecimais para VoIP). Se o delegado não for chamado, verifique os entitlements do seu aplicativo.
Outro problema comum é o PushKit não entregar notificações após uma atualização do aplicativo. Isso acontece se o token push mudou, mas o servidor continua usando o antigo. A solução é enviar o novo token ao servidor na inicialização do aplicativo e remover tokens inválidos quando pushRegistry:didInvalidatePushTokenForType for chamado. A Apple também recomenda implementar um mecanismo de fallback através de APNs comuns.
| Problema | Causa | Solução |
|---|---|---|
| didUpdatePushCredentials não é chamado | Entitlements ausentes ou tipo incorreto | Verifique Capabilities → Push Notifications + VoIP no Xcode |
| Push chega com atraso | Dispositivo no modo de baixa energia ou sinal fraco | PushKit não pode contornar limitações de hardware |
| Notificações não chegam após reinício | Token push alterado após reinstalação do aplicativo | Solicite um novo token e atualize-o no servidor |
| App Store rejeitado devido ao PushKit | PushKit usado para fins não relacionados a chamadas | Certifique-se de que cada push resulte em reportNewIncomingCall |
Perguntas frequentes
Tecnicamente sim, mas seria inútil. Desde o iOS 13, o único uso permitido do PushKit é indicação de chamadas recebidas, que requer CallKit para exibição. Usar PushKit sem CallKit resultará na rejeição do aplicativo na App Store.
O tamanho máximo do payload para PushKit é de 5 KB (5120 bytes). Isso é 1 KB a mais que as notificações APNs comuns, permitindo transmitir mais metadados da chamada.
A Apple invalida automaticamente o token push quando o aplicativo é excluído. O servidor receberá uma notificação de invalidação e deve parar de enviar pushes para esse token. Tentar enviar um push para um token inválido resultará no erro APNs 410.
O PushKit está disponível no macOS 10.14+ para aplicativos Mac criados com Mac Catalyst ou AppKit. A funcionalidade é totalmente equivalente à versão iOS, incluindo suporte a notificações VoIP.
Use sua própria análise: monitore o tempo entre o envio de um push do servidor e a chamada didReceiveIncomingPushWithPayload no cliente. Um tempo médio inferior a 500 ms indica operação correta do PushKit.
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