Tutorial: Senden von Pushbenachrichtigungen an bestimmte Android-Geräte mit Azure Notification Hubs und Google Cloud Messaging (veraltet)Tutorial: Push notifications to specific Android devices using Azure Notification Hubs and Google Cloud Messaging (deprecated)

Warnung

Seit dem 10. April 2018 wird Google Cloud Messaging (GCM) von Google nicht mehr unterstützt.As of April 10, 2018, Google has deprecated Google Cloud Messaging (GCM). Der GCM-Server und die Client-APIs sind veraltet und werden am 29. Mai 2019 entfernt.The GCM server and client APIs are deprecated and will be removed as soon as May 29, 2019. Weitere Informationen finden Sie unter GCM and FCM Frequently Asked Questions (Häufig gestellte Fragen zu GCM und FCM).For more information, see GCM and FCM Frequently Asked Questions.

ÜbersichtOverview

Dieses Tutorial zeigt, wie Sie mit Azure Notification Hubs Benachrichtigungen zu aktuellen Nachrichten an eine Android-App senden können.This tutorial shows you how to use Azure Notification Hubs to broadcast breaking news notifications to an Android app. Sie werden anschließend in der Lage sein, sich für Kategorien aktueller Nachrichten zu registrieren, die Sie interessieren, und nur Pushbenachrichtigungen für diese Kategorien zu empfangen.When complete, you will be able to register for breaking news categories you are interested in, and receive only push notifications for those categories. Dieses Szenario ist ein häufiges Muster für viele Apps, bei denen Benachrichtigungen an Benutzergruppen gesendet werden müssen, die zuvor Interesse daran bekundet haben, zum Beispiel RSS-Feeds, Apps für Musikfans usw.This scenario is a common pattern for many apps where notifications have to be sent to groups of users that have previously declared interest in them, for example, RSS reader, apps for music fans, etc.

Übertragungsszenarien werden durch das Einfügen von einem oder mehreren Tags möglich, wenn eine Registrierung im Notification Hub erstellt wird.Broadcast scenarios are enabled by including one or more tags when creating a registration in the notification hub. Wenn Benachrichtigungen an ein Tag gesendet werden, erhalten alle Geräte, die für das Tag registriert wurden, diese Benachrichtigung.When notifications are sent to a tag, all devices that have registered for the tag will receive the notification. Da es sich bei Tags um Zeichenfolgen handelt, müssen diese nicht im Voraus bereitgestellt werden.Because tags are simply strings, they do not have to be provisioned in advance. Weitere Informationen zu Tags finden Sie unter Notification Hubs – Weiterleitung und Tagausdrücke.For more information about tags, see Notification Hubs Routing and Tag Expressions.

In diesem Tutorial führen Sie die folgenden Aktionen aus:In this tutorial, you do the following actions:

  • Hinzufügen der Kategorieauswahl zur mobilen AppAdd category selection to the mobile app.
  • Registrieren für Benachrichtigungen mit TagsRegistered for notifications with tags.
  • Senden von Benachrichtigungen mit TagsSend tagged notifications.
  • Testen der AppTest the app

VoraussetzungenPrerequisites

Dieses Tutorial baut auf der App auf, die Sie in Tutorial: Senden von Pushbenachrichtigungen an Android-Geräte mit Azure Notification Hubs und Google Cloud Messaging erstellt haben.This tutorial builds on the app you created in Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging. Absolvieren Sie daher das Tutorial: Senden von Pushbenachrichtigungen an Android-Geräte mit Azure Notification Hubs und Google Cloud Messaging, bevor Sie mit diesem Tutorial beginnen.Before starting this tutorial, complete the Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging.

Hinzufügen der Kategorieauswahl zur AppAdd category selection to the app

