Questo post è stato scritto da Luca Di Fino, freelance Windows Phone developer
Introduzione
Dopo aver lavorato tanto per sviluppare la vostra app, pubblicarla, pubblicizzarla, rimane un solo obiettivo allo sviluppatore: invogliare l’utente ad usarla spesso (soprattutto se i vostri guadagni derivano dalla pubblicità). Nel panorama mobile attuale, dove gli app store contano app nell’ordine di centinaia di migliaia, ogni utente installa decine di app sul proprio smartphone per poi usarne effettivamente solo una manciata. Ci sono studi che indicano come in media le app vengano aperte una decina di volte in un anno e che un quarto delle app scaricate vengano lanciate una volta sola. Oltre all’ovvio consiglio di sviluppare app interessanti, graficamente piacevoli e funzionali, il modo per far sì che l’utente non si dimentichi di avere installato la vostra app e sia invece invogliato ad usarla è implementare un sistema di notifiche push, sistema che vi permette di richiamare l’attenzione dell’utente anche quando questo non avvia l’app. La piattaforma Windows ha in più la caratteristica unica di poter distribuire notifiche visuali che verranno visualizzate sotto forma di Live Tile, il che ha l’effetto aggiuntivo di invogliare l’utente a tenere l’app sulla schermata start.
Come funzionano le notifiche push
Le notifiche push permettono infatti di far visualizzare al sistema informazioni relative all’app anche quando questa non è in esecuzione. E’ il sistema operativo a farsi carico di questa attività, in modo da ottimizzare l’uso di risorse ed risparmiare allo sviluppatore di dover implementare processi in background che facciano polling per ricevere le notifiche. L’invio delle notifiche è gestito da una infrastruttura specifica per ogni piattaforma denominata Platform Notification System (PNS). Genericamente l’app si registra sul PNS della propria piattaforma ricevendo handle univoco legato all’app e al device (una uri nel caso di piattaforme Microsoft, un token invece per Apple e Google). Sta allo sviluppatore creare un servizio di backend della propria app che contenga la logica di trigger delle notifiche e la logica di gestione degli handle e dei device, in modo da poter inviare nel momento opportuno le notifiche al PNS che, tramite l’handler specifico, può indirizzare la notifica al device giusto.
Criticità
Le criticità nell’implementare un sistema di notifiche push sono principalmente quelle della gestione dei device e dei relativi handle, criticità che peggiorano quando si deve gestire un sistema di notifiche che copra piattaforme diverse. Il vostro backend deve infatti gestire i differenti utenti, i device, gli handle con le loro scadenze e peculiarità che variano di piattaforma in piattaforma. Inoltre deve essere in grado di scalare su grandi numeri mantenendo una tempistica ragionevole (se avete un’app che fornisce i goal del campionato non potete permettere che l’ultimo nella tabella dei device riceva la notifica con 5 minuti di ritardo, diventerebbe un servizio inutile). Inoltre vanno anche gestite notifiche personalizzate (solo le notizie della squadra del cuore oppure solo in determinati giorni e/o orari).
Sviluppare un sistema di backend per gestire le notifiche push richiede dunque molto tempo per lo sviluppo di servizi assolutamente non correlati con la vostra app (e di cui se siete alle prime armi probabilmente non avete nemmeno le competenze).
Azure Notification Hub
Azure Notification Hub è un servizio di Azure che vi permette di creare un servizio di notifiche push multipiattaforma, estremamente scalabile e soprattutto facilissimo da implementare, che si fa carico di tutta la parte relativa alla gestione dei device per lasciarvi liberi di concentrarvi esclusivamente sulla logica di creazione delle notifiche relativa alla vostra app.
Il Notification Hub:
· Gestisce per voi gli handle dei vari PNS, preoccupandosi di interagire con il PNS per eventuali errori, token scaduti, ecc.
· Lavora con device Windows (sia WNS che MPNS), Apple, Google e Amazon
· È in grado di servire push a milioni di device con bassa latenza
· Lavora con ogni tipo di backend (.NET, Node.JS, PHP, Java, REST API, ecc.)
· Ha un efficiente sistema di multicast e routing basato su tag
· È estremamente personalizzabile
· Offre una ricca telemetria
· È gratuito fino a 1 milione di push al mese
· Si implementa in 5 righe di codice
Vediamo ora come implementare le notifiche tramite Notification Hub su un’app universal in tre passi:
1. Creare e configurare il Notification Hub
2. Creare l’app client (universal)
3. Creare il backend
1. Notification Hub
Per creare il Notification Hub dobbiamo seguire questi tre passaggi:
· Creare l’Hub su Azure
· Recuperare il SID del pacchetto e la chiave privata client nel Dev Center
· Configurare l’Hub con il SID e la chiave appena recuperati
Creiamo un nuovo servizio hub dalla dashboard di Azure, andando su Nuovo -> Servizi App -> Bus di Servizio -> Hub di Notifica -> Creazione Rapida. Dobbiamo poi solo scegliere il nome del Notification Hub e l’area in cui vogliamo ospitare il servizio.
Azure creerà per noi uno Spazio dei Nomi in cui sarà ospitato l’Hub denominato nomehub-ns
Selezionandolo, sotto il tag Hub di Notifica, troverete l’hub appena creato
All’interno dell’Hub, nel tag Configura, si trovano i campi di testo in cui inserire i vari parametri di configurazione per le varie piattaforme supportate. Nel nostro caso andremo a riempire il SID del pacchetto e la chiave segreta del client nella sezione Impostazioni di notifica Windows, usate per app Windows, Windows Phone (Runtime) e Universal.
Per recuperare queste informazioni dobbiamo passare per il Dev Center di Windows, andare nella sezione servizi dell’app e cliccare su sito dei servizi live. Nel caso in cui non abbiate creato ancora l’app dovete almeno riservarne il nome nel Dev Center.
In modo analogo potete recuperare queste informazioni dal Dev Center di Windows Phone.
Da notare che se create un’app universal il SID e la chiave segreta saranno le stesse sia per l’app Windows che per quella Windows Phone.
2. App Client (Universal)
Creiamo una Universal App in Visual Studio (oppure usiamo un’app esistente).
Il punto essenziale è che questa app sia già associata allo Store. Se non lo è potete farlo da Project -> Store -> Associate App with the Store. Nel caso di app Universal dovrete eseguire questa operazione sia per l’app Windows che per quella Windows Phone; al termine dell’associazione dovreste trovare nella root del vostro progetto un file denominato Package.StoreAssociation.xml.
Per configurare la vostra app alla ricezione delle notifiche dovete:
· Installare il pacchetto Nuget WindowsAzure.Messaging.Managed
· Abilitare l’app alla ricezione delle notifiche toast dal file .appxmanifest
· Creare un NotificationChannel e registrarlo sul Notification Hub (3 righe di codice):
string notificationHubPath = NOME_HUB;
string connectionString = DefaultListenSharedAccessSignature;
NotificationHub hub = newNotificationHub(notificationHubPath, connectionString);
var channel = awaitPushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
await hub.RegisterNativeAsync(channel.Uri);
Nel caso di una Universal App, potete inserire queste righe nel metodo OnLaunched in App.xaml.cs all’interno progetto Shared, in modo da far registrare l’app per le notifiche al lancio dell’app stessa.
La connectionString si trova nella dashboard dell’Hub su Azure al link Visualizza stringa di connessione:
Di default, la creazione guidata genera due stringhe di connessione: la prima, denominata DefaultListenSharedAccessSignature, permette solo la ricezione delle notifiche e va inserita nel client. Mentre la stringa denominata DefaultFullSharedAccessSignature permette anche la creazione di notifiche e va inserita nel backend. E’ possibile generare nuove stringhe con diversi criteri di accesso nella sezione Configura dell’Hub.
3. App Backend
Per creare un backend per la vostra app useremo un progetto .NET. Può essere una pagina ASP.NET, una Web API, o perché no persino un’app. Tutto ciò che dovete fare è:
· Aggiungere il pacchetto Nuget WindowsAzure.ServiceBus
· Creare l’HubClient:
NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(connectionString, hubname);
Dove la connectionString è la DefaultFullSharedAccessSignature di cui abbiamo parlato poco sopra e l’hubname è il nome del vostro hub.
Notate che l’ordine dei parametri è invertito rispetto al client (prima la stringa di connessione e poi il nome dell’hub).
· Inviare una notifica nativa (nel formato della vostra piattaforma)
await hub.SendWindowsNativeNotificationAsync(XMLpayload); //WinRT
await hub.SendMpnsNativeNotificationAsync(XMLpayload); //Silverlight
await hub.SendAppleNativeNotificationAsync(JSONpayload); //iOS
await hub.SendGcmNativeNotificationAsync(JSONpayload); //Android
E’ tutto. Con 5 righe di codice potete inviare notifiche push alla vostra app. A tutte le complicazioni legate alla gestione dei token, dei device, ecc. ci pensa Azure.
Ovviamente resta da implementare la logica che scatena le notifiche, quella di creazione dei payload XML o JSON, non penserete che faccia davvero tutto Azure ;-)
Notifiche con Tag
E’ possibile avere un maggiore controllo sulle notifiche, ad esempio creando delle categorie a cui potersi sottoscrivere, utilizzando i tag, che altro non sono che semplici stringhe di testo.
Nel client, in fase di registrazione del canale push, potete aggiungere un array di stringhe, che rappresenta i tag a cui volete sottoscrivervi, come parametro della chiamata RegisterNativeAsync.
string[] tagsToSubscribeTo = { "phone", "news" };
await hub.RegisterNativeAsync(channel.Uri, tagsToSubscribeTo);
Nel backend dovete invece inserire una unica stringa con uno o più tag combinati tramite espressioni booleane (AND (&&), OR (||), NOT (!)). E’ possibile combinare fino a 20 tag se usate solo OR altrimenti il limite è di 6 tag.
await hub.SendWindowsNativeNotificationAsync(toast, "phone");
await hub.SendWindowsNativeNotificationAsync(toast, "phone && news");
await hub.SendWindowsNativeNotificationAsync(toast, "phone || news");
Siate educati
Va bene tenere alta l’attenzione dell’utente, basta non esagerare. A meno di casi particolari, inviare troppe notifiche push potrebbe avere l’effetto contrario e portare l’utente a disinstallare l’app nel caso peggiore. In ogni caso è bene offrire una pagina di configurazione in cui far scegliere all’utente quali e quante notifiche ricevere (tramite i tag) ed eventualmente dare la possibilità di disattivarle del tutto.
Per deregistrare le notifiche avete i seguenti metodi per deregistrare una specifica richiesta oppure per disattivare tutte le notifiche:
var registration = await hub.RegisterNativeAsync(channel.Uri, tagsToSubscribeTo);
await hub.UnregisterAsync(registration);
await hub.UnregisterAllAsync(channel.Uri);
Ora non avete più scuse per non implementare le notifiche push, anche nella vostra app fatta per divertimento.
Prima di lasciarvi vi rimando al mio blog dove sono presenti le slide sull’argomento che ho mostrato durante l’ultimo Mobile Camp a Roma, io intanto corro ad aggiungere le notifiche alle mie app :-P
read full article