Azure Mobile Services (4.) – Notifikační služby (aktualizováno)

V prvním dílu totoho seriálu jsme se seznámili s účelem Azure Mobile Services (vyzkoušejte zdarma!) a některými základními fakty. Ve druhém díle jsme poznali datové služby, které nám umožňují ukládat a spravovat data na serveru. Ve třetím díle jsme tato data zabezpečili. Zbývá nám poslední várka funkcí, kterou jsou push notifikace.

Notifikační služby a jejich druhy

Notifkační služby využívají toho, že uživatel má své zařízení velkou část času při sobě. Je tedy možné mu posílat různé zprávy “z aplikace”. Přestože terminologie se na jednotlivých platformách liší, uživatelská zkušenost je poměrně podobná. Obecně lze notifikace rozdělit do 3 skupin:

  • Rychlá zpráva pro uživatele (“toast notification”) – zobrazí rychlou textovou nebo obrazovou zprávu uživateli, při její aktivaci se zpravidla přepínáme do aplikace v příslušném kontextu. Příklad může být odeslání zprávy o expedici vaší objednávky, při poklepání se zobrazí aplikace s příslušnou otevřenou objednávkou.
  • Aktualizace stavu aplikace (“tile notification”) – aktualizuje nejdůležitější informace o aplikaci. Dobrým příkladem je aktuální teplota a obrázek pro aplikaci Počasí, anebo počet nových zpráv na serveru pro aplikaci Mail.
  • Zpráva pro aplikaci (“raw notification”) – tato zpráva se nezobrazuje uživateli. Je určena aplikaci, která musí v danou chvíli běžet anebo mít zaregistrovaného agenta na pozadí. Dobrým příkladem mohou být notifikace pro poštovní aplikaci – pokud dorazí nová zpráva na server, je odeslána notifikace běžící aplikaci, která pak zavolá server a aktualizuje svůj stav (nová zpráva se tak uživateli zobrazí téměř okamžitě po jejím doručení na server).

Příklad prvních dvou vizuálních notifikací v prostředí Windows 8 vidíte na obrázku:

image

Serverové API pro notifikace

Posílání notifikací na uživatelovo zařízení je poměrně citlivá záležitost. Je třeba nezbytně zajistit, že uživatel nedostává žádné notifikace, které si sám nevyžádal. Za tímto účelem jsou zavedena některá pravidla:

  • Pro používání notifikační služby určité platformy (Windows Store, Windows Phone, Apple zařízení, …) je třeba vaši aplikaci zaregistrovat u notifikační služby.
  • Vlastní volání notifikační služby je vždy autentizované.
  • Klient musí souhlasit se zasíláním notifikací. Tento “souhlas” se provede tak, že klientská aplikace požádá o přidělení notifikačního kanálu, tento kanál je poté vytvořen a serverové části služby se předá jednoznačný identifikátor kanálu, který je později použit pro zasílání notifikací. Často je též vyžadováno, aby aplikace deklarovala použití notifikace ve svém manifestu (tento fakt se zobrzí uživateli při instalaci)
  • Pokud je aplikace, která si kanál zaregistruje, později odinstalována, nejsou již notifikace dále doručovány.

Zařídit všechny tyto náležitosti není snadné. Služby Mobile Services vás ale velké části práce zbavují. V každém případě budete ovšem muset provést minimálně dva úkony: zaregistrovat se u příslušné notifikační služby pro vaši platformu a poté nakopírovat autentizační údaje pro příslušnou platformu do portálu pro správu vaší mobilní služby. Jednotlivé postupy pro vybrané mobilní platformy jsou zde:

Kombinace HTML/JavaScript v prohlížeči samozřejmě notifikaci nenabízí - není zde žádný trvalý komunikační kanál. Příklad konfigurace mobilní služby vypadá takto:

image