Der erste Schritt besteht daraus, Benutzeroberflächenelemente zur vorhandenen Hauptaktivität hinzuzufügen, welche dem Benutzer die Auswahl der Kategorien für die Registrierung ermöglichen.The first step is to add the UI elements to your existing main activity that enable the user to select categories to register. Die durch den Benutzer ausgewählten Kategorien werden auf dem Gerät gespeichert.The categories selected by a user are stored on the device. Wenn die App gestartet wird, wird eine Geräteregistrierung in Ihrem Notification Hub mit den ausgewählten Kategorien als Tags erstellt.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Öffnen Sie die Datei res/layout/activity_main.xml file, und ersetzen Sie den Inhalt durch Folgendes:Open the res/layout/activity_main.xml file, and replace the content with the following:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.breakingnews.MainActivity"
        android:orientation="vertical">
    
            <CheckBox
                android:id="@+id/worldBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_world" />
            <CheckBox
                android:id="@+id/politicsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_politics" />
            <CheckBox
                android:id="@+id/businessBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_business" />
            <CheckBox
                android:id="@+id/technologyBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_technology" />
            <CheckBox
                android:id="@+id/scienceBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_science" />
            <CheckBox
                android:id="@+id/sportsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_sports" />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="subscribe"
                android:text="@string/button_subscribe" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:id="@+id/text_hello"
            />
    </LinearLayout>
    
  2. Öffnen Sie die Datei res/values/strings.xml, und fügen Sie die folgenden Zeilen hinzu:Open the res/values/strings.xml file and add the following lines:

    <string name="button_subscribe">Subscribe</string>
    <string name="label_world">World</string>
    <string name="label_politics">Politics</string>
    <string name="label_business">Business</string>
    <string name="label_technology">Technology</string>
    <string name="label_science">Science</string>
    <string name="label_sports">Sports</string>
    

    Das grafische Layout von main_activity.xml sollte wie folgt aussehen:Your main_activity.xml graphical layout should look like in the following image:

  3. Erstellen Sie in dem Paket, in dem sich auch die Klasse MainActivity befindet, eine Klasse vom Typ Notifications.Create a class Notifications in the same package as your MainActivity class.

    import java.util.HashSet;
    import java.util.Set;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    import android.view.View;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private GoogleCloudMessaging gcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
    
        public Notifications(Context context, String senderId, String hubName,
                                String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            gcm = GoogleCloudMessaging.getInstance(context);
            hub = new NotificationHub(hubName, listenConnectionString, context);
        }
    
        public void storeCategoriesAndSubscribe(Set<String> categories)
        {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            settings.edit().putStringSet("categories", categories).commit();
            subscribeToCategories(categories);
        }
    
        public Set<String> retrieveCategories() {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            return settings.getStringSet("categories", new HashSet<String>());
        }
    
        public void subscribeToCategories(final Set<String> categories) {
            new AsyncTask<Object, Object, Object>() {
                @Override
                protected Object doInBackground(Object... params) {
                    try {
                        String regid = gcm.register(senderId);
    
                        String templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(regid,"simpleGCMTemplate", templateBodyGCM,
                            categories.toArray(new String[categories.size()]));
                    } catch (Exception e) {
                        Log.e("MainActivity", "Failed to register - " + e.getMessage());
                        return e;
                    }
                    return null;
                }
    
                protected void onPostExecute(Object result) {
                    String message = "Subscribed for categories: "
                            + categories.toString();
                    Toast.makeText(context, message,
                            Toast.LENGTH_LONG).show();
                }
            }.execute(null, null, null);
        }
    
    }
    

    Diese Klasse verwendet den lokalen Speicher, um Nachrichtenkategorien zu speichern, die das Gerät empfangen soll.This class uses the local storage to store the categories of news that this device has to receive. Sie enthält zudem Methoden zum Registrieren dieser Kategorien.It also contains methods to register for these categories.

  4. Entfernen Sie in der Klasse MainActivity die privaten Felder für NotificationHub und GoogleCloudMessaging, und fügen Sie ein Feld für Notifications hinzu:In your MainActivity class remove your private fields for NotificationHub and GoogleCloudMessaging, and add a field for Notifications:

    // private GoogleCloudMessaging gcm;
    // private NotificationHub hub;
    private Notifications notifications;
    
  5. Entfernen Sie anschließend in der Methode onCreate die Initialisierung des Felds hub und die Methode registerWithNotificationHubs.Then, in the onCreate method, remove the initialization of the hub field and the registerWithNotificationHubs method. Fügen Sie dann die folgenden Zeilen hinzu, um eine Instanz der Klasse Notifications zu initialisieren.Then add the following lines, which initialize an instance of the Notifications class.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainActivity = this;
    
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId,
                MyHandler.class);
    
        notifications = new Notifications(this, NotificationSettings.SenderId, NotificationSettings.HubName, NotificationSettings.HubListenConnectionString);
    
        notifications.subscribeToCategories(notifications.retrieveCategories());
    }
    

    Bestätigen Sie, dass Hubname und Verbindungszeichenfolge in der NotificationSettings-Klasse richtig festgelegt sind.Confirm that the hub name and the connection string are set properly in the NotificationSettings class.

    Hinweis

    Da Anmeldenamen, die mit einer Client-App verteilt werden, nicht sehr sicher sind, sollten Sie nur den Schlüssel für den Abhörzugriff mit Ihrer Client-App verteilen.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. Der Abhörzugriff ermöglicht der App, sich für Benachrichtigungen zu registrieren, aber es können keine vorhandenen Registrierungen geändert und keine Benachrichtigungen versendet werden.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. Der Vollzugriffsschlüssel wird in einem gesicherten Back-End-Dienst für das Versenden von Benachrichtigungen und das Ändern vorhandener Benachrichtigungen verwendet.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  6. Fügen Sie dann die folgenden Importe hinzu:Then, add the following imports:

    import android.widget.CheckBox;
    import java.util.HashSet;
    import java.util.Set;
    
  7. Fügen Sie die folgende subscribe-Methode zum Verarbeiten des Klickereignisses für die Abonnementschaltfläche hinzu:Add the following subscribe method to handle the subscribe button click event:

    public void subscribe(View sender) {
        final Set<String> categories = new HashSet<String>();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        if (world.isChecked())
            categories.add("world");
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        if (politics.isChecked())
            categories.add("politics");
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        if (business.isChecked())
            categories.add("business");
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        if (technology.isChecked())
            categories.add("technology");
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        if (science.isChecked())
            categories.add("science");
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        if (sports.isChecked())
            categories.add("sports");
    
        notifications.storeCategoriesAndSubscribe(categories);
    }
    

    Diese Methode erstellt eine Liste mit Kategorien und verwendet die Klasse Notifications, um die Liste im lokalen Speicher zu speichern und die entsprechenden Tags bei Ihrem Benachrichtigungs-Hub zu registrieren.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Wenn Kategorien geändert werden, wird die Registrierung mit neuen Kategorien neu erstellt.When categories are changed, the registration is recreated with the new categories.

