Android SDK v2.0 E2EE Kotlin / Java Tutti i piani

SDK Android — Documentazione

Integra Willy Push nella tua app Android. Tutte le push sono cifrate con chiavi generate sul device. Su Enterprise puoi aggiungere la firma HMAC per autenticare ogni richiesta API.

⬇ Scarica SDK Android ← Torna a Integrazioni

1. Requisiti

RequisitoDettaglio
Android minimoAPI 21 (Android 5.0 Lollipop)
Target SDKAPI 34+ consigliato
LinguaggioKotlin (consigliato) o Java
FirebaseProgetto Firebase con FCM configurato
Piano Willy PushQualsiasi piano (Starter, Pro, Enterprise)
GradleAGP 7.0+ con Gradle 7.x+
Tutto cifrato, sempre. Su tutti i piani il device genera una coppia di chiavi E2EE, Willy cifra per il device specifico e il SDK decripta localmente. Zero push in chiaro.

Due livelli, stesso SDK:
Starter / Pro — E2EE con chiavi sul device. Cifratura e decrypt automatici.
Enterprise — E2EE con chiavi sul device + firma HMAC su ogni richiesta API. Il parametro hmacSecret autentica il device e impedisce registrazioni non autorizzate.

2. Installazione

Opzione A — Gradle (consigliata)

Aggiungi nel build.gradle del modulo app:

// build.gradle (Module: app)
dependencies {
    implementation 'it.willypush:android-sdk:2.0.0'
    implementation 'com.google.firebase:firebase-messaging:23.4.0'
}

Assicurati di avere il repository Maven Willy Push nel tuo settings.gradle:

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://maven.willypush.it/releases' }
    }
}

Opzione B — File AAR manuale

Se preferisci, scarica il SDK e aggiungilo manualmente:

  1. Scarica il file willy-push-android-sdk.zip dal bottone in alto
  2. Estrai willy-push-sdk-2.0.0.aar nella cartella app/libs/
  3. Aggiungi nel build.gradle:
dependencies {
    implementation files('libs/willy-push-sdk-2.0.0.aar')
    implementation 'com.google.firebase:firebase-messaging:23.4.0'
}
  1. Sincronizza il progetto Gradle

3. Inizializzazione

Inizializza il SDK nella tua classe Application o nella MainActivity. Su tutti i piani le push sono cifrate E2EE. Per Enterprise aggiungi hmacSecret per firmare le richieste.

Kotlin — Starter / Pro (E2EE)

import it.willypush.sdk.WillyPush
import it.willypush.sdk.WillyConfig

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()

        WillyPush.init(this, WillyConfig.Builder()
            .domain("TUO_DOMINIO")
            .tags("app:android", "role:customer")
            .promptDelay(3)
            .build()
        )
    }
}

Kotlin — Enterprise (E2EE + firma HMAC)

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()

        WillyPush.init(this, WillyConfig.Builder()
            .domain("TUO_DOMINIO")
            .hmacSecret("LA_TUA_HMAC_SECRET")  // Enterprise: firma ogni richiesta API
            .tags("app:android", "role:customer")
            .promptDelay(3)
            .build()
        )
    }
}

Java — Esempio base (tutti i piani)

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()
            .domain("TUO_DOMINIO")
            // .hmacSecret("...")  ← solo Enterprise
            .tags("app:android", "role:customer")
            .promptDelay(3)
            .build()
        );
    }
}

Parametri WillyConfig

ParametroTipoDefaultDescrizione
domainStringObbligatorio. Il dominio del tuo piano Willy Push
hmacSecretStringnullSolo Enterprise. Secret HMAC per firmare ogni richiesta API. Se omesso, la registrazione avviene senza firma
tagsString...[]Tag iniziali per la segmentazione (ruolo, categoria, città, piattaforma...)
promptDelayInt0Secondi prima di richiedere il permesso notifiche (Android 13+)
autoRegisterBooleantrueRegistra automaticamente il device su Willy
debugBooleanfalseAbilita log dettagliati in Logcat

4. Registrazione device

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

Flusso di registrazione (tutti i piani)

1

Token FCM — Il SDK recupera il token push del dispositivo da Firebase Cloud Messaging

2

Chiavi E2EE — Genera una coppia di chiavi (pubblica + privata) e le salva nel KeyStore Android

3

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

4

Registrazione API — Invia token + chiave pubblica + tag alle API Willy. Su Enterprise la richiesta viene firmata con HMAC

5

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

6