Jakmile je služba nakonfigurována, je možné pomocí serverových skriptů posílat notifikace. K dispozici jsou velmi jednoduše použitelná rozhraní pro jednotlivé služby:

  • push.apns – Apple Push Notification Service pro iOS zařízení
  • push.mpns – Microsoft Push Notifcation Service pro Windows Phone zařízení
  • push.wns – Windows Notification Service pro Windows 8 aplikace
  • push.gcm - Google Cloud Messaging pro Android aplikace

Ilustrujme si odeslání notifikace na Windows Phone zařízení při vložení záznamu do tabulky:

function insert(item, user, request) {
request.execute({ success: function () {
request.respond();
push.mpns.sendFlipTile(item.channel,
{ title: item.text, count: item.quantity },
{ success: function (pushResponse) {
console.log("Sent push:", pushResponse);
}
});
}
});
}

Zároveň si povšimněte, že skript používá volání console.log(). Pomocí této funkce můžete logovat informace, varování a chyby ve vašem kódu, zároveň se můžete dozvědět o neošetřených výjimkách ve vaší aplikaci. Výpis celého diagnostického logu naleznete na portálu pro správu:

image

Můžete si zde zobrazit detailní informace o události. Praktické je, že se můžete snadno jedním klikem dostat na definici skriptu, který je za zalogování záznamu zodpovědný.

Typický postup implementace

V realistické implementaci je třeba myslet na více aspektů. Dobrý návod na realističtější implementaci najdete zde (pro další platformy snadno přepněte). Obecný postup by měl být následující:

  1. Každé zařízení si nějakým způsobem vygeneruje svůj identifikátor platný po celou dobu existence zařízení. Může to být např. Guid uložený do lokálního úložiště zařízení
  2. Na serveru se vytvoří tabulka (např. Channel) pro uložení registrací jednotlivých zařízení pro push notifikace
  3. Aplikace v případě zájmu o notifikace při startu vkládá nový záznam do tabulky Channel. V něm odesílá minimálně svůj identifikátor zařízení a URL/identifikátor kanálu, který získá pomocí služeb dané mobilní platformy (například pro Windows Store je to metoda CreatePushNotificationChannelForApplicationAsync objektu PushNotificationChannelManager). Dále by měla odeslat typ svojí platformy a případně další informace (např. rozsah informací, o které má zájem).
  4. Na serveru se k těmto údajům přidá aktuální čas a jméno přihlášeného uživatele (pokud je autentizovaný). Pokud již záznam pro daný identifikátor zařízení existuje, je vhodné ho vymazat, případně aktualizovat.
  5. Při změně dat anebo v pravidelných intervalech se v serverovém skriptu rozesílají notifikace všem zainteresovaným uživatelům/zařízením v závislosti na jejich typu a dalších uložených údajích.
  6. Staré záznamy z tabulky Channel je vhodné pravidelně odmazávat.

Spouštění plánovaných úloh

Kromě spouštění skriptů bezprostředně při provádění datových operací je často třeba spouštět skripty též pravidelně. Dobrým příkladem může být skript na rozesílání notifikací s aktuální předpovědí pro aplikaci Počasí anebo třeba poměrně univerzální skript pro mazání starých záznamů z databáze. K tomuto účelu slouží pravidelně plánované úlohy, které se definují pomocí portálu:

image

Pro každou úlohu můžeme nastavit režim a případně frekvenci jejich spouštění:

image

Jako příklad si uveďme skript, který maže záznamy z tabulky Channel starší než 2 týdny:

function DeleteExpiredChannels() {
  var channels = tables.getTable('Channel');
  var cleanupDate = new Date() - (1000*60*60*24) * 14; // today-14 days
  channels.where(function(d){
    return this.lastUpdated < new Date(d);
  }, cleanupDate)
  .read({
    success: function(results) {
      if (results.length > 0) {
        results.forEach(function(result) {
          channels.del(result);
        })
        console.log(results.length + ' expired channel(s) deleted')
      }
    }
  });
}

Tímto dílem náš seriál končí. Službě Azure Mobile Services se ale budeme věnovat i nadále.

 

Michael