Die App kann jetzt verschiedene Kategorien in einem lokalen Speicher auf dem Gerät speichern und beim Notification Hub registrieren, wenn der Benutzer die Auswahl der Kategorien ändert.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Registrieren für BenachrichtigungenRegister for notifications

Durch diese Schritte findet beim Starten eine Registrierung beim Notification Hub statt, wobei die im lokalen Speicher gespeicherten Kategorien verwendet werden.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Hinweis

Da sich die durch Google Cloud Messaging (GCM) zugeteilte Registrierungs-ID jederzeit ändern kann, sollten Sie sich regelmäßig für Benachrichtigungen registrieren, um Benachrichtigungsfehler zu vermeiden.Because the registrationId assigned by Google Cloud Messaging (GCM) can change at any time, you should register for notifications frequently to avoid notification failures. Dieses Beispiel registriert sich jedes Mal für Benachrichtigungen, wenn die App gestartet wird.This example registers for notification every time that the app starts. Für häufig ausgeführte Anwendungen (öfters als einmal täglich) können Sie die Registrierung wahrscheinlich überspringen, wenn weniger als ein Tag seit der letzten Registrierung vergangen ist, um Bandbreite einzusparen.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. Fügen Sie am Ende der Methode onCreate in der Klasse MainActivity den folgenden Code hinzu:Add the following code at the end of the onCreate method in the MainActivity class:

    notifications.subscribeToCategories(notifications.retrieveCategories());
    

    Dieser Code stellt sicher, dass die App bei jedem Start die Kategorien aus dem lokalen Speicher abruft und eine Registrierung für diese Kategorien anfordert.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. Aktualisieren Sie dann die onStart()-Methode der MainActivity-Klasse wie folgt:Then update the onStart() method of the MainActivity class as follows:

    @Override
    protected void onStart() {
    
        super.onStart();
        isVisible = true;
    
        Set<String> categories = notifications.retrieveCategories();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        world.setChecked(categories.contains("world"));
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        politics.setChecked(categories.contains("politics"));
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        business.setChecked(categories.contains("business"));
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        technology.setChecked(categories.contains("technology"));
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        science.setChecked(categories.contains("science"));
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        sports.setChecked(categories.contains("sports"));
    }
    

    Dieser Code aktualisiert die Hauptaktivität basierend auf dem Status der zuvor gespeicherten Kategorien.This code updates the main activity based on the status of previously saved categories.

Die App kann ist jetzt vollständig und kann verschiedene Kategorien in einem lokalen Speicher auf dem Gerät speichern und beim Notification Hub registrieren, wenn der Benutzer die Auswahl der Kategorien ändert.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Definieren Sie als Nächstes ein Back-End, das Kategoriebenachrichtigungen an diese App senden kann.Next, define a backend that can send category notifications to this app.

