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.
| Requisito | Dettaglio |
|---|---|
| iOS minimo | iOS 14.0+ |
| Xcode | Xcode 15+ (consigliato) |
| Linguaggio | Swift 5.9+ (compatibile Objective-C) |
| Certificato push | APNs Key (.p8) o certificato push configurato nell'Apple Developer Portal |
| Piano Willy Push | Qualsiasi piano (Starter, Pro, Enterprise) |
| Capabilities | Push Notifications + Background Modes (Remote notifications) |
hmacSecret autentica il device e impedisce registrazioni non autorizzate.
In Xcode:
https://github.com/willypush/ios-sdk
# Podfile target 'MyApp' do pod 'WillyPush', '~> 2.0' end target 'NotificationServiceExtension' do pod 'WillyPush', '~> 2.0' end
Poi esegui pod install.
WillyPush.xcframeworkInizializza il SDK in AppDelegate. Su tutti i piani le push sono cifrate E2EE. Per Enterprise aggiungi hmacSecret per firmare le richieste.
import WillyPush class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { WillyPush.configure( domain: "TUO_DOMINIO", tags: ["app:ios", "role:customer"] ) WillyPush.registerForPush() return true } }
WillyPush.configure( domain: "TUO_DOMINIO", enableE2EE: true, // Enterprise: chiavi nel Keychain, decrypt locale tags: ["app:ios", "role:customer"] )
import SwiftUI import WillyPush @main struct MyApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { ContentView() } } }
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
domain | String | — | Obbligatorio. Il dominio del tuo piano Willy Push |
enableE2EE | Bool | false | false = Basic/Pro (push standard). true = Enterprise (chiavi nel Keychain, decrypt locale) |
tags | [String] | [] | Tag iniziali per la segmentazione |
autoRegister | Bool | true | Registra automaticamente il device su Willy |
debug | Bool | false | Abilita log dettagliati nella Console |
Con autoRegister: true (default), il SDK gestisce automaticamente il flusso. Il flusso cambia in base al piano.
Permesso notifiche — Il SDK richiede il permesso all'utente (alert, sound, badge)
Token APNs — iOS genera il device token e il SDK lo cattura
Registrazione API — Invia token + tag alle API Willy Push
Push pronte — Willy invia le push protette dai server UE. Il device le riceve direttamente leggibili via APNs
Permesso notifiche — Il SDK richiede il permesso all'utente (alert, sound, badge)
Token APNs — iOS genera il device token e il SDK lo cattura
Chiavi E2EE — Genera una coppia di chiavi e le salva nel Keychain (protette da Secure Enclave se disponibile)
Registrazione API — Invia token APNs + chiave pubblica + tag alle API Willy
Push cifrata — Willy cifra la push con la chiave pubblica del device. Solo quel device può decriptarla
Decrypt locale — La Notification Service Extension decripta il payload con la chiave privata e mostra la notifica
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) }
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)") } }
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
enableE2EE: false), non serve la Notification Service Extension. Le push arrivano già leggibili via APNs. Puoi saltare questa sezione.
La Notification Service Extension è il componente Apple che permette di modificare il contenuto della push prima di mostrarla. Il SDK la usa per decriptare il payload cifrato con la chiave pubblica del device.
NotificationServiceExtension (o come preferisci)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 } }
$(TeamIdentifierPrefix)it.willypush.shared).
I tag permettono di segmentare gli utenti per creare campagne mirate dalla dashboard Willy Push.
// Aggiungi tag in qualsiasi momento WillyPush.addTags(["categoria:pizza", "citta:roma", "piano:premium"]) // Utile dopo il login WillyPush.addTags(["role:customer", "user_id:12345"])
WillyPush.removeTags(["role:guest", "categoria:pizza"])
WillyPush.setTags(["role:admin", "app:ios"])
let tags = WillyPush.getTags() // ["role:customer", "citta:roma", "app:ios"]
| Caso d'uso | Tag |
|---|---|
| Utente loggato vs guest | role:customer / role:guest |
| Città dell'utente | citta:roma, citta:milano |
| Categoria preferita | cat:pizza, cat:sushi |
| Piano/abbonamento | piano:free, piano:premium |
| Lingua | lang:it, lang:en |
| Piattaforma | app:ios |
Se la tua app ha un e-commerce, puoi tracciare eventi per campagne automatiche:
WillyPush.trackEvent("product_view", data: [ "productId": "SKU-123", "productName": "Pizza Margherita", "price": "8.50", "category": "pizza" ])
WillyPush.trackEvent("cart_abandoned", data: [ "cartValue": "32.00", "items": "3" ])
WillyPush.trackEvent("purchase_completed", data: [ "orderId": "ORD-456", "total": "32.00", "items": "3" ])
Il SDK gestisce automaticamente i seguenti scenari:
| Evento | Comportamento SDK |
|---|---|
| Token APNs cambia | Re-registra automaticamente su Willy con il nuovo token |
| Chiave E2EE nel Keychain (solo Enterprise) | Persiste tra aggiornamenti e reinstallazioni (se il Keychain non viene cancellato) |
| App aggiornata | Verifica la registrazione e aggiorna se necessario |
| App reinstallata | Recupera la chiave dal Keychain se presente, altrimenti ne genera una nuova |
| Permesso revocato | Notifica Willy di disattivare il device |
// 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()
WillyPush.configure( domain: "TUO_DOMINIO", enableE2EE: true, debug: true // log nella Console di Xcode )
Filtra i log nella Console con il sottosistema it.willypush.
let isRegistered = WillyPush.isRegistered() let deviceId = WillyPush.getDeviceId() let tags = WillyPush.getTags()
app:ios| Metodo | Descrizione |
|---|---|
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() -> Bool | Verifica se il device è registrato |
WillyPush.getDeviceId() -> String? | Restituisce l'ID device Willy |
WillyPush.didRegisterForRemoteNotifications(deviceToken:) | Passa il token APNs al SDK |
Si. L'inizializzazione avviene in AppDelegate (usa @UIApplicationDelegateAdaptor con il protocol App). Il resto dell'app può usare qualsiasi architettura UI.
Basic/Pro (enableE2EE: false): il device si registra con token APNs + tag. Le push arrivano protette dai server Willy in UE, leggibili direttamente via APNs. Nessuna chiave locale, nessun decrypt, non serve la Notification Service Extension.
Enterprise (enableE2EE: true): il device genera una coppia di chiavi nel Keychain. Willy cifra ogni push con la chiave pubblica del device. Solo il telefono può decriptare tramite la Notification Service Extension. Vera E2EE a doppia chiave.
Il codice dei tuoi delegate resta identico in entrambi i casi.
Apple non permette all'app di intercettare le push in background. La Notification Service Extension è l'unico punto dove puoi modificare (decriptare) il contenuto prima che venga mostrato. Senza, vedresti il payload cifrato. In Basic/Pro non serve perché il contenuto arriva già leggibile.
Si. Il SDK funziona su iPhone e iPad con lo stesso codice. Le push arrivano su entrambi i device se registrati.
Si. Le API pubbliche del SDK sono annotate con @objc e compatibili con Objective-C.
Il framework pesa meno di 100 KB. Non ha dipendenze esterne oltre ai framework Apple standard.
Si. Il SDK rileva automaticamente se stai usando l'ambiente sandbox (development) o production. Willy Push gestisce entrambi.
Scarica il SDK, segui la guida e in meno di 15 minuti la tua app iOS riceve push. Funziona su tutti i piani, da Starter a Enterprise E2EE.