iOS SDK v2.0 E2EE Swift Tutti i piani

SDK iOS — Documentazione

Integra Willy Push nella tua app iPhone e iPad. Tutte le push sono cifrate con chiavi nel Keychain del device. Su Enterprise puoi aggiungere la firma HMAC per autenticare ogni richiesta API.

⬇ Scarica SDK iOS ← Torna a Integrazioni

1. Requisiti

RequisitoDettaglio
iOS minimoiOS 14.0+
XcodeXcode 15+ (consigliato)
LinguaggioSwift 5.9+ (compatibile Objective-C)
Certificato pushAPNs Key (.p8) o certificato push configurato nell'Apple Developer Portal
Piano Willy PushQualsiasi piano (Starter, Pro, Enterprise)
CapabilitiesPush Notifications + Background Modes (Remote notifications)
APNs, non Service Worker: A differenza del web (che usa Service Worker), iOS usa Apple Push Notification service (APNs). Il SDK gestisce completamente questa differenza: tu usi le stesse API Willy, il SDK traduce tutto nel formato Apple.
3 livelli di sicurezza:

1. Autenticazione app (tutti i piani) — Ogni richiesta include appId + appKey. Il server valida le credenziali e verifica che il Bundle ID dell'app corrisponda a quello registrato nella dashboard. Un'app non autorizzata viene rifiutata.

2. E2EE (tutti i piani) — Il device genera una coppia di chiavi nel Keychain. Willy cifra ogni push per il device specifico. La Notification Service Extension decripta. Zero push in chiaro.

3. Firma HMAC (Enterprise) — Ogni richiesta API viene firmata con HMAC-SHA256. Anche se qualcuno decompila l'app e trova le credenziali, non può forgiare richieste valide senza il secret HMAC.

Per le app mobile il server valida il Bundle ID (equivalente del dominio per il web) al posto dell'header Origin del browser. Questo impedisce che un'altra app possa usare le stesse credenziali.

2. Installazione

Distribuzione offline: Il kit viene distribuito via ZIP. Tutto il necessario è contenuto nel pacchetto. Nessuna dipendenza da GitHub, CocoaPods o repository esterni.

Installazione (XCFramework nello ZIP)

  1. Scarica willy-push-ios-sdk.zip dal bottone in alto
  2. Estrai lo ZIP: troverai WillyPush.xcframework e la documentazione
  3. Trascina WillyPush.xcframework nel progetto Xcode
  4. Assicurati che sia aggiunto a entrambi i target: la tua app e la Notification Service Extension
  5. Scegli "Copy items if needed" e "Add to targets"

3. Inizializzazione

Inizializza il SDK in AppDelegate. Servono appId e appKey (li trovi nella dashboard → Impostazioni → API). Il server valida queste credenziali insieme al Bundle ID della tua app.

Swift — Starter / Pro

import WillyPush

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions:
            [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {

        WillyPush.configure(
            appId: "IL_TUO_APP_ID",       // Dashboard → Impostazioni → API
            appKey: "LA_TUA_APP_KEY",      // Dashboard → Impostazioni → API
            tags: ["app:ios", "role:customer"]
        )

        WillyPush.registerForPush()

        return true
    }
}

Swift — Enterprise (+ firma HMAC)

WillyPush.configure(
    appId: "IL_TUO_APP_ID",
    appKey: "LA_TUA_APP_KEY",
    hmacSecret: "LA_TUA_HMAC_SECRET",  // Enterprise: firma ogni richiesta API
    tags: ["app:ios", "role:customer"]
)
Sicurezza: Il server valida appId + appKey + Bundle ID ad ogni richiesta. Se qualcuno prova ad usare le tue credenziali da un'app con un Bundle ID diverso, la richiesta viene rifiutata. Su Enterprise, la firma HMAC aggiunge un ulteriore livello: anche con credenziali valide, senza il secret HMAC non si possono forgiare richieste.

SwiftUI (App protocol)

