Vai al contenuto

APNS

Il servizio di notifiche push di Apple (APNS) consente di inviare notifiche push a dispositivi iOS, macOS, tvOS e watchOS. Questo pacchetto fornisce un client per inviare notifiche push ad APNS da Vapor. È basato su APNSwift.

Inizio

Vediamo come iniziare ad usare APNS.

Pacchetto

Il primo passo per usare APNS è aggiungere il pacchetto alle dipendenze.

// swift-tools-version:5.8
import PackageDescription

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

Se il manifesto viene modificato direttamente in Xcode, esso rileverà automaticamente le modifiche e scaricherà la nuova dipendenza quando il file viene salvato. Altrimenti, da Terminale, basta eseguire swift package resolve per scaricare la nuova dipendenza.

Configurazione

Il modulo APNS aggiunge una nuova proprietà apns ad Application. Per inviare notifiche push, è necessario impostare le proprie credenziali sulla proprietà configuration.

import APNS
import VaporAPNS
import APNSCore

// Configurazione di APNS utilizzando l'autenticazione tramite JWT.
let apnsConfig = APNSClientConfiguration(
    authenticationMethod: .jwt(
        privateKey: try .loadFrom(string: "<#key.p8 content#>"),
        keyIdentifier: "<#key identifier#>",
        teamIdentifier: "<#team identifier#>"
    ),
    environment: .sandbox
)
app.apns.containers.use(
    apnsConfig,
    eventLoopGroupProvider: .shared(app.eventLoopGroup),
    responseDecoder: JSONDecoder(),
    requestEncoder: JSONEncoder(),
    as: .default
)

I segnaposto dell'esempio devono essere sostituiti con le credenziali. Questo esempio utilizza l'autenticazione JWT con la chiave .p8, ottenibile dal portale per sviluppatori di Apple. Per l'autenticazione TLS, si può utilizzare il metodo di autenticazione .tls:

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

Invio

Una volta configurato APNS, è possibile inviare notifiche push tramite il metodo apns.send presente su Application e Request.

// Payload Codable personalizzato
struct Payload: Codable {
    let acme1: String
    let acme2: String
}
// Creazione di un Alert per la notifica 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
)
// Send the notification
try! await req.apns.client.sendAlertNotification(
    alert, 
    deviceToken: dt, 
    deadline: .distantFuture
)

Dall'interno di un route handler si può utilizzare req.apns.

// Invia una notifica push.
app.get("test-push") { req async throws -> HTTPStatus in
    try await req.apns.client.send(...) 
    return .ok
}

Il primo parametro contiene la notifica push mentre il secondo parametro contiene il token del dispositivo a cui inviare la notifica push.

Alert

APNSAlertNotification rappresenta i metadati della notifica push da inviare. Qui ci sono informazioni più specifiche su ogni proprietà; i nomi delle proprietà seguono lo schema di denominazione uno-a-uno elencato nella documentazione di 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
)

Questo tipo può essere passato come parametro al metodo send.

Dati di notifica personalizzati

Apple consente di inviare dati personalizzati in ogni notifica. Per renderlo semplice in APNS basta che i dati da inviare conformino a Codable:

struct Payload: Codable {
    let acme1: String
    let acme2: String
}

Altre informazioni

Per ulteriori informazioni su come utilizzare APNS, vedere il README di APNSwift.