Integra Willy Push nella tua app Android. Tutte le push sono cifrate E2EE. Ogni app è autenticata con appId + appKey + validazione package name. Enterprise aggiunge la firma HMAC.
| Requisito | Dettaglio |
|---|---|
| Android minimo | API 21 (Android 5.0 Lollipop) |
| Target SDK | API 34+ consigliato |
| Linguaggio | Kotlin (consigliato) o Java |
| Firebase | Progetto Firebase con FCM configurato |
| Piano Willy Push | Qualsiasi piano (Starter, Pro, Enterprise) |
| Gradle | AGP 7.0+ con Gradle 7.x+ |
appId + appKey. Il server valida le credenziali e verifica che il package name dell'app corrisponda a quello registrato nella dashboard. Un'app non autorizzata viene rifiutata.Per le app mobile il server valida il package name (equivalente del dominio per il web) al posto dell'header Origin del browser. Questo impedisce che un'altra app possa usare le stesse credenziali.
willy-push-sdk-2.0.0.aar e la documentazionewilly-push-sdk-2.0.0.aar nella cartella app/libs/ del tuo progettobuild.gradle (module app):dependencies { implementation files('libs/willy-push-sdk-2.0.0.aar') implementation 'com.google.firebase:firebase-messaging:23.4.0' }
Inizializza il SDK nella tua classe Application o nella MainActivity. Servono appId e appKey (li trovi nella dashboard → Impostazioni → API). Il server valida queste credenziali insieme al package name della tua app.
import it.willypush.sdk.WillyPush import it.willypush.sdk.WillyConfig class MyApp : Application() { override fun onCreate() { super.onCreate() WillyPush.init(this, WillyConfig.Builder() .appId("IL_TUO_APP_ID") // Dashboard → Impostazioni → API .appKey("LA_TUA_APP_KEY") // Dashboard → Impostazioni → API .tags("app:android", "role:customer") .promptDelay(3) .build() ) } }
class MyApp : Application() { override fun onCreate() { super.onCreate() WillyPush.init(this, WillyConfig.Builder() .appId("IL_TUO_APP_ID") .appKey("LA_TUA_APP_KEY") .hmacSecret("LA_TUA_HMAC_SECRET") // Enterprise: firma ogni richiesta API .tags("app:android", "role:customer") .promptDelay(3) .build() ) } }
import it.willypush.sdk.WillyPush; import it.willypush.sdk.WillyConfig; public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); WillyPush.init(this, new WillyConfig.Builder() .appId("IL_TUO_APP_ID") .appKey("LA_TUA_APP_KEY") // .hmacSecret("...") ← solo Enterprise .tags("app:android", "role:customer") .promptDelay(3) .build() ); } }
appId + appKey + package name ad ogni richiesta. Se qualcuno prova ad usare le tue credenziali da un'app con un package name 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.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
appId | String | — | Obbligatorio. ID dell'app (Dashboard → Impostazioni → API) |
appKey | String | — | Obbligatorio. Chiave segreta dell'app (Dashboard → Impostazioni → API) |
hmacSecret | String | null | Solo Enterprise. Secret HMAC per firmare ogni richiesta API |
tags | String... | [] | Tag iniziali per la segmentazione (ruolo, categoria, città, piattaforma...) |
promptDelay | Int | 0 | Secondi prima di richiedere il permesso notifiche (Android 13+) |
autoRegister | Boolean | true | Registra automaticamente il device su Willy |
debug | Boolean | false | Abilita log dettagliati in Logcat |
Con autoRegister: true (default), il SDK gestisce automaticamente tutto il flusso E2EE.
Token FCM — Il SDK recupera il token push del dispositivo da Firebase Cloud Messaging
Chiavi E2EE — Genera una coppia di chiavi (pubblica + privata) e le salva nel KeyStore Android
Segmentazione — Associa i tag configurati (ruolo, categoria, piattaforma) al device
Registrazione API — Invia token + chiave pubblica + tag + package name alle API Willy, autenticando con appId + appKey. Su Enterprise aggiunge la firma HMAC
Push cifrata — Willy cifra ogni push con la chiave pubblica del device. Solo quel telefono può leggerla
Decrypt locale — Il SDK decripta il contenuto con la chiave privata e lo consegna all'app
autoRegister(false), puoi controllare il momento esatto della registrazione:
// Registra quando vuoi, ad esempio dopo il login WillyPush.register(object : WillyCallback { override fun onSuccess(deviceId: String) { // Device registrato con successo } override fun onError(error: WillyError) { // Gestisci l'errore } })
Crea un service che estende WillyPushService. Il SDK riceve la push cifrata, la decripta con la chiave privata del device e chiama onDecryptedMessage con il contenuto in chiaro.
import it.willypush.sdk.WillyPushService import it.willypush.sdk.WillyPayload class MyPushService : WillyPushService() { override fun onDecryptedMessage(payload: WillyPayload) { // Il contenuto è già decriptato dal SDK. // payload.title → titolo della notifica // payload.body → corpo del messaggio // payload.data → Map<String, String> dati extra // payload.image → URL immagine (opzionale) showNotification(payload) // metodo helper del SDK } override fun onNotificationClicked(payload: WillyPayload) { // L'utente ha toccato la notifica. // Naviga alla schermata giusta. val deepLink = payload.data["url"] // startActivity(...) } }
import it.willypush.sdk.WillyPushService; import it.willypush.sdk.WillyPayload; public class MyPushService extends WillyPushService { @Override public void onDecryptedMessage(WillyPayload payload) { showNotification(payload); } @Override public void onNotificationClicked(WillyPayload payload) { String deepLink = payload.getData().get("url"); } }
onMessageReceived() di Firebase direttamente. Il SDK lo gestisce internamente per eseguire il decrypt E2EE. Usa sempre onDecryptedMessage().
Aggiungi il tuo service nel AndroidManifest.xml:
<!-- AndroidManifest.xml --> <application> <!-- Il tuo push service --> <service android:name=".MyPushService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- Application class (se usi classe custom) --> <!-- android:name=".MyApp" --> </application> <!-- Android 13+: permesso notifiche runtime --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
POST_NOTIFICATIONS a runtime, rispettando il promptDelay configurato. Se preferisci gestirla tu, imposta autoPrompt(false) nella config.
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")
// Rimuove tutti i tag precedenti e imposta solo questi WillyPush.setTags("role:admin", "app:android")
val tags: List<String> = WillyPush.getTags() // ["role:customer", "citta:roma", "app:android"]
| 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:android |
Se la tua app ha un e-commerce, puoi tracciare eventi per campagne automatiche:
WillyPush.trackEvent("product_view", mapOf( "productId" to "SKU-123", "productName" to "Pizza Margherita", "price" to "8.50", "category" to "pizza" ))
WillyPush.trackEvent("cart_abandoned", mapOf( "cartValue" to "32.00", "items" to "3" ))
WillyPush.trackEvent("purchase_completed", mapOf( "orderId" to "ORD-456", "total" to "32.00", "items" to "3" ))
cart_abandoned con uno sconto personalizzato.
Il SDK gestisce automaticamente i seguenti scenari:
| Evento | Comportamento SDK |
|---|---|
| Token FCM cambia | Re-registra automaticamente su Willy con il nuovo token |
| Chiave E2EE scade | Genera nuova coppia e aggiorna la chiave pubblica su Willy |
| App aggiornata | Verifica la registrazione e aggiorna se necessario |
| App reinstallata | Nuova registrazione completa (nuovo device ID) |
| Permesso revocato | Notifica Willy di disattivare il device |
// Quando l'utente fa logout: rimuovi i tag personali WillyPush.removeTags("role:customer", "user_id:12345") WillyPush.addTags("role:guest") // Per cancellare completamente il device da Willy: WillyPush.unregister()
WillyConfig.Builder() .appId("IL_TUO_APP_ID") .appKey("LA_TUA_APP_KEY") .debug(true) // log dettagliati in Logcat .build()
Filtra i log in Logcat con il tag WillyPush:
adb logcat -s WillyPush
val isRegistered = WillyPush.isRegistered() val deviceId = WillyPush.getDeviceId() val tags = WillyPush.getTags()
app:android| Metodo | Descrizione |
|---|---|
WillyPush.init(context, config) | Inizializza il SDK con la configurazione |
WillyPush.register(callback?) | Registra il device su Willy (automatico se autoRegister) |
WillyPush.unregister() | Cancella il device da Willy |
WillyPush.addTags(vararg tags) | Aggiunge tag al device |
WillyPush.removeTags(vararg tags) | Rimuove tag dal device |
WillyPush.setTags(vararg tags) | Sostituisce tutti i tag con quelli specificati |
WillyPush.getTags(): List<String> | Restituisce i tag attuali |
WillyPush.trackEvent(name, data) | Traccia un evento e-commerce/custom |
WillyPush.isRegistered(): Boolean | Verifica se il device è registrato |
WillyPush.getDeviceId(): String? | Restituisce l'ID device Willy |
Si. Il SDK non ha dipendenze da View o XML. L'inizializzazione avviene in Application, la ricezione nel service. Puoi usare qualsiasi architettura UI.
Su tutti i piani le push sono cifrate E2EE: il device genera le chiavi, Willy cifra, il device 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.
Si. Su Starter e Pro non serve. Le push sono comunque cifrate E2EE. L'HMAC è un livello aggiuntivo disponibile su Enterprise.
Il SDK pesa meno di 120 KB dopo ProGuard/R8. Non include dipendenze pesanti oltre a Firebase Messaging (che probabilmente hai già).
Si. Il SDK è compatibile con FCM API v1 e v2. Non serve configurazione aggiuntiva.
Il SDK Android è nativo. Per un progetto KMP, aggiungilo nel modulo Android come dipendenza specifica della piattaforma.
Al primo avvio dopo l'aggiornamento, il SDK si registra automaticamente. Gli utenti esistenti inizieranno a ricevere push senza fare nulla. Puoi distinguerli con tag migration:v2.
Scarica il SDK, segui la guida e in meno di 15 minuti la tua app Android riceve push cifrate E2EE su qualsiasi piano.