import SwiftUI
import WillyPush

@main
struct MyApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Parametri di configurazione

ParametroTipoDefaultDescrizione
appIdStringObbligatorio. ID dell'app (Dashboard → Impostazioni → API)
appKeyStringObbligatorio. Chiave segreta dell'app (Dashboard → Impostazioni → API)
hmacSecretString?nilSolo Enterprise. Secret HMAC per firmare ogni richiesta API
tags[String][]Tag iniziali per la segmentazione (ruolo, categoria, città, piattaforma...)
autoRegisterBooltrueRegistra automaticamente il device su Willy
debugBoolfalseAbilita log dettagliati nella Console

4. Registrazione device

Con autoRegister: true (default), il SDK gestisce automaticamente tutto il flusso E2EE.

Flusso di registrazione (tutti i piani)

1

Permesso notifiche — Il SDK richiede il permesso all'utente (alert, sound, badge)

2

Token APNs — iOS genera il device token e il SDK lo cattura

3

Chiavi E2EE — Genera una coppia di chiavi e le salva nel Keychain (protette da Secure Enclave se disponibile)

4

Segmentazione — Associa i tag configurati (ruolo, categoria, piattaforma) al device

5

Registrazione API — Invia token APNs + chiave pubblica + tag + Bundle ID alle API Willy, autenticando con appId + appKey. Su Enterprise aggiunge la firma HMAC

6

Push cifrata — Willy cifra ogni push con la chiave pubblica del device. Solo quel telefono può leggerla

7

Decrypt locale — La Notification Service Extension decripta il payload con la chiave privata e mostra la notifica

Autenticazione a 3 livelli:
appId + appKey — validati server-side ad ogni richiesta (tutti i piani)
Bundle ID — il server verifica che corrisponda a quello registrato in dashboard (tutti i piani)
Firma HMAC — ogni richiesta firmata con HMAC-SHA256 (solo Enterprise)

Gestione del token APNs in AppDelegate:

func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    WillyPush.didRegisterForRemoteNotifications(deviceToken: deviceToken)
}

func application(
    _ application: UIApplication,
    didFailToRegisterForRemoteNotificationsWithError error: Error
) {
    WillyPush.didFailToRegisterForRemoteNotifications(error: error)
}
Registrazione manuale: Se imposti autoRegister: false, puoi controllare il momento della registrazione:
// Registra quando vuoi, ad esempio dopo il login
WillyPush.register { result in
    switch result {
    case .success(let deviceId):
        print("Registrato: \(deviceId)")
    case .failure(let error):
        print("Errore: \(error)")
    }
}

5. Ricezione e decrypt push

Il decrypt avviene nella Notification Service Extension (vedi sezione successiva). Per gestire il tap sulla notifica, implementa il delegate:

import WillyPush

extension AppDelegate: WillyPushDelegate {

    func willyPush(didReceiveDecrypted payload: WillyPayload) {
        // Notifica ricevuta con app in foreground
        // payload.title, payload.body, payload.data, payload.image
    }

    func willyPush(didTapNotificationWith payload: WillyPayload) {
        // L'utente ha toccato la notifica
        if let url = payload.data["url"] {
            // Naviga alla schermata giusta
        }
    }
}

Registra il delegate dopo l'inizializzazione:

WillyPush.delegate = self

6. Notification Service Extension

Obbligatoria su tutti i piani. Poiché tutte le push sono cifrate E2EE, la Notification Service Extension è necessaria per decriptare il payload prima di mostrarlo all'utente. Senza, vedresti il contenuto cifrato (illeggibile).

La Notification Service Extension è il componente Apple che intercetta la push prima di mostrarla e permette al SDK di decriptare il payload con la chiave privata del device.

Creare l'extension

  1. In Xcode: File → New → Target
  2. Scegli Notification Service Extension
  3. Nome: NotificationServiceExtension (o come preferisci)
  4. Assicurati che il package WillyPush sia aggiunto anche a questo target
  5. Abilita la capability Keychain Sharing su entrambi i target (app + extension) con lo stesso gruppo

