Share via


Oktatóanyag: Értesítések küldése adott eszközökre a Notification Hubs és a Google Firebase Cloud Messaging használatával

Áttekintés

Fontos

2024 júniusától az FCM örökölt API-k már nem támogatottak, és megszűnnek. A leküldéses értesítési szolgáltatás megszakadásának elkerülése érdekében a lehető leghamarabb át kell telepítenie az FCM v1 protokollt .

Ez az oktatóanyag azt mutatja be, hogy hogyan továbbíthat friss híreket az Android-alkalmazásokba az Azure Notification Hubs használatával. Az oktatóanyag végére regisztrálni tud majd az Önt érdeklő hírkategóriákra, és csak az ezekre a kategóriákra vonatkozó leküldéses értesítéseket kapni. Ezt a forgatókönyvet gyakran használják olyan alkalmazásokban, ahol az értesítéseket egy adott téma iránt korábban érdeklődő felhasználók csoportjainak kell elküldeni. Ilyen lehet például egy RSS-olvasó, a zenerajongóknak készült alkalmazások stb.

A közvetítési forgatókönyveket úgy lehet engedélyezni, ha az értesítési központban a regisztráció létrehozásakor hozzáad egy vagy több címkét. Ha az értesítések küldése egy címkére történik, az adott címkére regisztrált összes eszköz megkapja az értesítést. A címkék egyszerű sztringek, nem szükséges őket előzetesen kiosztani. További információ a címkékről: Útválasztás és címkekifejezések az értesítési központokban.

Az oktatóanyag során a következő lépéseket hajtja végre:

  • Kategóriaválasztást ad a mobilalkalmazáshoz.
  • Címkékkel ellátott értesítésekhez regisztrálva.
  • Címkés értesítéseket küld.
  • Az alkalmazás tesztelése

Előfeltételek

Ez az oktatóanyag az oktatóanyagban létrehozott alkalmazásra épül: Értesítések leküldése Android-eszközökre az Azure Notification Hubs és a Firebase Cloud Messaging használatával. Az oktatóanyag megkezdése előtt végezze el az oktatóanyagot: Értesítések leküldése Android-eszközökre az Azure Notification Hubs és a Firebase Cloud Messaging használatával.

Kategóriaválasztó hozzáadása az alkalmazáshoz

Az első lépésben hozzá kell adni a felhasználói felületi elemeket a meglévő fő tevékenységhez, amelyekkel a felhasználó kiválaszthatja a regisztrálni kívánt kategóriákat. A felhasználó által kiválasztott kategóriákat az eszköz tárolja. Az alkalmazás indításakor egy eszközregisztráció jön létre az értesítési központban, amely címkeként tartalmazza a választott kategóriákat.

  1. Nyissa meg a res/layout/activity_main.xml fileelemet, és cserélje le a tartalmat a következőre:

    <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. Nyissa meg a res/values/strings.xml fájlt, és adja hozzá a következő sorokat:

    <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>
    

    A main_activity.xml grafikus elrendezésnek a következő képen láthatóhoz hasonlóan kell kinéznie:

    Képernyőkép egy emulátorról, amely megjeleníti a fő tevékenység X M L grafikus elrendezését.

  3. Hozzon létre egy osztályt Notifications ugyanabban a csomagban, mint az MainActivity osztály.

    import java.util.HashSet;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.google.android.gms.tasks.OnSuccessListener;
    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.iid.InstanceIdResult;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private FirebaseInstanceId fcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
        public static String FCM_token = "";
        private static final String TAG = "Notifications";
    
        public Notifications(Context context, String hubName, String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            fcm = FirebaseInstanceId.getInstance();
            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 {
                        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                            @Override
                            public void onSuccess(InstanceIdResult instanceIdResult) {
                                FCM_token = instanceIdResult.getToken();
                                Log.d(TAG, "FCM Registration Token: " + FCM_token);
                            }
                        });
    
                        TimeUnit.SECONDS.sleep(1);
    
                        String templateBodyFCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(FCM_token,"simpleFCMTemplate", templateBodyFCM,
                                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);
        }
    
    }
    

    Ez az osztály a helyi tárolóban tárolja a hírkategóriákat, amelyeket ennek az eszköznek meg kell kapnia. Ezenkívül olyan metódusokat is tartalmaz, amelyek az adott kategóriákra való regisztrációra szolgálnak.

  4. MainActivity Az osztályban adjon hozzá egy mezőt a következőhözNotifications:

    private Notifications notifications;
    
  5. Ezután frissítse a metódust az onCreate alábbi kódban látható módon. A Notification Hubsban regisztrálhat az Értesítések osztály subscribeToCategories metódusában.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainActivity = this;
    
        FirebaseService.createChannelAndHandleNotifications(getApplicationContext());
        notifications = new Notifications(this, NotificationSettings.HubName, NotificationSettings.HubListenConnectionString);
        notifications.subscribeToCategories(notifications.retrieveCategories());
    }
    

    Győződjön meg arról, hogy a központ neve és a kapcsolati sztring megfelelően be van állítva a NotificationSettings osztályban.

    Feljegyzés

    Mivel az ügyfélalkalmazással terjesztett hitelesítő adatok általában nem biztonságosak, csak a figyelési hozzáférés kulcsát terjessze az ügyfélalkalmazással. A figyelési hozzáférés lehetővé teszi, hogy az alkalmazás regisztráljon értesítésekre, a meglévő regisztrációkat azonban nem lehet módosítani, és értesítéseket sem lehet küldeni. A teljes körű hozzáférési kulcsot egy biztonságos háttérszolgáltatásban használja a rendszer értesítések kiküldésére és a meglévő regisztrációk módosítására.

  6. Adja hozzá a következő importálásokat:

    import android.widget.CheckBox;
    import java.util.HashSet;
    import java.util.Set;
    import android.view.View;
    
  7. Adja hozzá a következő subscribe metódust, amely a feliratkozási gombra való kattintás eseményét kezeli:

    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);
    }
    

    Ez a módszer létrehozza a kategóriák listáját, és az Notifications osztály használatával tárolja a listát a helyi tárolóban, és regisztrálja a megfelelő címkéket az értesítési központban. A kategóriák módosításakor a rendszer újra létrehozza a regisztrációt az új kategóriákkal.

