In dem heutigen Artikel wollen wir uns damit beschäftigen, wie man aus C# heraus Push-Benachrichtigungen an Smartphones schicken kann. Dabei spielt es keine Rolle, ob es sich dabei um ein Android- oder ein Apple/iOS-Gerät handelt. Doch wann benötigt man solch eine Funktionalität überhaupt?
Ich selbst betreibe zum Beispiel ein paar Nischenseiten (Nischenseiten – was ist das?), mit denen ich über Partnerprogramme monatlich etwas dazu verdiene. Die Einnahmen-Reports muss man sich jedoch bei fast allen Partnerprogrammen proaktiv abholen. So habe ich mir einen kleinen C#-Client geschrieben, der regelmäßig die Reports runterlädt und mir bei neuen Verkäufen eine Push-Benachrichtigung verschickt. Das ist jedoch nur einer von vielen Anwendungsfällen und ich bin sicher, dass euch noch einige mehr einfallen. Doch nun zurück zum Thema.
Auswahl der Push-Plattform
Für eine möglichst schnelle und einfach Integration der Push-Funktionalität in C# nutzen wir einen Drittanbieter-Dienst, der die Infrastruktur sowie die Apps für Android und iOS bereitstellt. Mittlerweile gibt es recht viele Dienste dafür wie z.B. Pushover, Pusher, OneSignal oder Pushbullet. Mein persönlicher Favorit und somit auch Dienst für unser Beispiel ist Pushbullet, da dieser zum einen seit Jahren problemlos für mich funktioniert und zum anderen auch in der kostenfreien Variante so gut wie keine Einschränkungen hat.
Die Clients zum Push-Nachrichten empfangen findet ihr in den jeweiligen App-Stores. Selbst für Chrome existiert eine Erweiterung, sodass ihr auch am PC eure Push-Nachrichten empfangen könnt.
Nachdem ihr mindestens auf einem Gerät die passende App installiert habt (ohne dies macht der Rest des Artikels keinen Sinn), solltet ihr euch, sofern noch nicht geschehen, einen kostenfreien Account auf pushbullet.com anlegen.
Bevor es losgeht, benötigen wir noch den API-Key, den Schlüssel mit dem wir gleich die Pushbullet-API ansprechen wollen. Meldet euch hierzu auf der Pushbullet-Webseite an, klickt auf den Menüpunkt “Settings”, dann “Account” und scrollt bis zum Abschnitt “Access Tokens”. Sollte dort noch kein Token angezeigt werden, klickt auf den “Create Token”-Button. Den so erstellten Schlüssel kopiert ihr euch am besten in einen Passwort-Manager oder an einen sicheren Ort. Der nebenstehende Screenshot zeigt das ganze Vorgehen auch noch einmal.
Implementierung in C#
Kommen wir zum spannenden Teil – der Umsetzung bzw. des Codings in C#. hierzu legen wir ein neues Projekt in Visual Studio an. Ob Console, WinForms oder WPF spielt keine Rolle.
Nach dem Anlegen des Projekt fügen wir eine Bibliothek hinzu, mit der sich die Pushbullet-API einfach anprogrammieren lässt. Die Library mit dem Namen PushbulletSharp können wir per Nuget einbinden. Klickt hierzu mit der rechten Maustaste auf den Punkt Verweise (engl. References) im Projektmappen-Explorer und wählt den Menüpunkt “NuGet-Pakete verwalten”.
Im NuGet-Paketmanager sucht ihr nach “PushBulletSharp” und installiert das Paket mit einem Klick auf den kleinen Download-Pfeil. Wer mehr über die Library erfahren möchte, findet den Quellcode an dieser Stelle auf Github.
Zuerst fügen wir am Anfang unserer Code-Datei folgende using-Direktiven hinzu, um die Klassen der NuGet-Pakets nutzen zu können.
using PushbulletSharp; using PushbulletSharp.Models.Requests; using PushbulletSharp.Models.Responses;
Nun wollen wir eine simple Push-Nachricht an uns selbst schicken. Dazu müssen wir erst einmal die Pushbullet-Klasse instanziieren. Anschließend erstellen wir dann ein Objekt der Klasse “PushNoteRequest”, setzen Betreff, Empfänger und Nachricht und schicken dieses mit der “PushNote”-Funktion des Clients ab.
//Client erstellen var apiKey = "<AccessToken aus den Pushbullet Account-Einstellungen>"; PushbulletClient client = new PushbulletClient(apiKey); //Informationen über unseren Account abholen var currentUserInformation = client.CurrentUsersInformation(); //Prüfen, ob Accountinfos geladen wurden if (currentUserInformation != null) { //Anfrage erzeugen PushNoteRequest request = new PushNoteRequest { Email = currentUserInformation.Email, Title = "Überschrift in Fett", Body = "Meine erste Push-Nachricht." }; PushResponse response = client.PushNote(request); }
Der oben gezeigte Code hat nur einen Haken. Wenn wir Pushbullet auf mehreren Geräten installiert haben (z.B. auf zwei Smartphone oder auf dem Smartphone und einem PC), dann erhalten alle Geräte die Nachrichten. Aus diesem Grund kann man statt der E-Mail-Adresse des Pushbullet-Accounts auch gezielt Geräte angeben.
Hierzu benötigt man jedoch die ID (in Pushbullet-Sprache “iden”) des Geräts das man benachrichtigen möchte. Dankenswerter Weise liefert PushBulletSharp auch hierfür bereits die passende Funktion (CurrentUsersDevices) mit. Diese gibt Auskunft über alle im Account hinterlegten Geräte.
Entweder man setzt nun während der Ausführung einen Breakpoint und sucht sich die passende Geräte-ID (iden) aus der “devices”-Variable heraus oder man selektiert nach Eigenschaften. In folgendem Beispiel schicken wir die Push-Benachrichtigunen an alle Android-Geräte.
//Client erstellen var apiKey = "<AccessToken aus den Pushbullet Account-Einstellungen>"; PushbulletClient client = new PushbulletClient(apiKey); //Infos über alle im Account hinterlegten Geräte abfragen var devices = client.CurrentUsersDevices(); //Alle Android-Geräte ermitteln var targetDevices = devices.Devices.Where(o => o.Type == "Android"); foreach (var device in targetDevices) { PushNoteRequest request = new PushNoteRequest { DeviceIden = device.Iden, Title = "Für Androiden", Body = $"Nachricht für: {device.Model}" }; PushResponse response = client.PushNote(request); }
Nachdem wir nun erfolgreich Nachrichten verschicken können, schauen wir uns das nächste Thema an: Kanäle.
Sonderfall: Channels
Beide oben gezeigten Beispiele haben eines gemeinsam. Die Push-Nachrichten kommen “anonym” auf die Geräte. Man sieht zwar Titel und Inhalt der Nachricht, jedoch nicht direkt den Absender. Mit Channels lässt sich das umgehen. Ein Kanal hat einen eigenen Namen und ein Logo und kann von beliebig vielen Pushbullet-Accounts abonniert werden.
Wenn wir nun einen Kanal anlegen, diesen mit einem Icon versehen und abonnieren, erhalten wir Push-Nachrichten, bei denen man auf den ersten Blick erkennen kann, wohin sie gehören. So habe ich mir zum Beispiel einen “Dobby der Hauself”-Kanal angelegt, der mir Push-Nachrichten schickt, wenn die Waschmaschine fertig ist. Da Kanäle abonnierbar sind, könnte so zum Beispiel auch eure Frau/Freundin/WG-Mitbewohner mit ihrem Pushbullet-Account den Kanal abonnieren.
Über den “My Channel”-Bereich lässt sich ein neuer Kanal anlegen. Das Kanal-Bild lässt sich durch Klick auf das graue Icon setzen. Das Feld “Channel Name” ist der angezeigte Name des Kanals. Das Feld “#tag” muss mit einem eindeutigen Namen/Schlüssel versehen werden. Nach dem Anlegen des Kanals könnt ihr diesen mit einem Klick auf den Button in der rechten Seite abonnieren.
Kommen wir nun zum Coding. Um eine Nachricht an einen Kanal zu schicken, müssen wir unser Coding nur leicht anpassen. Anstelle des Geräte-Identifikator (Iden) oder der E-Mail-Adresse geben wir als Empfänger nun den Channel-Tag (#tag-Feld im Kanaleditor) an.
//Client erstellen var apiKey = "<AccessToken aus den Pushbullet Account-Einstellungen>"; PushbulletClient client = new PushbulletClient(apiKey); //Anfrage erzeugen PushNoteRequest request = new PushNoteRequest { ChannelTag = "<channel-tag-von-dobbys-kanal>", Title = "Dobby sagt...", Body = "...die Wäsche ist fertig!" }; PushResponse response = client.PushNote(request);
If you’re still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you’ll know which is right for you.
Between me and my husband we’ve owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I’ve settled down to one line of players. Why? Because I was happy to discover how well-designed and fun to use the underappreciated (and widely mocked) Zunes are.