Codice dell'extension

import UserNotifications
import WillyPush

class NotificationService: WillyPushNotificationService {
    // Il SDK gestisce automaticamente:
    // 1. Intercetta la push cifrata
    // 2. Legge la chiave privata dal Keychain
    // 3. Decripta il payload
    // 4. Sostituisce il contenuto della notifica
    // 5. Mostra la notifica decriptata all'utente

    // Opzionale: override per personalizzare
    override func didDecrypt(
        _ payload: WillyPayload,
        content: UNMutableNotificationContent
    ) {
        // Personalizza il contenuto se necessario
        content.title = payload.title
        content.body = payload.body
        content.sound = .default
    }
}
Keychain Sharing: L'extension e l'app devono condividere il Keychain per accedere alla chiave privata E2EE. Abilita Keychain Sharing su entrambi i target con lo stesso Access Group (es: $(TeamIdentifierPrefix)it.willypush.shared).
Perché serve una extension? Su iOS, le push arrivano gestite dal sistema operativo. L'app non è necessariamente in esecuzione. La Notification Service Extension è l'unico modo per modificare il contenuto di una push prima che venga mostrata. Senza extension, la notifica mostrerebbe il payload cifrato (illeggibile).

7. Segmentazione e tag

I tag permettono di segmentare gli utenti per creare campagne mirate dalla dashboard Willy Push.

Aggiungere tag

// Aggiungi tag in qualsiasi momento
WillyPush.addTags(["categoria:pizza", "citta:roma", "piano:premium"])

// Utile dopo il login
WillyPush.addTags(["role:customer", "user_id:12345"])

Rimuovere tag

WillyPush.removeTags(["role:guest", "categoria:pizza"])

Sostituire tutti i tag

WillyPush.setTags(["role:admin", "app:ios"])

Leggere i tag attuali

let tags = WillyPush.getTags()
// ["role:customer", "citta:roma", "app:ios"]

Esempi di segmentazione

Caso d'usoTag
Utente loggato vs guestrole:customer / role:guest
Città dell'utentecitta:roma, citta:milano
Categoria preferitacat:pizza, cat:sushi
Piano/abbonamentopiano:free, piano:premium
Lingualang:it, lang:en
Piattaformaapp:ios

8. Eventi e-commerce

Se la tua app ha un e-commerce, puoi tracciare eventi per campagne automatiche:

Prodotto visualizzato

WillyPush.trackEvent("product_view", data: [
    "productId": "SKU-123",
    "productName": "Pizza Margherita",
    "price": "8.50",
    "category": "pizza"
])

Carrello abbandonato

WillyPush.trackEvent("cart_abandoned", data: [
    "cartValue": "32.00",
    "items": "3"
])

Acquisto completato

WillyPush.trackEvent("purchase_completed", data: [
    "orderId": "ORD-456",
    "total": "32.00",
    "items": "3"
])

9. Ciclo di vita

Il SDK gestisce automaticamente i seguenti scenari:

EventoComportamento SDK
Token APNs cambiaRe-registra automaticamente su Willy con il nuovo token
Chiave E2EE nel KeychainPersiste tra aggiornamenti e reinstallazioni (se il Keychain non viene cancellato)
App aggiornataVerifica la registrazione e aggiorna se necessario
App reinstallataRecupera la chiave dal Keychain se presente, altrimenti ne genera una nuova
Permesso revocatoNotifica Willy di disattivare il device

Logout / cancellazione

// Quando l'utente fa logout
WillyPush.removeTags(["role:customer", "user_id:12345"])
WillyPush.addTags(["role:guest"])

// Per cancellare completamente il device da Willy:
WillyPush.unregister()

10. Test e debug

Abilita la modalità debug

WillyPush.configure(
    appId: "IL_TUO_APP_ID",
    appKey: "LA_TUA_APP_KEY",
    debug: true   // log nella Console di Xcode
)

