Ismerkedés a Notification Hubs Baiduval való használatával

A felhőalapú Baidu-értesítés egy kínai felhőszolgáltatás, amellyel leküldéses értesítések küldhetők mobileszközökre.

Mivel a Google Play és az FCM (Firebase Cloud Messaging) nem érhető el Kínában, más alkalmazás-áruházakat és leküldési szolgáltatásokat kell használni. Ilyen például az értesítési központ által jelenleg használt Baidu is.

Előfeltételek

Az oktatóanyaghoz a következőkre lesz szükség:

Feljegyzés

Az oktatóanyag elvégzéséhez egy aktív Azure-fiókra lesz szüksége. Ha nincs fiókja, néhány perc alatt létrehozhat egy ingyenes próbafiókot. További információ: Ingyenes Azure-próbafiók létrehozása.

Első lépésként tegye a következőket:

  1. Hozzon létre egy Baidu-fiókot.
  2. Hozzon létre egy Baidu felhőbeli leküldéses projektet, és jegyezze fel az API-kulcsot és a titkos kulcsot.

Új értesítési központ konfigurálása

  1. Jelentkezzen be az Azure Portalra.

  2. Válassza az Összes szolgáltatás lehetőséget a bal oldali menüben. A screenshot showing select All Services for an existing namespace.

  3. Írja be a Notification Hubs kifejezést a Szűrőszolgáltatások szövegmezőbe. A szolgáltatás neve melletti csillag ikonnal felveheti a szolgáltatást a kedvencek szakaszba a bal oldali menüben. Válassza a Notification Hubs lehetőséget.

    A screenshot showing how to filter for notification hubs.

  4. A Notification Hubs lapon válassza a Létrehozás lehetőséget az eszköztáron.

    A screenshot showing how to create a new notification hub.

  5. Az Értesítési központ lap Alapismeretek lapján hajtsa végre a következő lépéseket:

    1. Az Előfizetésben válassza ki a használni kívánt Azure-előfizetés nevét, majd válasszon ki egy meglévő erőforráscsoportot, vagy hozzon létre egy újat.

    2. Adja meg az új névtér egyedi nevét a Névtér részletei mezőben.

    3. A névtér egy vagy több értesítési központot tartalmaz, ezért írja be a központ nevét a Notification Hub Részletei szakaszba.

    4. Válasszon egy értéket a Hely legördülő listából. Ez az érték határozza meg azt a helyet, ahol létre szeretné hozni a központot.

      Screenshot showing notification hub details.

    5. Tekintse át a Rendelkezésre állási zónák lehetőséget. Ha olyan régiót választott, amely rendelkezésre állási zónákkal rendelkezik, a jelölőnégyzet alapértelmezés szerint be van jelölve. A rendelkezésre állási zónák fizetős funkciók, ezért további díjakat adnak hozzá a szinthez.

    6. Válasszon vészhelyreállítási lehetőséget: Nincs, Párosított helyreállítási régió vagy Rugalmas helyreállítási régió. Ha a Párosított helyreállítási régiót választja, megjelenik a feladatátvételi régió. Ha a rugalmas helyreállítási régiót választja, a legördülő listából választhat a helyreállítási régiók listájából.

      Screenshot showing availability zone details.

    7. Válassza a Létrehozás lehetőséget.

  6. Ha az üzembe helyezés befejeződött, válassza az Erőforrás megnyitása lehetőséget.

  6. Az értesítési központban válassza a Notification Services , majd a Baidu (Android China) lehetőséget.

    Azure Notification Hubs - Baidu

  7. Görgessen le a Baidu értesítési beállítások szakaszához. Adja meg a felhőalapú Baidu-értesítési projekt Baidu-konzoljában korábban beszerzett API-kulcsot és titkos kulcsot. Ezután kattintson a Mentés gombra.

    Azure Notification Hubs - Baidu Secrets

Ezzel konfigurálta az értesítési központot a Baiduval folytatott együttműködésre, és rendelkezésére állnak a kapcsolati sztringek is, amelyekkel regisztrálhatja az alkalmazást a leküldéses értesítések küldéséhez és fogadásához.

Jegyezze fel a Kapcsolati adatok elérése ablakban látható DefaultListenSharedAccessSignature és DefaultFullSharedAccessSignature kapcsolati karakterláncokat.

