Saltar a contenido

APNS

La API del Servicio de Notificaciones Push de Apple (APNS) facilita la autenticación y envío de notificaciones push a dispositivos Apple. Está construida sobre APNSwift.

Primeros Pasos

Veamos cómo puedes empezar a usar APNS.

Paquete

El primer paso para usar APNS es añadir el paquete a tus dependencias.

// swift-tools-version:5.8
import PackageDescription

let package = Package(
    name: "my-app",
    dependencies: [
         // Otras dependencias...
        .package(url: "https://github.com/vapor/apns.git", from: "4.0.0"),
    ],
    targets: [
        .target(name: "App", dependencies: [
            // Otras dependencias...
            .product(name: "VaporAPNS", package: "apns")
        ]),
        // Otros targets...
    ]
)

Si editas directamente el manifiesto desde Xcode, automáticamente tomará los cambios y obtendrá la nueva dependencia cuando se guarde el archivo. De lo contrario, desde un terminal, ejecuta swift package resolve para obtener la nueva dependencia.

Configuración

El módulo APNS añade una propiedad nueva apns a Application. Para enviar notificaciones push, necesitarás establecer la propiedad configuration con tus credenciales.

import APNS
import VaporAPNS
import APNSCore

// Configura APNS usando autenticación JWT.
let apnsConfig = APNSClientConfiguration(
    authenticationMethod: .jwt(
        privateKey: try .loadFrom(string: "<#key.p8 content#>"),
        keyIdentifier: "<#key identifier#>",
        teamIdentifier: "<#team identifier#>"
    ),
    environment: .development
)
app.apns.containers.use(
    apnsConfig,
    eventLoopGroupProvider: .shared(app.eventLoopGroup),
    responseDecoder: JSONDecoder(),
    requestEncoder: JSONEncoder(),
    as: .default
)

Rellena los marcadores de posición con tus credenciales. El ejemplo anterior muestra autenticación basada en JWT utilizando la clave .p8 que se obtiene del portal para desarrolladores de Apple. Para autenticación basada en TLS con un certificado, utiliza el método de autenticación .tls:

authenticationMethod: .tls(
    privateKeyPath: <#path to private key#>,
    pemPath: <#path to pem file#>,
    pemPassword: <#optional pem password#>
)

Enviar

Una vez que APNS está configurado, puedes enviar notificaciones push usando el método apns.send en Application o Request.

// Carga útil codificable personalizada
struct Payload: Codable {
    let acme1: String
    let acme2: Int
}
// Crear alerta de notificación push
let dt = "70075697aa918ebddd64efb165f5b9cb92ce095f1c4c76d995b384c623a258bb"
let payload = Payload(acme1: "hey", acme2: 2)
let alert = APNSAlertNotification(
    alert: .init(
        title: .raw("Hello"),
        subtitle: .raw("This is a test from vapor/apns")
    ),
    expiration: .immediately,
    priority: .immediately,
    topic: "<#my topic#>",
    payload: payload
)
// Enviar la notificación
try! await req.apns.client.sendAlertNotification(
    alert, 
    deviceToken: dt, 
    deadline: .distantFuture
)

Usa req.apns siempre que estés dentro de un manejador de rutas.

// Envía una notificación push.
app.get("test-push") { req async throws -> HTTPStatus in
    try await req.apns.client.send(...)
    return .ok
}

El primer parámetro acepta la alerta de notificación push y el segundo parámetro es el token del dispositivo de destino.

Alerta

APNSAlertNotification son los metadatos reales de la alerta de notificación push a enviar. Más detalles sobre las especificaciones de cada propiedad se proporcionan aquí. Siguen un esquema de nomenclatura uno a uno que figura en la documentación de Apple.

let alert = APNSAlertNotification(
    alert: .init(
        title: .raw("Hello"),
        subtitle: .raw("This is a test from vapor/apns")
    ),
    expiration: .immediately,
    priority: .immediately,
    topic: "<#my topic#>",
    payload: payload
)

Este tipo se puede pasar directamente al método send.

Datos de Notificación Personalizados

Apple ofrece a los ingenieros la posibilidad de agregar datos de carga (payload) personalizados a cada notificación. Para facilitar eso, aceptamos la conformidad Codable con el parámetro de carga (payload) en todas las apis send.

// Carga útil codificable personalizada
struct Payload: Codable {
    let acme1: String
    let acme2: Int
}

Más Información

Para obtener más información sobre los métodos disponibles, consulte el README de APNSwift.