Filtra i log nella Console con il sottosistema it.willypush.

Verifica la registrazione

let isRegistered = WillyPush.isRegistered()
let deviceId = WillyPush.getDeviceId()
let tags = WillyPush.getTags()

Invia una push di test

  1. Installa l'app su un device fisico (le push APNs non funzionano sul Simulator)
  2. Accedi alla dashboard Willy Push
  3. Crea una nuova campagna
  4. Seleziona il segmento app:ios
  5. Invia la campagna
  6. La push arriverà cifrata, la Notification Service Extension la decripterà e la mostrerà all'utente
Simulator: Le push remote (APNs) non funzionano sul Simulator iOS. Per testare, usa un device fisico. In alternativa, puoi usare il file .apns drag&drop di Xcode per simulare il payload, ma non testerà il flusso E2EE completo.

11. Riferimento API

MetodoDescrizione
WillyPush.configure(...)Inizializza il SDK con la configurazione
WillyPush.registerForPush()Richiede il permesso notifiche e registra il device
WillyPush.register(completion:)Registra manualmente il device su Willy
WillyPush.unregister()Cancella il device da Willy
WillyPush.addTags([String])Aggiunge tag al device
WillyPush.removeTags([String])Rimuove tag dal device
WillyPush.setTags([String])Sostituisce tutti i tag
WillyPush.getTags() -> [String]Restituisce i tag attuali
WillyPush.trackEvent(name, data:)Traccia un evento e-commerce/custom
WillyPush.isRegistered() -> BoolVerifica se il device è registrato
WillyPush.getDeviceId() -> String?Restituisce l'ID device Willy
WillyPush.didRegisterForRemoteNotifications(deviceToken:)Passa il token APNs al SDK

12. FAQ

Funziona con SwiftUI?

Si. L'inizializzazione avviene in AppDelegate (usa @UIApplicationDelegateAdaptor con il protocol App). Il resto dell'app può usare qualsiasi architettura UI.

Qual è la differenza tra Starter/Pro e Enterprise nel SDK?

Su tutti i piani le push sono cifrate E2EE: il device genera le chiavi nel Keychain, Willy cifra, la Notification Service Extension decripta. Il codice è identico.
La differenza è che su Enterprise puoi aggiungere hmacSecret per firmare ogni richiesta API con HMAC-SHA256. Questo aggiunge un livello di sicurezza extra: impedisce registrazioni non autorizzate e garantisce che solo la tua app possa comunicare con il tuo account.

Perché serve la Notification Service Extension?

Poiché tutte le push sono cifrate, Apple non permetterebbe di mostrarle direttamente (il contenuto sarebbe illeggibile). La Notification Service Extension è l'unico punto dove il SDK può decriptare il payload prima che venga mostrato all'utente. È obbligatoria su tutti i piani.

Posso usare il SDK senza HMAC?

Si. Su Starter e Pro non serve. Le push sono comunque cifrate E2EE. L'HMAC è un livello aggiuntivo disponibile su Enterprise.

Il SDK supporta iPad?

Si. Il SDK funziona su iPhone e iPad con lo stesso codice. Le push arrivano su entrambi i device se registrati.

Posso usare il SDK con Objective-C?

Si. Le API pubbliche del SDK sono annotate con @objc e compatibili con Objective-C.

Quanto pesa il SDK?

Il framework pesa meno di 100 KB. Non ha dipendenze esterne oltre ai framework Apple standard.

Funziona con l'ambiente sandbox APNs?

Si. Il SDK rileva automaticamente se stai usando l'ambiente sandbox (development) o production. Willy Push gestisce entrambi.

Pronto per integrare?

Scarica il SDK, segui la guida e in meno di 15 minuti la tua app iOS riceve push cifrate E2EE su qualsiasi piano.

⬇ Scarica SDK iOS Vai al SDK Android → Hai domande? Scrivici