Az alkalmazás csatlakoztatása az értesítési központhoz

  1. Az Android Studióban hozzon létre egy új Android-projektet (File > New > New Project).

    Azure Notification Hubs - Baidu New Project

  2. Adjon meg egy alkalmazásnevet, és győződjön meg arról, hogy a Minimum Required SDK (minimális SDK-követelmény) verziószáma API 16: Android 4.1. Győződjön meg arról is, hogy a csomagnév (应用包名) megegyezik a felhőalapú Baidu-értesítési portálon szereplővel

    Azure Notification Hubs - Baidu Min SDK1Azure Notification Hubs - Baidu Min SDK2

  3. Kattintson a Next (Tovább) gombra, majd folytassa a varázsló használatát, amíg a Create Activity (Tevékenység létrehozása) ablak meg nem jelenik. Győződjön meg arról, hogy az Empty Activity (Üres tevékenység) lehetőség van kiválasztva, majd válassza a Finish (Befejezés) lehetőséget egy új Android-alkalmazás létrehozásához.

    Azure Notification Hubs - Baidu Add Activity

  4. Győződjön meg arról, hogy a Project Build Target (Projekt célbuildje) beállítás értéke megfelelő.

  5. Ezután vegyen fel Azure Notification Hubs-kódtárakat. Az alkalmazás Build.Gradle fájljában adja hozzá az alábbi sorokat a dependencies (függőségek) szakaszhoz.

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

    A dependencies (függőségek) szakasz után vegye fel az alábbi tárhelyet.

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

    A listaütközés elkerülése érdekében adja hozzá a következő kódot a projekt fájljába Manifest.xml :

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

    és az <application/> címkében:

    <application
        tools:replace="android:allowBackup,icon,theme,label">
    
  6. Töltse le és csomagolja ki a Baidu Push Android SDK-t. Másolja a pushservice-x.y.z jar fájlt a libs mappába. Ezután másolja a .so fájlokat az Android alkalmazás src/main/jniLibs (hozzon létre egy új mappát) mappáiba.

    Azure Notification Hubs - Baidu SDK Libs

  7. A projekt mappájában libs kattintson a jobb gombbal a fájlra; válassza a pushervice-x.y.z.jar Hozzáadás tárként lehetőséget a tár projektbe való felvételéhez.

    Azure Notification Hubs - Baidu Add As A Library

  8. Nyissa meg az Android-projekt fájlját AndroidManifest.xml , és adja hozzá a Baidu SDK által megkövetelt engedélyeket. Cserélje le a YOURPACKAGENAME karakterláncot saját csomagjának nevére.

    <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. Cserélje le a yourprojectname (például com.example.BaiduTest) részt a következő konfigurációra az alkalmazáselemben a .MainActivity tevékenységelem után:

    <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. Adjon hozzá egy új, ConfigurationSettings.java nevű osztályt a projekthez.

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

    Állítsa az API_KEY sztring értékét a felhőalapú Baidu-projektből lekért API_KEY értékre.

    Állítsa be a sztring értékét az NotificationHubName értesítési központ nevével az Azure Portalról , majd NotificationHubConnectionStringDefaultListenSharedAccessSignature az Azure Portalról.

  11. Nyissa meg a MainActivity.java fájlt, majd adja hozzá a következőket az onCreate metódushoz:

    PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY,  API_KEY );
    
  12. Adjon hozzá egy új, MyPushMessageReceiver.java nevű osztályt, majd adja hozzá a következő kódot. Ez az osztály kezeli a Baidu leküldési kiszolgálóról kapott leküldéses értesítéseket.

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

Értesítések küldése az alkalmazásnak

Gyorsan tesztelheti az értesítések fogadását az Azure Portalról az értesítési központ konfigurációs képernyőjének Küldés gombján keresztül, ahogyan az alábbi képernyőkön látható:

Screenshot of the Azure Portal with the Test Send option outlined in red and a red arrow pointing to it.Screenshot to the Baidu Test Send page in the Azure portal.

A leküldéses értesítések küldése általában olyan háttérszolgáltatásokon keresztül történik egy kompatibilis kódtár használatával, mint a Mobile Services vagy az ASP.NET. Ha a háttérszolgáltatáshoz nem érhető el könyvtár, az értesítési üzenetek küldéséhez használhatja közvetlenül a REST API-t.

Az egyszerűség kedvéért ez az oktatóanyag konzolalkalmazással mutatja be, hogyan küldhet értesítéseket a .NET SDK-val. Az értesítéseknek ASP.NET-háttérrendszerből történő küldéséhez azonban következő lépésként A Notification Hubs használata leküldéses értesítések küldéséhez felhasználók számára oktatóanyagot ajánljuk.

Íme néhány megközelítés az értesítések küldéséhez:

(Nem kötelező) Értesítések küldése .NET-konzolalkalmazásból.

Ebben a szakaszban az értesítések .NET-konzolalkalmazásból történő küldését mutatjuk be.

  1. Hozzon létre egy új Visual C#-konzolalkalmazást:

    Screenshot of the New Project dialog box with the Console Application Visual C# option highlighted.

  2. A Package Manager Console (Csomagkezelő konzol) ablakban az Alapértelmezett projekt értékeként adja meg az új konzolalkalmazás-projektet, majd a konzolablakban hajtsa végre az alábbi parancsot:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Ez az utasítás hozzáad egy, az Azure Notification Hubs SDK-ra mutató hivatkozást a Microsoft.Azure.Notification Hubs NuGet-csomaggal.

    Screenshot of the Package Manager Console dialog box with the Send To Notification Hub option circled in red.

  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, és cserélje le a DefaultFullSharedAccessSignatureSASConnectionString és a NotificationHubName elemeket a saját értékeire.

    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. Adja hozzá a következő sorokat a Main metódushoz:

    SendNotificationAsync();
    Console.ReadLine();
    

Az alkalmazás tesztelése

Ha egy valódi telefonon kívánja tesztelni az alkalmazást, csak csatlakoztassa a telefont a számítógéphez egy USB-kábellel. Ez a művelet feltölti az alkalmazást a csatlakoztatott telefonra.

Az alkalmazásnak az emulátorral való teszteléséhez kattintson a Run (Futtatás) elemre az Android Studio felső eszköztárán, majd válassza ki az alkalmazást: ez elindítja az emulátort, majd betölti és futtatja az alkalmazást.

Az alkalmazás lekéri a userId és a channelId azonosítókat a Baidu leküldéses értesítési szolgáltatásból, és regisztrál az értesítési központban.

Tesztértesítést az Azure Portal hibakeresési lapjáról küldhet. Ha a .NET konzolalkalmazást a Visual Studióhoz készítette, az alkalmazás futtatásához csak nyomja le az F5 billentyűt a Visual Studióban. Az alkalmazás elküld egy értesítést, amely az eszköz vagy az emulátor felső értesítési területén jelenik meg.