Az alkalmazás most már képes egy kategóriakészlet tárolására az eszköz helyi tárterületén, és az értesítési központban is regisztrálhat, ha a felhasználó módosítja a kiválasztott kategóriákat.

Regisztráció értesítésekre

Ezek a lépések végzik az értesítési központban való regisztrációt az indításkor, a helyi tárterületen tárolt kategóriák használatával.

  1. Győződjön meg arról, hogy a következő kód a metódus végén onCreate található az MainActivity osztályban:

    notifications.subscribeToCategories(notifications.retrieveCategories());
    

    Ez a kód biztosítja, hogy az alkalmazás minden egyes indításkor lekéri a kategóriákat a helyi tárterületből, és regisztrációt kérelmez ezekre a kategóriákra vonatkozóan.

  2. Ezután frissítse a onStart() osztály MainActivity metódusát az alábbiak szerint:

    @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"));
    }
    

    Ez a kód frissíti a fő tevékenységet a korábban mentett kategóriák állapota alapján.

Az alkalmazás ezzel elkészült, és képes egy kategóriakészlet tárolására az eszköz helyi tárterületén, illetve az értesítési központban való regisztrálásra, ha a felhasználó módosítja a választott kategóriákat. A következő lépésben határozzon meg egy háttérrendszert, amely kategóriaértesítéseket küldhet ennek az alkalmazásnak.

Címkézett értesítések küldése

Ebben a szakaszban a legfrissebb híreket címkézett sablonértesítésekként fogja elküldeni egy .NET-konzolalkalmazásból.

  1. A Visual Studióban hozzon létre egy új Visual C#-konzolalkalmazást:

    1. A menüben válassza az Új>projekt fájlja>lehetőséget.
    2. Az Új projekt létrehozása területen válassza a C# konzolalkalmazását (.NET-keretrendszer) a sablonok listájában, és válassza a Tovább lehetőséget.
    3. Adja meg az alkalmazás nevét.
    4. Megoldás esetén válassza a Hozzáadás a megoldáshoz lehetőséget, majd a Létrehozás gombra kattintva hozza létre a projektet.
  2. Válassza az Eszközök>NuGet Csomagkezelő> Csomagkezelő Konzol lehetőséget, majd a konzolablakban futtassa a következő parancsot:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Ez a művelet a Microsoft.Azure.NotificationHubs csomag használatával hozzáad egy hivatkozást az Azure Notification Hubs SDK-hoz.

  3. Nyissa meg a Program.cs fájlt, és adja hozzá a következő using utasítást:

    using Microsoft.Azure.NotificationHubs;
    
  4. A Program osztályban adja hozzá a következő metódust, vagy ha már létezik, cserélje le azt a következőre:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Apple requires the apns-push-type header for all requests
        var headers = new Dictionary<string, string> {{"apns-push-type", "alert"}};
    
        // 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/FCM, 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);
        }
    }
    

    Ez a kód sablonértesítéseket küld a sztringtömb mind a hat címkéjének. A címkék használatával biztosítható, hogy az eszközök csak a regisztrált kategóriákhoz tartozó értesítéseket fogadják.

  5. A <hub name> és a <connection string with full access> helyőrzőket cserélje le a fenti kódban az értesítési központ nevére és a DefaultFullSharedAccessSignature az értesítési központ irányítópultjáról származó kapcsolati sztringjére.

  6. A metódusban Main() adja hozzá a következő sorokat:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Hozza létre a konzolalkalmazást.

Az alkalmazás tesztelése

  1. Futtassa az alkalmazást az Android-eszközön vagy emulátoron az Android Studióban. Az alkalmazás felhasználói felületén váltógombok segítségével választhatja ki, hogy mely kategóriákra szeretne feliratkozni.

  2. Engedélyezzen egy vagy több kategóriát, majd kattintson a Subscribe (Feliratkozás) gombra. Az alkalmazás címkékké alakítja át a kiválasztott kategóriákat, és új eszközregisztrációt kezdeményez az értesítési központban a kiválasztott címkékre vonatkozóan. A rendszer visszaadja, és egy bejelentési értesítésben jeleníti meg a regisztrált kategóriákat.

    Feliratkozás kategóriákra

  3. Futtassa a .NET-konzolalkalmazást, amely értesítéseket küld minden egyes kategóriáról. A kijelölt kategóriák értesítései bejelentési értesítésként jelennek meg.

    Technológiai hírekről szóló értesítések

Következő lépések

Ebben az oktatóanyagban szórásos értesítéseket küldött ki adott Android-eszközökre, amelyeket regisztráltak a kategóriákra. Ha szeretné megtudni, hogyan küldhet leküldéses értesítéseket adott felhasználóknak, lépjen tovább a következő oktatóanyagra: