PushKit es un framework de Apple para entregar notificaciones push con entrega instantánea garantizada, diseñado principalmente para aplicaciones VoIP. A diferencia de las APNs estándar (Apple Push Notification service), que pueden retrasarse o agruparse, PushKit utiliza una conexión TCP persistente entre el dispositivo y los servidores de Apple. Según la Apple Developer Documentation, 2026, PushKit proporciona una latencia de entrega de extremo a extremo inferior a 500 milisegundos, lo que es crítico para aplicaciones en tiempo real — llamadas de voz y vídeo.
Puntos clave
PushKit es un framework de Apple presentado en iOS 8 que proporciona un mecanismo de entrega de notificaciones push con prioridad garantizada a través de una conexión persistente con los servidores APNs. A diferencia de las notificaciones regulares que pasan por un único canal APNs y pueden retrasarse, las notificaciones PushKit utilizan un flujo dedicado con mayor prioridad, lo que garantiza una entrega casi en tiempo real.
Técnicamente, PushKit funciona a través de una conexión TCP persistente entre el dispositivo y los servidores push de Apple. Cuando un servidor envía una notificación VoIP, la conexión la entrega instantáneamente al dispositivo, que activa la aplicación y llama al delegado PKPushRegistry. La aplicación no necesita estar en un estado activo — PushKit puede activarla desde segundo plano, estado terminado o incluso después de un reinicio del dispositivo.
Según una investigación de Microsoft Research (2024) sobre la latencia de notificaciones push en plataformas móviles, la latencia mediana de las notificaciones PushKit es de 120–350 ms, mientras que las notificaciones APNs estándar muestran una mediana de 1–5 segundos. La diferencia de orden de magnitud se explica por el canal TCP dedicado y el procesamiento prioritario en el lado de Apple.
PushKit admite cuatro tipos: VoIP (para llamadas), Complication (para datos de esferas de reloj), FileProvider (para sincronización de archivos) y PushToTalk (para funciones de walkie-talkie). Desde iOS 13, solo el tipo VoIP sigue siendo ampliamente disponible para desarrolladores externos. Complication y FileProvider tienen aplicaciones de nicho y están limitados a los ecosistemas propios de Apple.
| Tipo PushKit | Propósito | Disponibilidad |
|---|---|---|
| VoIP | Indicación de llamadas entrantes de voz y vídeo | iOS 8+, App Store |
| Complication | Actualización de datos en esferas de Apple Watch | watchOS 6+ |
| FileProvider | Señal sobre nuevos archivos en File Provider Extension | iOS 11+, limitado |
| PushToTalk | Función de walkie-talkie en aplicaciones empresariales | iOS 16+, acceso limitado |
APNs (Apple Push Notification service) es un servicio universal de entrega de notificaciones push que opera a través de un único canal para todas las aplicaciones. Apple puede almacenar en búfer, agrupar o incluso descartar notificaciones APNs cuando el canal está congestionado. PushKit, por otro lado, utiliza una conexión dedicada para cada tipo de notificación, y Apple garantiza la entrega de cada push VoIP sin almacenamiento en búfer.
La diferencia se hace evidente en escenarios críticos en el tiempo: una llamada entrante entregada a través de APNs puede llegar con un retraso de 10–30 segundos o no llegar en absoluto si el dispositivo está en modo de ahorro de energía. PushKit entrega la misma notificación en 100–500 ms independientemente del estado del dispositivo, porque su canal TCP se mantiene activo por el sistema con prioridad.
| Parámetro | PushKit | APNs |
|---|---|---|
| Tipo de conexión | TCP persistente (canal dedicado) | Canal compartido con búfer |
| Latencia mediana | 120–350 ms | 1–5 segundos |
| Activación de la app | Siempre, desde cualquier estado | Solo si la app no está cerrada |
| Tamaño del payload | Hasta 5 KB | Hasta 4 KB |
| Agrupación iOS | No | Sí |
La arquitectura de PushKit se construye alrededor de PKPushRegistry — un objeto que registra la aplicación para recibir notificaciones de un tipo específico. La aplicación crea una instancia de PKPushRegistry, especifica el tipo deseado (por ejemplo, PKPushTypeVoIP) y asigna un delegado. Después del registro, el sistema mantiene automáticamente la conexión con APNs y entrega las notificaciones push a través del delegado.
Cada notificación está representada por un objeto PKPushPayload, que contiene un dictionaryPayload con datos del servidor. El tamaño del payload está limitado a 5 KB, suficiente para transmitir metadatos de la llamada: identificador del llamante, tipo de llamada (audio/vídeo), nombre de contacto y token de sesión. El flujo de medios se transmite por separado a través de WebRTC u otro protocolo en tiempo real.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit llama al método delegado al recibir una notificación. En este punto, la aplicación debe extraer los datos de dictionaryPayload y mostrar inmediatamente la llamada a través de CallKit, de lo contrario el sistema puede finalizar la tarea en segundo plano. Apple recomienda completar el procesamiento en 30 segundos, pero para las llamadas VoIP es crítico mostrar la pantalla de llamada dentro del primer 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
)
}
}
Con el lanzamiento de iOS 13, Apple introdujo restricciones estrictas sobre el uso de PushKit. Los desarrolladores habían estado utilizando ampliamente VoIP push como un mecanismo encubierto para actualizaciones en segundo plano — la activación a través de PushKit permitía cargar contenido, sincronizar datos y actualizar la interfaz sin permiso explícito del usuario. Apple consideró esto una violación del concepto de ahorro de energía y limitó PushKit solo a la indicación de llamadas entrantes.
Ahora cada notificación PushKit debe resultar inmediatamente en la visualización de una llamada entrante a través de CallKit. Si el sistema detecta que PushKit se utiliza para otros fines — por ejemplo, sincronización en segundo plano o actualizaciones de contenido sin mostrar una llamada — la aplicación puede ser rechazada durante la revisión o desactivada del servicio PushKit. Apple también eliminó la capacidad de usar PushKit para actualizaciones de datos en segundo plano a partir de iOS 13.
La integración completa de PushKit incluye registro, obtención de un token push y manejo de notificaciones entrantes. PushKit solicita permiso automáticamente para enviar notificaciones — no se requiere una llamada adicional a UNUserNotificationCenter para PushKit en sí, pero puede ser necesaria para las notificaciones locales de la aplicación. Después del registro, el sistema llama a pushRegistry:didUpdatePushCredentials para entregar el token push, que debe enviarse al 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)")
}
}
El servidor envía una notificación PushKit a través de APNs con push-type = voip y el encabezado apns-push-type: voip. A diferencia de las APNs regulares, VoIP push utiliza su propio certificado y no requiere configuración de topic. El payload debe contener datos mínimos para la identificación de la llamada.
// Ejemplo de payload de push VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
La depuración de PushKit es más compleja que las APNs estándar porque PushKit no funciona en el simulador de iOS. Se necesita un iPhone o iPad físico para el diagnóstico. La primera señal de funcionamiento correcto es una llamada a pushRegistry:didUpdatePushCredentials al iniciar y la aparición de un token push en un formato específico (64 caracteres hexadecimales para VoIP). Si no se llama al delegado, verifique los entitlements de su aplicación.
Otro problema común es que PushKit no entrega notificaciones después de una actualización de la aplicación. Esto ocurre si el token push ha cambiado pero el servidor continúa usando el antiguo. La solución es enviar el token nuevo al servidor al iniciar la aplicación y eliminar los tokens no válidos cuando se llama a pushRegistry:didInvalidatePushTokenForType. Apple también recomienda implementar un mecanismo de respaldo a través de APNs regulares.
| Problema | Causa | Solución |
|---|---|---|
| No se llama a didUpdatePushCredentials | Faltan entitlements o tipo incorrecto | Verifique Capabilities → Push Notifications + VoIP en Xcode |
| Push llega con retraso | Dispositivo en modo de bajo consumo o señal débil | PushKit no puede eludir las limitaciones de hardware |
| No llegan notificaciones después de reinicio | Cambio de token push tras reinstalar la aplicación | Solicite un nuevo token y actualícelo en el servidor |
| App Store rechazada por PushKit | PushKit usado para fines que no son llamadas | Asegúrese de que cada push resulte en reportNewIncomingCall |
Preguntas frecuentes
Técnicamente sí, pero sería inútil. Desde iOS 13, el único uso permitido de PushKit es la indicación de llamadas entrantes, que requiere CallKit para su visualización. Usar PushKit sin CallKit resultará en el rechazo de la aplicación en App Store.
El tamaño máximo del payload para PushKit es de 5 KB (5120 bytes). Esto es 1 KB más que las notificaciones APNs regulares, lo que permite transmitir más metadatos de la llamada.
Apple invalida automáticamente el token push cuando se elimina la aplicación. El servidor recibirá una notificación de invalidación y debe dejar de enviar pushes a ese token. Intentar enviar un push a un token no válido resultará en el error 410 de APNs.
PushKit está disponible en macOS 10.14+ para aplicaciones de Mac creadas con Mac Catalyst o AppKit. La funcionalidad es completamente equivalente a la versión de iOS, incluido el soporte de notificaciones VoIP.
Use su propia analítica: rastree el tiempo entre el envío de un push desde el servidor y la llamada a didReceiveIncomingPushWithPayload en el cliente. Un tiempo promedio inferior a 500 ms indica un funcionamiento correcto de PushKit.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también