Vor vielen Jahren habe ich mit Silverlight und den Live Services Push Nachrichten verschickt, um Server Push zu empfangen. 2012 habe ich dann mit Windows 8 die sogenannten Windows Push Notification Services genutzt. Da das Store App Modell sich von Desktop Anwendungen wesentlich unterscheidet, sind auch die nötigen Szenarien unterschiedlich.
Nachrichten können von einem Service verschickt werden an
- die Kachel
- als Toast Nachricht
- ein App aktivieren
- in eine laufende App Daten schicken
Gerade letzter Fall soll gelöst werden. Die Universal Windows Platform App soll sogenannte RAW Notifications empfangen.
Die folgende Beschreibung ist aus Selbstversuch entstanden und ist keine Gewähr für den optimalen Weg.
Im ersten Schritt wird eine Windows Store App mit dem Microsoft App Store verknüpft. Das kann direkt aus dem Visual Studio Projekt per rechtsklick auf das Projekt erfolgen (Store- App mit Store verknüpfen)
Der öffentliche Appname lässt sich in Visual Studio oder im Portal (https://developer.microsoft.com/de-de/windows) reservieren. Am Ende muss man ohnehin das Webportal im Browser öffnen. Dies bedeutet noch keine Veröffentlichung im eigentlichen Sinne.
In Developer Portal in den Einstellungen der App findet sich rechts unten ein Bereich Pushbenachrichtigungen. Dort steht ein Link auf erste Schritte. Schon hier erkennbar sind zwei verschiedene Push Dienste, die Microsoft Push Services (MPNS) und die Windows Notification (WNS) Services. Verwendet wird hier letzterer
Nach Auswahl des Links- Live Services Site –werden das Fromular mit Daten zur App ergänzt die zur Registrierung nötig sind.
Das Secret und die App ID sind dann sozusagen der Benutzer Account der App. Am besten die Browserseite offen lassen. Für den Push benötigt man aber eine Azure App. Diese wird im Azure Portal angelegt https://portal.azure.com/ Azure App Service + hinzufügen. Allerdings muss dann die Option Push konfiguriert werden
Die Warnmeldung besagt, das ein Azure Notification Hub erstellt werden muss. Diesem Hub gibt man einen Namen den man später noch benötigt.
Der Zusatz Hub im Namen wurde gewählt um in den viele Begriffen später den Überblick zu behalten. Woher kommt’s oder wo ist es konfiguriert? Die Anzahl der Dialoge ist recht umfangreich.
Im nächsten Untermenü - Pushbenachrichtigung konfigurieren - kann aus einer Reihe von Push Diensten man auswählen wie Google, Amazon, Apple der eben WNS.
Die Sache mit den Tags ignoriert man am besten für den ersten Test. Kurz gesagt lassen sich damit Benachrichtigungsgruppen organisieren.
Es werden vorhin erwähnte Authentifizierungsdaten eingetragen bzw rüberkopiert
Woher nehmen und nicht stehlen? Hoffentlich sind die Browser Fenster noch offen, so dass man Application Secret und App ID rauskopieren kann.
Nun wird wieder nach Visual Studio gewechselt um UWP Code zu schreiben der Notifications empfangen kann. Dazu wir das Nuget Paket Microsoft.Azure.Notificationhub dem Projekt hinzugefügt
Aus den C# Beispielen zusammenkopiert. Wichtig sind der Hubname, der Endpunkt und der SharedAccessKey. Kombiniert Connection String genannt.
1: Private Async Sub InitNotificationsAsync()
2: Dim channel = Await PushNotificationChannelManager.
CreatePushNotificationChannelForApplicationAsync()
3: Dim Hub = New NotificationHub("ppedvhub1",
4: "Endpoint=sb://ppedvpush.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=b8aJdXHX/….X4dxaVDEWnbI4=")
5: Await Hub.RegisterNativeAsync(channel.Uri)
6: AddHandler channel.PushNotificationReceived,
AddressOf channel_PushNotificationReceived
7: End Sub
8:
9: Private Sub channel_PushNotificationReceived(sender As PushNotificationChannel,
args As PushNotificationReceivedEventArgs)
10:
11: End Sub
Wo kommen nun diese Daten wieder her? Im Azure Portal können alle eingerichteten Ressourcen aufgelistet werden. Der Notification Hub taucht als oranges Icon auf.
In - Verwalten – Zugriffsrichtlinien - finden sich zwei Endpunkte mit Rechten für Lesen oder Schreiben.
Die Endpunkte unterscheiden sich von den Service URIs durch den Präfix sb: Dieser Endpunkt kommt im vorigen Code Schnippsel zur Anwendung.
Die Rechte der Endpoints können natürlich auch konfiguriert werden.
Nun kann der Push getestet werden. Auch diese Funktion findet sich im Azure Portal
Es wird eine Raw Notification geschickt. Der Inhalt steht dann in den Eventargs der UWP App zur Verfügung.
Nun kommt noch eine Winforms Anwendung hinzu, die Nachrichten an per Service Bus an die Verbunden Client schicken kann.
1: NotificationHubClient hub = NotificationHubClient
2: .CreateClientFromConnectionString(
"Endpoint=sb://ppedvpush.servicebus.windows.net/;
SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=b8aJdX nbI4="
3: , "ppedvhub1");
4:
5: try
6: {
7: Notification no = new WindowsNotification("Burghausen");
8: no.Headers.Add("X-WNS-Type", @"wns/raw");
9: var result=await hub.SendNotificationAsync(no);
10: Console.WriteLine(result.State.ToString());
11: }
12: catch (System.Exception ex)
13: {
14: }
15: }
Völlig unlogisch sind nun die Parameter beim Verbindungsaufbau “Connection String” und Hub vertauscht im vergleich zum vorigen Code Beispiel. Da es sich um eine Raw Nachricht handelt, muss noch ein passender Header eingefädelt werden.
Im Erfolgsfall wird nach einem Post mit einer HTTP 201 Statusmeldung geantwortet. Per Fiddlertool kann man sich für die Fehlersuche dazwischen schalten
Eine weitere nicht leicht zu findende Möglichkeit der Analyse von ein und ausgehenden Nachrichten befindet sich nur im alten Azure Portal
Man erkennt die eingegangen Nachrichten und die versendeten auf der Zeitachse. Selbst die einzelnen Geräte (Devices) lassen sich herausfinden. Das auch über Visual Studio und dem Server Explorer. Der Screenshot stammt aus Visual Studio 2017 mit installieren Azure SDK.
Nach Rechtsklick auf den Hub erscheint per Popup Dialog auch die Möglichkeit Nachrichten zu versenden
Im zweiten Dialog kann man die Anzahl der registrierten Geräte erkennen und auch verwalten
In Summe ist es mit viel Aufwand verbunden, eine UWP Anwendung NWS Push zu aktualisieren. Eine Reihe von ID’s, Secrets und Urls. App Services, Service Bus und Notification Hub. Keine durchgängig Wizard gesteuerte UI. Als Alternative könnte man mit SignalR das gleich in wenigen Minuten umsetzen.