Decrypt locale — Il SDK decripta il contenuto con la chiave privata e lo consegna all'app

Enterprise + HMAC: Se hai configurato hmacSecret, il SDK firma automaticamente ogni richiesta API (registrazione, aggiornamento tag, eventi) con HMAC-SHA256. Questo impedisce registrazioni non autorizzate e garantisce che solo la tua app possa comunicare con il tuo account Willy.
Registrazione manuale: Se imposti 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
    }
})

5. Ricezione e decrypt push

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.

Kotlin

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(...)
    }
}

Java

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");
    }
}
Importante: Non sovrascrivere onMessageReceived() di Firebase direttamente. Il SDK lo gestisce internamente per eseguire il decrypt E2EE. Usa sempre onDecryptedMessage().

6. Configurazione manifest

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" />
Android 13+ (API 33): Il SDK gestisce automaticamente la richiesta del permesso POST_NOTIFICATIONS a runtime, rispettando il promptDelay configurato. Se preferisci gestirla tu, imposta autoPrompt(false) nella config.

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

// Rimuove tutti i tag precedenti e imposta solo questi
WillyPush.setTags("role:admin", "app:android")

Leggere i tag attuali

val tags: List<String> = WillyPush.getTags()
// ["role:customer", "citta:roma", "app:android"]

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:android

8. Eventi e-commerce

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

Prodotto visualizzato

WillyPush.trackEvent("product_view", mapOf(
    "productId" to "SKU-123",
    "productName" to "Pizza Margherita",
    "price" to "8.50",
    "category" to "pizza"
))

Carrello abbandonato

WillyPush.trackEvent("cart_abandoned", mapOf(
    "cartValue" to "32.00",
    "items" to "3"
))

Acquisto completato

WillyPush.trackEvent("purchase_completed", mapOf(
    "orderId" to "ORD-456",
    "total" to "32.00",
    "items" to "3"
))
Campagne automatiche: Dalla dashboard Willy Push puoi creare campagne che si attivano automaticamente in base a questi eventi. Ad esempio: invia una push 30 minuti dopo cart_abandoned con uno sconto personalizzato.

9. Ciclo di vita

Il SDK gestisce automaticamente i seguenti scenari:

EventoComportamento SDK
Token FCM cambiaRe-registra automaticamente su Willy con il nuovo token
Chiave E2EE scadeGenera nuova coppia e aggiorna la chiave pubblica su Willy
App aggiornataVerifica la registrazione e aggiorna se necessario
App reinstallataNuova registrazione completa (nuovo device ID)
Permesso revocatoNotifica Willy di disattivare il device

Logout / cancellazione

// 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()

10. Test e debug

Abilita la modalità debug

WillyConfig.Builder()
    .domain("TUO_DOMINIO")
    .debug(true)   // log dettagliati in Logcat
    .build()

Filtra i log in Logcat con il tag WillyPush:

adb logcat -s WillyPush

Verifica la registrazione

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

Invia una push di test

  1. Installa l'app sul device o emulatore (con Google Play Services)
  2. Accedi alla dashboard Willy Push
  3. Crea una nuova campagna
  4. Seleziona il segmento app:android
  5. Invia la campagna
  6. La push arriverà cifrata al device e il SDK la decripterà automaticamente
Emulatore: Le push FCM funzionano sull'emulatore Android solo se l'immagine include Google Play Services (Google APIs). Usa un'immagine "Google APIs" nell'AVD Manager.

11. Riferimento API

MetodoDescrizione
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(): BooleanVerifica se il device è registrato
WillyPush.getDeviceId(): String?Restituisce l'ID device Willy

12. FAQ

Il SDK funziona con Jetpack Compose?

Si. Il SDK non ha dipendenze da View o XML. L'inizializzazione avviene in Application, la ricezione nel service. Puoi 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, 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.

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 aumenta la dimensione dell'APK?

Il SDK pesa meno di 120 KB dopo ProGuard/R8. Non include dipendenze pesanti oltre a Firebase Messaging (che probabilmente hai già).

Funziona con Firebase Cloud Messaging v2?

Si. Il SDK è compatibile con FCM API v1 e v2. Non serve configurazione aggiuntiva.

Posso usare il SDK su Kotlin Multiplatform (KMP)?

Il SDK Android è nativo. Per un progetto KMP, aggiungilo nel modulo Android come dipendenza specifica della piattaforma.

Come gestisco gli utenti che hanno già l'app senza Willy Push?

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.

Pronto per integrare?

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

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