Sdílet prostřednictvím


Začínáme se službou Notification Hubs s využitím Baidu

Baidu cloud push je čínská cloudová služba, kterou můžete použít k odesílání push oznámení do mobilních zařízení.

Vzhledem k tomu, že Google Play a FCM (Firebase Cloud Messaging) nejsou v Číně dostupné, je nutné používat různé obchody s aplikacemi a nabízené služby. Baidu je jedním z nich a aktuálně používaný centrem oznámení.

Požadavky

Tento kurz vyžaduje:

Poznámka:

K dokončení tohoto kurzu potřebujete mít aktivní účet Azure. Během několika minut si můžete vytvořit bezplatný zkušební účet, pokud ho ještě nemáte. Podrobnosti najdete v článku Bezplatná zkušební verze Azure.

Začněte následujícím postupem:

  1. Vytvořte účet Baidu.
  2. Vytvořte projekt Baidu Cloud Push a poznamenejte si klíč API a tajný klíč.

Konfigurace nového centra oznámení

  1. Přihlaste se do Azure Portalu.

  2. V nabídce vlevo vyberte Všechny služby . Snímek obrazovky znázorňující výběr všech služeb pro existující obor názvů

  3. Do textového pole Filtrovat služby zadejte Notification Hubs. Výběrem ikony hvězdičky vedle názvu služby přidejte službu do oddílu OBLÍBENÉ V levé nabídce. Vyberte Notification Hubs.

    Snímek obrazovky znázorňující, jak filtrovat centra oznámení

  4. Na stránce Notification Hubs vyberte vytvořit na panelu nástrojů.

    Snímek obrazovky znázorňující, jak vytvořit nové centrum oznámení

  5. Na kartě Základy na stránce Centra oznámení proveďte následující kroky:

    1. V předplatném vyberte název předplatného Azure, které chcete použít, a pak vyberte existující skupinu prostředků nebo vytvořte novou.

    2. Enter a unique name for the new namespace in Namespace Details.

    3. Obor názvů obsahuje jedno nebo více center oznámení, proto zadejte název pro centrum v Podrobnostech centra oznámení.

    4. V rozevíracím seznamu Umístění vyberte hodnotu. Tato hodnota určuje umístění, ve kterém chcete centrum vytvořit.

      Snímek obrazovky s podrobnostmi centra oznámení

    5. Zkontrolujte možnost Zóny dostupnosti. Pokud jste vybrali oblast, která má zóny dostupnosti, je ve výchozím nastavení zaškrtnuté políčko. Zóny dostupnosti je placená funkce, takže do vaší úrovně se přidá další poplatek.

    6. Zvolte možnost zotavení po havárii: Žádná, Spárovaná oblast obnovení nebo Flexibilní oblast obnovení. If you choose Paired recovery region, the failover region is displayed. Pokud vyberete flexibilní oblast obnovení, vyberte si z rozevíracího seznamu oblastí obnovení.

      Snímek obrazovky zobrazující podrobnosti o zóně dostupnosti

    7. Vyberte Vytvořit.

  6. When the deployment is complete select Go to resource.

  6. V centru oznámení vyberte Notification Services a pak Baidu (Android China).

     Azure Notification Hubs – Baidu

  7. Posuňte se dolů do části Nastavení oznámení Baidu. V projektu cloudového push oznámení na Baidu zadejte klíč API a tajný klíč, které jste získali z konzole Baidu. Potom klikněte na Uložit.

     Azure Notification Hubs – tajné kódy Baidu

Vaše centrum oznámení je teď nakonfigurované tak, aby fungovalo s Baidu. You also have the connection strings to register your app to both send and receive push notifications.

Poznamenejte si DefaultListenSharedAccessSignature a DefaultFullSharedAccessSignature z okna s informacemi o připojení Accessu.

