PushKit — qué es, el framework de notificaciones push para VoIP

Autor: IT Sectr Publicado: 2026-06-16 Tiempo de lectura: 8 min

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 — un framework de entrega de notificaciones push con prioridad elevada para tipos VoIP, Location y FileProvider.
  • PKPushRegistry — la clase principal para registrar tipos de notificaciones y recibir mensajes push entrantes.
  • VoIP push — el único uso permitido de PushKit desde iOS 13, que proporciona indicación instantánea de llamadas entrantes.
  • Conexión TCP persistente — la base técnica de PushKit, que garantiza la entrega sin los retrasos característicos de APNs.
  • Combinación con CallKit — PushKit entrega la notificación, CallKit muestra la pantalla de llamada del sistema, proporcionando una experiencia de usuario unificada.

¿Qué es PushKit y cómo funciona?

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.

¿Qué tipos de notificaciones admite PushKit?

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 PushKitPropósitoDisponibilidad
VoIPIndicación de llamadas entrantes de voz y vídeoiOS 8+, App Store
ComplicationActualización de datos en esferas de Apple WatchwatchOS 6+
FileProviderSeñal sobre nuevos archivos en File Provider ExtensioniOS 11+, limitado
PushToTalkFunción de walkie-talkie en aplicaciones empresarialesiOS 16+, acceso limitado

PushKit vs APNs: diferencias clave

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.

Comparación de características

ParámetroPushKitAPNs
Tipo de conexiónTCP persistente (canal dedicado)Canal compartido con búfer
Latencia mediana120–350 ms1–5 segundos
Activación de la appSiempre, desde cualquier estadoSolo si la app no está cerrada
Tamaño del payloadHasta 5 KBHasta 4 KB
Agrupación iOSNo

Arquitectura de PushKit: PKPushRegistry y PKPushPayload

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.

Registro de PKPushRegistry

swift
import PushKit

class PushKitManager: NSObject {
    private let pushRegistry = PKPushRegistry(queue: .main)
    
    func configure() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]
    }
}

Recepción y procesamiento de notificaciones push

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.

swift
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
        )
    }
}

Restricciones de iOS 13 y reglas de uso de PushKit

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.

Recomendaciones de Apple para el uso de PushKit (iOS 13+)

  • Cada notificación VoIP debe llamar a reportNewIncomingCall dentro de los 5 segundos posteriores a la recepción del push
  • No use PushKit para pings, sincronización de contenido o actualizaciones de tokens — para eso está background fetch
  • El servidor solo debe enviar un push cuando haya una llamada entrante real, no para una activación previa
  • Recibir un push sin una llamada posterior mostrará una llamada perdida en Recents — esto desorienta al usuario

Integración de PushKit en Swift

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.

swift
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)")
    }
}

Envio de notificaciones push desde el servidor

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.

json
// Ejemplo de payload de push VoIP
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

Diagnóstico y depuración de notificaciones PushKit

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.

Problemas comunes y sus soluciones

ProblemaCausaSolución
No se llama a didUpdatePushCredentialsFaltan entitlements o tipo incorrectoVerifique Capabilities → Push Notifications + VoIP en Xcode
Push llega con retrasoDispositivo en modo de bajo consumo o señal débilPushKit no puede eludir las limitaciones de hardware
No llegan notificaciones después de reinicioCambio de token push tras reinstalar la aplicaciónSolicite un nuevo token y actualícelo en el servidor
App Store rechazada por PushKitPushKit usado para fines que no son llamadasAsegúrese de que cada push resulte en reportNewIncomingCall

Preguntas frecuentes

¿Se puede usar PushKit sin CallKit?

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.

¿Cuál es el tamaño máximo del payload de PushKit?

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.

¿Qué sucede si elimino una aplicación que usa PushKit?

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.

¿Funciona PushKit en macOS?

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.

¿Cómo puedo verificar que la conexión PushKit está activa?

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

  • PushKit — el framework de Apple para entregar notificaciones push con prioridad elevada, utilizando una conexión TCP persistente y proporcionando latencia inferior a 500 ms.
  • PKPushRegistry registra la aplicación para recibir notificaciones de un tipo específico — VoIP, Complication, FileProvider o PushToTalk.
  • Desde iOS 13, el único uso permitido de PushKit es la indicación de llamadas entrantes a través de CallKit; las actualizaciones de datos en segundo plano mediante PushKit están prohibidas.
  • Diferencia de APNs — canal TCP dedicado sin almacenamiento en búfer y activación garantizada de la aplicación desde cualquier estado.
  • Payload limitado a 5 KB; cada push VoIP debe llamar a reportNewIncomingCall en 5 segundos.
  • Diagnóstico de PushKit requiere un dispositivo físico — el simulador no es compatible; el token debe actualizarse en cada inicio.
  • PushKit + CallKit — la combinación estándar para aplicaciones VoIP: PushKit entrega la notificación, CallKit muestra la pantalla de llamada del sistema.

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.

Discutir el proyecto

Lea también