Senden von Benachrichtigungen mit TagsSend tagged notifications

In diesem Abschnitt senden Sie Neuigkeiten als Vorlagenbenachrichtigungen mit Tags über eine .NET-Konsolen-App.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. Erstellen Sie in Visual Studio eine neue Visual C#-Konsolenanwendung: a.In Visual Studio, create a new Visual C# console application: a. Wählen Sie im Menü die Optionen Datei > Neu > Projekt aus.On the menu, select File > New > Project. b.b. Erweitern Sie Visual C# , und wählen Sie Windows-Desktop aus.Expand Visual C#, and select Windows Desktop. c.c. Wählen Sie in der Liste der Vorlagen Konsolen-App (.NET Framework) aus.Select Console App (.NET Framework) in the list of templates. d.d. Geben Sie einen Namen für die App ein.Enter a name for the app. e.e. Wählen Sie einen Ordner für die App aus.Select a folder for the app. f.f. Wählen Sie OK aus, um das Projekt zu erstellen.Select OK to create the project.

  2. Wählen Sie im Hauptmenü von Visual Studio die Optionen Extras > NuGet-Paket-Manager > Paket-Manager-Konsole aus, und geben Sie im Konsolenfenster die folgende Zeichenfolge ein:On the Visual Studio main menu, select Tools > NuGet Package Manager > Package Manager Console and then, in the console window, enter the following string:

    Install-Package Microsoft.Azure.NotificationHubs
    
  3. Drücken Sie die EINGABETASTE.Select Enter.
    Dadurch wird mithilfe des Microsoft.Azure.NotificationHubs-NuGet-Pakets ein Verweis auf das Azure Notification Hubs-SDK hinzugefügt.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Öffnen Sie die Datei „Program.cs“, und fügen Sie die folgende using-Anweisung hinzu:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Fügen Sie in der Program -Klasse die folgende Methode hinzu, oder ersetzen Sie sie, falls sie bereits vorhanden ist:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Dieser Code sendet eine Vorlagenbenachrichtigung für jedes der sechs Tags im Zeichenfolgenarray.This code sends a template notification for each of the six tags in the string array. Durch die Verwendung von Tags wird sichergestellt, dass Geräte nur Benachrichtigungen für die registrierten Kategorien erhalten.The use of tags ensures that devices receive notifications only for the registered categories.

  6. Ersetzen Sie im obigen Code die Platzhalter <hub name> und <connection string with full access> durch den Namen Ihres Notification Hubs und die Verbindungszeichenfolge für DefaultFullSharedAccessSignature aus dem Dashboard für Ihren Notification Hub.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. Fügen Sie in der Main-Methode die folgenden Zeilen hinzu:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Erstellen Sie die Konsolenanwendung.Build the console app.

Testen der AppTest the app

  1. Führen Sie die App in Android Studio auf Ihrem Android-Gerät oder in einem Emulator aus.In Android Studio, run the app on your Android device or emulator. Die Benutzeroberfläche der App bietet verschiedene Umschaltmöglichkeiten, mit denen Sie die Kategorien auswählen können, die Sie abonnieren möchten.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Aktivieren Sie eine oder mehrere Kategorien, und klicken Sie dann auf Subscribe.Enable one or more categories toggles, then click Subscribe. Die App konvertiert die ausgewählten Kategorien in Tags, und fordert eine neue Geräteregistrierung für die ausgewählten Tags vom Notification Hub an.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. Die registrierten Kategorien werden zurückgegeben und in einer Popupbenachrichtigung angezeigt.The registered categories are returned and displayed in a toast notification.

    Abonnieren von Kategorien

  3. Führen Sie die .NET-Konsolen-App aus, die Benachrichtigungen für jede Kategorie sendet.Run the .NET console app, which sends notifications for each category. Die Benachrichtigungen für die ausgewählten Kategorien werden als Popupbenachrichtigungen angezeigt.Notifications for the selected categories appear as toast notifications.

    Benachrichtigungen zu Technologienews

Nächste SchritteNext steps

In diesem Tutorial senden Sie Broadcastbenachrichtigungen an bestimmte Android-Geräte, die für die entsprechenden Kategorien registriert wurden.In this tutorial, you sent broadcast notifications to specific Android devices that have registered for the categories. Um zu erfahren, wie Sie Pushbenachrichtigungen an bestimmte Benutzer senden, fahren Sie mit dem folgenden Tutorial fort:To learn how to push notifications to specific users, advance to the following tutorial: