Kom igång med Notification Hubs genom att använda Baidu

Baidu Cloud Push är en kinesisk molntjänst som du kan använda för att skicka push-meddelanden till mobila enheter.

Eftersom Google Play och FCM (Firebase Cloud Messaging) inte är tillgängliga i Kina, är det nödvändigt att använda andra appbutiker och push-tjänster. Baidu är en av dem och den som för tillfället används av Notification Hub.

Förutsättningar

För den här kursen behöver du:

Kommentar

Du måste ha ett aktivt Azure-konto för att slutföra den här självstudiekursen. Om du inte har något konto kan skapa du ett kostnadsfritt utvärderingskonto på bara några minuter. Mer information finns i Kostnadsfri utvärderingsversion av Azure.

Kom igång genom att göra följande:

  1. Skapa ett Baidu-konto.
  2. Skapa ett Baidu-moln push-projekt och anteckna API-nyckeln och den hemliga nyckeln.

Konfigurera en ny meddelandehubb

  1. Logga in på Azure-portalen.

  2. Välj Alla tjänster på den vänstra menyn. A screenshot showing select All Services for an existing namespace.

  3. Skriv Notification Hubs i textrutan Filtertjänster . Välj stjärnikonen bredvid tjänstnamnet för att lägga till tjänsten i avsnittet FAVORITER på den vänstra menyn. Välj Notification Hubs.

    A screenshot showing how to filter for notification hubs.

  4. På sidan Notification Hubs väljer du Skapa i verktygsfältet.

    A screenshot showing how to create a new notification hub.

  5. Gör följande på fliken Grundläggandesidan Notification Hub:

    1. I Prenumeration väljer du namnet på den Azure-prenumeration som du vill använda och väljer sedan en befintlig resursgrupp eller skapar en ny.

    2. Ange ett unikt namn för det nya namnområdet i Namnområdesinformation.

    3. Ett namnområde innehåller en eller flera meddelandehubbar, så skriv ett namn för hubben i Meddelandehubbens information.

    4. Välj ett värde i listrutan Plats . Det här värdet anger den plats där du vill skapa hubben.

      Screenshot showing notification hub details.

    5. Granska alternativet Tillgänglighetszoner. Om du väljer en region som har tillgänglighetszoner markeras kryssrutan som standard. Tillgänglighetszoner är en betald funktion, så en extra avgift läggs till på din nivå.

    6. Välj ett alternativ för haveriberedskap : Ingen, Länkad återställningsregion eller Flexibel återställningsregion. Om du väljer Länkad återställningsregion visas redundansregionen. Om du väljer Flexibel återställningsregion använder du listrutan för att välja från en lista över återställningsregioner.

      Screenshot showing availability zone details.

    7. Välj Skapa.

  6. När distributionen är klar väljer du Gå till resurs.

  6. I meddelandehubben väljer du Notification Services och sedan Baidu (Android China).

    Azure Notification Hubs - Baidu

  7. Rulla ned till avsnittet Inställningar för Baidu-meddelanden. Ange API-nyckeln och den hemliga nyckeln som du fick från Baidu-konsolen i Baidu Cloud Push-projektet. Klicka sedan på Spara.

    Azure Notification Hubs - Baidu Secrets

Din meddelandehubb har nu konfigurerats för att fungera med Baidu. Du har också anslutningssträngar för att registrera din app för att både skicka och ta emot push-meddelanden.

Anteckna DefaultListenSharedAccessSignature och DefaultFullSharedAccessSignature från fönstret åtkomstanslutningsinformation.

