Introduzione ad Hub di notifica tramite Baidu
Baidu cloud push è un servizio cloud cinese che consente di inviare notifiche push ai dispositivi mobili.
Dato che Google Play e FCM (Firebase Cloud Messaging) non sono disponibili in Cina, è necessario usare app store e servizi push diversi. Uno di questi è Baidu, attualmente usato da Hub di notifica.
Prerequisiti
Questa esercitazione richiede:
- Android SDK (si presuppone che venga usato Android Studio), scaricabile dal sito Android
- Baidu Push Android SDK
Nota
Per completare l'esercitazione, è necessario disporre di un account Azure attivo. Se non si dispone di un account, è possibile creare un account di valutazione gratuita in pochi minuti. Per informazioni dettagliate, vedere Versione di valutazione gratuita di Azure.
Per iniziare, eseguire le operazioni seguenti:
- Creare un account Baidu.
- Creare un progetto push cloud Baidu e prendere nota della chiave API e della chiave privata.
Configurare un nuovo hub di notifica
Accedere al portale di Azure.
Scegliere Tutti i servizi dal menu a sinistra.
Digitare Hub di notifica nella casella di testo Filtra servizi. Selezionare l'icona a forma di stella accanto al nome del servizio per aggiungere il servizio alla sezione PREFERITI nel menu a sinistra. Selezionare Hub di notifica.
Nella pagina Hub di notifica selezionare Crea sulla barra degli strumenti.
Nella scheda Informazioni di base della pagina Hub di notifica seguire questa procedura:
In Sottoscrizione selezionare il nome della sottoscrizione di Azure che si vuole usare e quindi selezionare un gruppo di risorse esistente o crearne uno nuovo.
Immettere un nome univoco per il nuovo spazio dei nomi in Dettagli spazio dei nomi.
Uno spazio dei nomi contiene uno o più hub di notifica, quindi digitare un nome per l'hub in Dettagli hub di notifica.
Selezionare un valore nell'elenco a discesa Posizione. Questo valore specifica la posizione in cui creare l'hub.
Esaminare l'opzione zone di disponibilità. Se si sceglie un'area con zone di disponibilità, la casella di controllo è selezionata per impostazione predefinita. zone di disponibilità è una funzionalità a pagamento, quindi viene aggiunta una tariffa aggiuntiva al livello.
Scegliere un'opzione di ripristino di emergenza: Nessuna, Area di ripristino abbinata o Area di ripristino flessibile. Se si sceglie Area di ripristino abbinata, viene visualizzata l'area di failover. Se si seleziona Area di ripristino flessibile, usare l'elenco a discesa per scegliere tra un elenco di aree di ripristino.
Seleziona Crea.
Al termine della distribuzione, selezionare Vai alla risorsa.
6. Nell'hub di notifica selezionare Servizi di notifica e quindi Baidu (Android China).
7. Scorrere verso il basso fino alla sezione Impostazioni di notifica Baidu. Immettere la chiave API e la chiave privata ottenute dalla console di Baidu nel progetto push cloud Baidu. Fare clic su Save (Salva).
L'hub di notifica è ora configurato per l'uso di Baidu. Sono anche disponibili le stringhe di connessione per registrare l'app sia per l'invio che per la ricezione di notifiche push.
Prendere nota dei valori di DefaultListenSharedAccessSignature
e DefaultFullSharedAccessSignature
nella finestra Accedi a informazioni di connessione.
Connettere l'app all'hub di notifica
In Android Studio creare un nuovo progetto Android (File > Nuovo > progetto).
Immettere un nome di applicazione e assicurarsi che la versione minima richiesta dell'SDK sia impostata su API 16: Android 4.1. Verificare che il nome del pacchetto (应用包名) sia equivalente a quello nel portale push cloud di Baidu
Fare clic su Next (Avanti) e continuare la procedura guidata fino alla visualizzazione della finestra per la creazione di un'attività. Verificare che sia selezionata l'opzione Empy Activity (Attività vuota) e infine scegliere Finish (Fine) per creare una nuova applicazione Android.
Assicurarsi che l'opzione Project Build Target (Destinazione build progetto) sia impostata correttamente.
Aggiungere quindi le librerie di Hub di notifica di Azure. Nel file
Build.Gradle
relativo all'app aggiungere le righe seguenti alla sezione dependencies.implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar' implementation 'com.microsoft.azure:azure-notifications-handler:1.0.1@aar'
Aggiungere il repository seguente dopo la sezione dependencies.
repositories { maven { url "https://dl.bintray.com/microsoftazuremobile/SDK" } }
Per evitare il conflitto a livello di elenco, aggiungere il codice seguente nel file
Manifest.xml
del progetto:<manifest package="YOUR.PACKAGE.NAME" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
e nel tag
<application/>
:<application tools:replace="android:allowBackup,icon,theme,label">
Scaricare e decomprimere Baidu Push Android SDK. Copiare il file
pushservice-x.y.z jar
nella cartella libs. Copiare quindi i file.so
nelle cartellesrc/main/jniLibs
dell'applicazione Android, creando una nuova cartella.Nella cartella
libs
del progetto fare clic con il pulsante destro del mouse sul filepushervice-x.y.z.jar
e scegliere Add as Library (Aggiungi come libreria) per includere questa libreria nel progetto.Aprire il file
AndroidManifest.xml
del progetto Android e aggiungere le autorizzazioni richieste da Baidu SDK. SostituireYOURPACKAGENAME
con il nome del pacchetto.<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" />
Aggiungere la configurazione seguente nell'elemento application dopo l'elemento di attività
.MainActivity
, sostituendo yourprojectname (ad esempio,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>
Aggiungere una nuova classe denominata
ConfigurationSettings.java
al progetto.public class ConfigurationSettings { public static String API_KEY = "..."; public static String NotificationHubName = "..."; public static String NotificationHubConnectionString = "..."; }
Impostare il valore della stringa
API_KEY
con il valore API_KEY del progetto cloud Baidu.Impostare il valore della stringa con il nome dell'hub
NotificationHubName
di notifica dal portale di Azure e quindiNotificationHubConnectionString
conDefaultListenSharedAccessSignature
dal portale di Azure.Aprire MainActivity.java e aggiungere quanto segue al metodo onCreate:
PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY, API_KEY );
Aggiungere una nuova classe denominata
MyPushMessageReceiver.java
e aggiungervi il codice seguente. Questa è la classe che gestisce le notifiche push ricevute dal server push di 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 "); } } }
Invio di notifiche all'app
È possibile testare rapidamente la ricezione di notifiche dal portale di Azure tramite il pulsante Invia nella schermata di configurazione dell'hub di notifica, come illustrato nelle schermate seguenti:
Le notifiche push vengono in genere inviate in un servizio back-end come Servizi mobili o ASP.NET usando una libreria compatibile. Se non è disponibile una libreria per il back-end, è possibile usare direttamente l'API REST per inviare messaggi di notifica.
Per semplicità, in questa esercitazione viene usata un'app console per dimostrare come inviare una notifica con .NET SDK. Come passaggio successivo per l'invio di notifiche da un back-end ASP.NET, tuttavia, è consigliabile vedere l'esercitazione relativa all'uso di Hub di notifica per eseguire il push di notifiche agli utenti.
Per l'invio di notifiche sono disponibili i diversi approcci riportati di seguito.
- Interfaccia REST: è possibile supportare la notifica su qualsiasi piattaforma back-end tramite l'interfaccia REST.
- Microsoft Azure Notification Hubs .NET SDK: in Gestione pacchetti NuGet per Visual Studio eseguire Install-Package Microsoft.Azure.NotificationHubs.
- Node.js: Come usare Hub di notifica da Node.js.
- App per dispositivi mobili: per un esempio di come inviare notifiche da un back-end di app per dispositivi mobili del servizio app di Azure integrato in Hub di notifica, vedere Aggiungere notifiche push all'app iOS.
- Java/PHP: per un esempio di invio di notifiche con le API REST, vedere "Come usare Hub di notifica da Java/PHP" (Java | PHP).
(Facoltativo) Inviare notifiche da un'app console .NET
In questa sezione verrà illustrato come inviare notifiche con un'app console .NET.
Creare una nuova applicazione console in Visual C#:
Nella finestra Console di Gestione pacchetti impostare Progetto predefinito sul nuovo progetto di applicazione console, quindi eseguire il comando seguente nella finestra della console:
Install-Package Microsoft.Azure.NotificationHubs
Questa istruzione aggiunge un riferimento ad Azure Notification Hubs SDK mediante il pacchetto NuGet Microsoft.Azure.NotificationHubs.
Aprire il file
Program.cs
e aggiungere l'istruzione using seguente:using Microsoft.Azure.NotificationHubs;
Nella classe
Program
aggiungere il metodo seguente e sostituireDefaultFullSharedAccessSignatureSASConnectionString
eNotificationHubName
con i valori effettivi.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); }
Aggiungere le righe seguenti nel metodo
Main
:SendNotificationAsync(); Console.ReadLine();
Testare l'app
Per testare l'app con un telefono effettivo, collegare il telefono al computer con un cavo USB. Questa azione carica l'app nel telefono collegato.
Per testare l'app con l'emulatore, sulla barra degli strumenti superiore di Android Studio fare clic su Run (Esegui) e quindi selezionare l'app. Verrà avviato l'emulatore e verrà caricata ed eseguita l'app.
L'app recupera userId
e channelId
dal servizio di notifica push di Baidu ed esegue la registrazione nell'hub di notifica.
Per inviare una notifica di test, è possibile usare la scheda Debug del portale di Azure. Se è stata compilata l'applicazione console .NET per Visual Studio, è sufficiente premere F5 in Visual Studio per eseguirla. L'applicazione invia una notifica che viene visualizzata nell'area di notifica superiore del dispositivo o dell'emulatore.