Připojte aplikaci k centru oznámení

  1. V Android Studiu vytvořte nový projekt Androidu (Soubor > Nový > Nový projekt).

    Azure Notification Hubs – Nový projekt Baidu

  2. Zadejte název aplikace a ujistěte se, že je minimální požadovaná verze sady SDK nastavená na rozhraní API 16: Android 4.1. Also please make sure your package name (应用包名) is the same as in the Baidu Cloud Push Portal

    Azure Notification Hubs - Baidu Min SDK1 Azure Notification Hubs - Baidu Min SDK2

  3. Klikněte na Další a pokračujte podle průvodce, dokud se nezobrazí okno Vytvořit aktivitu. Ujistěte se, že je vybraná prázdná aktivita, a nakonec vyberte Dokončit a vytvořte novou aplikaci pro Android.

    Azure Notification Hubs - Baidu Add Activity

  4. Make sure that the Project Build Target is set correctly.

  5. Pak přidejte knihovny Azure Notification Hubs. Do souboru Build.Gradle aplikace přidejte do části závislosti následující řádky.

    implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar'
    implementation 'com.microsoft.azure:azure-notifications-handler:1.0.1@aar'
    

    Přidejte následující úložiště za sekci závislostí.

    repositories {
        maven {
            url "https://dl.bintray.com/microsoftazuremobile/SDK"
        }
    }
    

    Pokud se chcete vyhnout konfliktu seznamu, přidejte do souboru Manifest.xml projektu následující kód:

    <manifest package="YOUR.PACKAGE.NAME"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    

    and in the <application/> tag:

    <application
        tools:replace="android:allowBackup,icon,theme,label">
    
  6. Stáhněte a rozbalte Baidu Push Android SDK. Zkopírujte soubor pushservice-x.y.z jar ve složce libs. Potom zkopírujte soubory .so ve složkách src/main/jniLibs (vytvořte novou složku) aplikace pro Android.

    Azure Notification Hubs - Baidu SDK Libs

  7. Ve složce libs projektu klikněte pravým tlačítkem na soubor pushervice-x.y.z.jar; vyberte Přidat jako knihovnu zahrnout tuto knihovnu do projektu.

    Azure Notification Hubs - Baidu Add As A Library

  8. Otevřete soubor AndroidManifest.xml projektu Android a přidejte oprávnění požadovaná sadou Baidu SDK. nahraďte YOURPACKAGENAME názvem balíčku.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    !! <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YOURPACKAGENAME" />
    !!<permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YOURPACKAGENAME" android:protectionLevel="normal" />
    
    
  9. Za element aktivity .MainActivity přidejte následující konfiguraci v rámci elementu aplikace a nahraďte název_projektu (například com.example.BaiduTest):

    <activity
        android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="MediaViewActivity" />
    <activity
        android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="MediaListActivity"
        android:launchMode="singleTask" />
    
    <!-- Push application definition message -->
    <receiver android:name=".MyPushMessageReceiver">
        <intent-filter>
    
            <!-- receive push message-->
            <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
            <!-- receive bind,unbind,fetch,delete.. message-->
            <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
            <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
        </intent-filter>
    </receiver>
    
    <receiver
        android:name="com.baidu.android.pushservice.PushServiceReceiver"
        android:process=":bdservice_v1">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
            <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <action android:name="android.intent.action.USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>
    
    <receiver
        android:name="com.baidu.android.pushservice.RegistrationReceiver"
        android:process=":bdservice_v1">
        <intent-filter>
            <action android:name="com.baidu.android.pushservice.action.METHOD" />
            <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REMOVED" />
    
            <data android:scheme="package" />
        </intent-filter>
    </receiver>
    
    <service
        android:name="com.baidu.android.pushservice.PushService"
        android:exported="true"
        android:process=":bdservice_v1">
        <intent-filter>
            <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
        </intent-filter>
    </service>
    
    <service
        android:name="com.baidu.android.pushservice.CommandService"
        android:exported="true" />
    
    <!-- Adapt the ContentProvider declaration required for the Android N system, and the write permissions include the application package name-->
    <provider
        android:name="com.baidu.android.pushservice.PushInfoProvider"
        android:authorities="com.baidu.push.example.bdpush"
        android:exported="true"
        android:protectionLevel="signature"
        android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER. yourprojectname  " />
    
    <!-- API Key of the Baidu application -->
    <meta-data
        android:name="api_key"
        !!   android:value="api_key" />
    </application>
    
  10. Přidejte do projektu novou třídu s názvem ConfigurationSettings.java.

    public class ConfigurationSettings {
        public static String API_KEY = "...";
        public static String NotificationHubName = "...";
        public static String NotificationHubConnectionString = "...";
    }
    

    Nastavte hodnotu řetězce API_KEY s API_KEY z projektu Baidu Cloud.

    Set the value of the NotificationHubName string with your notification hub name from the Azure portal and then NotificationHubConnectionString with DefaultListenSharedAccessSignature from the Azure portal.

  11. Otevřete MainActivity.java a do metody onCreate přidejte následující:

    PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY,  API_KEY );
    
  12. Přidejte novou třídu s názvem MyPushMessageReceiver.javaa přidejte do ní následující kód. Je to třída, která zpracovává nabízená oznámení přijatá ze serveru nabízených oznámení Baidu.

    package your.package.name;
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.text.TextUtils;
    import android.util.Log;
    
    import com.baidu.android.pushservice.PushMessageReceiver;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.List;
    
    public class MyPushMessageReceiver extends PushMessageReceiver {
    
        public static final String TAG = MyPushMessageReceiver.class
                .getSimpleName();
        public static NotificationHub hub = null;
        public static String mChannelId, mUserId;
    
        @Override
        public void onBind(Context context, int errorCode, String appid,
                        String userId, String channelId, String requestId) {
            String responseString = "onBind errorCode=" + errorCode + " appid="
                    + appid + " userId=" + userId + " channelId=" + channelId
                    + " requestId=" + requestId;
            Log.d(TAG, responseString);
    
            if (errorCode == 0) {
                // Binding successful
                Log.d(TAG, " Binding successful");
            }
            try {
                if (hub == null) {
                    hub = new NotificationHub(
                            ConfigurationSettings.NotificationHubName,
                            ConfigurationSettings.NotificationHubConnectionString,
                            context);
                    Log.i(TAG, "Notification hub initialized");
                }
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            mChannelId = channelId;
            mUserId = userId;
    
            registerWithNotificationHubs();
        }
        private void registerWithNotificationHubs() {
    
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        hub.registerBaidu(mUserId, mChannelId);
                        Log.i(TAG, "Registered with Notification Hub - '"
                                + ConfigurationSettings.NotificationHubName + "'"
                                + " with UserId - '"
                                + mUserId + "' and Channel Id - '"
                                + mChannelId + "'");
                    } catch (Exception e) {
                        Log.e(TAG, e.getMessage());
                    }
                    return null;
                }
            }.execute(null, null, null);
        }
    
        @Override
        public void onMessage(Context context, String message,
                            String customContentString) {
            String messageString = " onMessage=\"" + message
                    + "\" customContentString=" + customContentString;
            Log.d(TAG, messageString);
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (!customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        @Override
        public void onNotificationArrived(Context context, String title, String description, String customContentString) {
            String notifyString = " Notice Arrives onNotificationArrived  title=\"" + title
                    + "\" description=\"" + description + "\" customContent="
                    + customContentString;
            Log.d(TAG, notifyString);
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (!customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public void onNotificationClicked(Context context, String title, String description, String customContentString) {
            String notifyString = " onNotificationClicked title=\"" + title + "\" description=\""
                    + description + "\" customContent=" + customContentString;
            Log.d(TAG, notifyString);
            Intent intent = new Intent(context.getApplicationContext(),MainActivity.class);
            intent.putExtra("title",title);
            intent.putExtra("description",description);
            intent.putExtra("isFromNotify",true);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.getApplicationContext().startActivity(intent);
    
        }
    
        @Override
        public void onSetTags(Context context, int errorCode,
                            List<String> successTags, List<String> failTags, String requestId) {
            String responseString = "onSetTags errorCode=" + errorCode
                    + " successTags=" + successTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.d(TAG, responseString);
    
        }
    
        @Override
        public void onDelTags(Context context, int errorCode,
                            List<String> successTags, List<String> failTags, String requestId) {
            String responseString = "onDelTags errorCode=" + errorCode
                    + " successTags=" + successTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.d(TAG, responseString);
    
        }
    
        @Override
        public void onListTags(Context context, int errorCode, List<String> tags,
                            String requestId) {
            String responseString = "onListTags errorCode=" + errorCode + " tags="
                    + tags;
            Log.d(TAG, responseString);
    
        }
    
        @Override
        public void onUnbind(Context context, int errorCode, String requestId) {
            String responseString = "onUnbind errorCode=" + errorCode
                    + " requestId = " + requestId;
            Log.d(TAG, responseString);
    
            if (errorCode == 0) {
                // Unbinding is successful
                Log.d(TAG, " Unbinding is successful ");
            }
        }
    }
    

Odesílání oznámení do aplikace

Příjem oznámení můžete rychle otestovat na webu Azure Portal prostřednictvím tlačítka Odeslat na obrazovce konfigurace centra oznámení, jak je znázorněno na následujících obrazovkách:

snímek obrazovky webu Azure Portal s možností Testovací odesílání označenou červeně a červenou šipkou, která na ni ukazuje. snímek obrazovky se stránkou Odeslání testu Baidu na webu Azure Portal.

Push notifikace se obvykle odesílají v na pozadí fungující službě, například Mobile Services nebo ASP.NET, pomocí kompatibilní knihovny. Pokud není pro váš back-end k dispozici knihovna, můžete k odesílání zpráv s oznámeními použít přímo rozhraní REST API.

Pro zjednodušení tento kurz používá konzolovou aplikaci jako ukázku, jak odeslat oznámení pomocí sady .NET SDK. However, we recommend the Use Notification Hubs to push notifications to users tutorial as the next step for sending notifications from an ASP.NET backend.

Tady jsou různé přístupy k odesílání oznámení:

(Volitelné) Odesílání oznámení z konzolové aplikace .NET

V této části se zobrazí odeslání oznámení pomocí konzolové aplikace .NET.

  1. Vytvořte novou konzolovou aplikaci Visual C#:

    snímek obrazovky s dialogovým oknem Nový projekt se zvýrazněnou možností Visual C# konzolové aplikace

  2. V okně konzoly Správce balíčků nastavte Výchozí projekt na nový projekt konzolové aplikace a pak v okně konzoly spusťte následující příkaz:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Tato instrukce přidá odkaz na Azure Notification Hubs SDK tím, že použije NuGet balíček Microsoft.Azure.Notification Hubs .

    Snímek obrazovky dialogového okna Konzoly Správce balíčků s možností Odeslat do Centra oznámení zakroužkovanou červeně.

  3. Otevřete soubor Program.cs a přidejte následující příkaz using:

    using Microsoft.Azure.NotificationHubs;
    
  4. Do třídy Program přidejte následující metodu a nahraďte DefaultFullSharedAccessSignatureSASConnectionString a NotificationHubName hodnotami, které máte.

    private static async void SendNotificationAsync()
    {
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("DefaultFullSharedAccessSignatureSASConnectionString", "NotificationHubName");
        string message = "{\"title\":\"((Notification title))\",\"description\":\"Hello from Azure\"}";
        var result = await hub.SendBaiduNativeNotificationAsync(message);
    }
    
  5. Do metody Main přidejte následující řádky:

    SendNotificationAsync();
    Console.ReadLine();
    

Testování aplikace

Pokud chcete tuto aplikaci otestovat pomocí skutečného telefonu, stačí připojit telefon k počítači pomocí kabelu USB. Tato akce načte aplikaci na připojený telefon.

Pokud chcete tuto aplikaci otestovat pomocí emulátoru, klikněte na horním panelu nástrojů Android Studio na Spustita vyberte aplikaci: spustí emulátor, načte a spustí aplikaci.

Aplikace načte userId a channelId ze služby nabízených oznámení Baidu a zaregistruje se v centru oznámení.

To send a test notification, you can use the debug tab of the Azure portal. Pokud jste vytvořili konzolovou aplikaci .NET pro Visual Studio, spusťte aplikaci stisknutím klávesy F5 v sadě Visual Studio. Aplikace odešle oznámení, které se zobrazí v horní oznamovací oblasti vašeho zařízení nebo emulátoru.