Anslut appen till meddelandehubben

  1. I Android Studio skapar du ett nytt Android-projekt (Nytt filprojekt >> ).

    Azure Notification Hubs - Baidu New Project

  2. Ange ett programnamn och kontrollera att Minsta nödvändiga SDK-version är inställd på API 16: Android 4.1. Kontrollera även att ditt paketnamn (应用包名) är detsamma som i Baidu Cloud Push Portal

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

  3. Klicka på Nästa och fortsätt följa anvisningarna i guiden tills fönstret skapa aktivitet visas. Se till att Tom aktivitet är markerad och välj slutligen Slutför för att skapa en ny Android-app.

    Azure Notification Hubs - Baidu Add Activity

  4. Kontrollera att mål för projektgenerering är korrekt inställt.

  5. Lägg sedan till Azure Notification Hubs-bibliotek. I Build.Gradle-filen för appen, lägger du till följande rader i avsnittet beroenden.

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

    Lägg till följande lagringsplats efter avsnittet beroenden.

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

    För att undvika listkonflikten lägger du till följande kod i projektets Manifest.xml-fil:

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

    och i <application/>-taggen:

    <application
        tools:replace="android:allowBackup,icon,theme,label">
    
  6. Hämta och packa upp Baidu Push Android SDK:n. Kopiera pushservice-x.y.z jar-filen i libs-mappen. Kopiera sedan .so-filerna i src/main/jniLibs-mapparna (skapa en ny mapp) på din Android-App.

    Azure Notification Hubs - Baidu SDK Libs

  7. I projektet libs-mapp högerklickar du på pushervice-x.y.z.jar-filen. Välj Lägg till som bibliotek för att inkludera det här biblioteket i projektet.

    Azure Notification Hubs - Baidu Add As A Library

  8. Öppna Android-projektets AndroidManifest.xml-fil och lägg till de behörigheter som krävs av Baidu SDK. Ersätt YOURPACKAGENAME med ditt paketnamn.

    <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. Lägg till följande konfiguration inom programelementet efter aktivitetselementet .MainActivity, ersätt dittprojektnamn (till exempel, 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. Lägg till en ny klass med namnet ConfigurationSettings.java till projektet.

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

    Ställ in värdet för strängen API_KEY med API_KEY från Baidu Cloud-projektet.

    Ange värdet för strängen NotificationHubName med namnet på meddelandehubben från Azure-portalen och sedan NotificationHubConnectionString med DefaultListenSharedAccessSignature från Azure-portalen.

  11. Öppna MainActivity.java och lägg till följande till onCreate-metoden:

    PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY,  API_KEY );
    
  12. Lägg till en ny klass som heter MyPushMessageReceiver.java och lägg till följande kod till den. Det är klassen som hanterar de push-meddelanden som tas emot från push-servern i 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 ");
            }
        }
    }
    

Skicka meddelanden till din app

Du kan snabbt testa att ta emot meddelanden från Azure-portalen via knappen Skicka på konfigurationsskärmen för meddelandehubben, enligt följande skärmar:

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.

Push-meddelanden skickas vanligtvis i en serverdelstjänst som Mobile Services eller ASP.NET med hjälp av ett kompatibelt bibliotek. Om ett bibliotek inte är tillgängligt för din serverdel, kan du använda REST-API:et direkt för att skicka meddelanden.

Den här guiden använder sig för enkelhetens skull av en konsolapp för att demonstrera hur du skickar ett meddelande med .NET SDK. Vi rekommenderar dock guiden använd Notification Hubs för att skicka push-meddelanden till användare som nästa steg i att skicka meddelanden från en ASP.NET-serverdel.

Här följer olika metoder för att skicka meddelanden:

(Valfritt) Skicka meddelanden från en .NET-konsolapp

I det här avsnittet kommer du att lära dig hur du skickar meddelanden med hjälp av en .NET-konsolapp.

  1. Skapa en ny Visual C#-konsolapp:

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

  2. I fönstret för Package Manager-konsolen ställer du in standardprojektet till det nya projektet för konsolappen. Sedan kör du följande kommando i konsolfönstret:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Med den här instruktionen läggs en referens till i Azure Notification Hubs SDK med hjälp av Microsoft.Azure.Notification Hubs-NuGet-paketet.

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

  3. Öppna filen Program.cs och lägg till följande med hjälp av uttryck:

    using Microsoft.Azure.NotificationHubs;
    
  4. I din Program-klass, lägger du till följande metod och ersätter DefaultFullSharedAccessSignatureSASConnectionString och NotificationHubName med de värden du har.

    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. Lägg till följande rader i Main-metoden:

    SendNotificationAsync();
    Console.ReadLine();
    

Testa din app

Om du vill testa den här appen med en riktig mobil behöver du bara ansluta den till datorn med en USB-kabel. Med den här åtgärden läses din app in på den anslutna mobilen.

Om du vill testa appen med emulatorn klickar du på Kör i verktygsfältet högst upp i Android Studio och väljer sedan din app: emulatorn startas, läser in och kör appen.

Appen hämtar userId och channelId från Baidu Push-meddelandetjänsten och registrerar sig med meddelandehubben.

Du kan använda felsökningsfliken i Azure-portalen för att skicka ett testmeddelande. Om du har byggt .NET-konsolappen för Visual Studio, behöver du bara trycka på tangenten F5 i Visual Studio för att köra appen. Appen skickar ett meddelande som visas i det övre meddelandefältet i enheten eller emulatorn.