Začínáme s použitím Notification Hubs pomocí Baidu
Nabídka cloudu Baidu představuje čínskou cloudovou službu, kterou můžete použít k zasílání nabízených oznámení na mobilní zařízení.
Vzhledem k nedostupnosti obchodu Google Play a služby Firebase Cloud Messaging (FCM) v Číně je nutné pro aplikace používat jiné obchody a služby nabízených oznámení. Baidu je jednou z nich a aktuálně ji používá Centrum oznámení.
Požadavky
V tomto kurzu budete potřebovat:
- Sadu Android SDK (předpokládáme, že používáte Android Studio), kterou si můžete stáhnout z webu Android
- Baidu Push Android SDK
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:
- Vytvořte účet Baidu.
- Vytvořte projekt nabízených oznámení cloudu Baidu a poznamenejte si klíč rozhraní API a tajný klíč.
Konfigurace nového centra oznámení
Přihlaste se k portálu Azure.
V nabídce vlevo vyberte Všechny služby .
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.
Na stránce Notification Hubs vyberte vytvořit na panelu nástrojů.
Na kartě Základy na stránce Centra oznámení proveďte následující kroky:
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.
Do podrobností oboru názvů zadejte jedinečný název nového oboru názvů.
Obor názvů obsahuje jedno nebo více center oznámení, proto do podrobností centra oznámení zadejte název centra.
V rozevíracím seznamu Umístění vyberte hodnotu. Tato hodnota určuje umístění, ve kterém chcete centrum vytvořit.
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.
Zvolte možnost zotavení po havárii: Žádná, Spárovaná oblast obnovení nebo Flexibilní oblast obnovení. Pokud zvolíte spárovanou oblast obnovení, zobrazí se oblast převzetí služeb při selhání. Pokud vyberete flexibilní oblast obnovení, vyberte si z rozevíracího seznamu oblastí obnovení.
Vyberte Vytvořit.
Po dokončení nasazení vyberte Přejít k prostředku.
6. V centru oznámení vyberte Notification Services a pak Baidu (Android China).
7. Posuňte se dolů do části Nastavení oznámení Baidu. Do projektu nabízených oznámení cloudu Baidu zadejte klíč rozhraní API a tajný klíč, které jste získali z konzoly Baidu. Potom klikněte na Uložit.
Vaše centrum oznámení je teď nakonfigurované pro práci s Baidu. Máte také připojovací řetězce pro registraci aplikace k odesílání i příjmu nabízených oznámení.
Poznamenejte si DefaultListenSharedAccessSignature
a DefaultFullSharedAccessSignature
z okna Informace o přístupovém připojení.
Připojte aplikaci k centru oznámení
V Android Studiu vytvořte nový projekt Androidu (Soubor > nový nový > projekt).
Zadejte Název aplikace a ověřte, že Minimální požadovaná verze sady SDK je nastavená na API 16: Android 4.1. Ověřte prosím také, že název vašeho balíčku (应用包名) je stejný jako na portálu nabízených oznámení cloudu Baidu.
Klikněte na Další a pokračujte podle pokynů průvodce, dokud se nezobrazí okno Vytvořit aktivitu. Ujistěte se, že je zvolena možnost Prázdná aktivita, a nakonec vyberte Dokončit a vytvořte novou aplikaci pro Android.
Ujistěte se, že je správně nastavená možnost Cíl sestavení projektu.
Pak přidejte knihovny Azure Notification Hubs. Do souboru
Build.Gradle
pro aplikaci přidejte následující řádky v části obsahující závislosti.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 část obsahující závislosti.
repositories { maven { url "https://dl.bintray.com/microsoftazuremobile/SDK" } }
Pokud se chcete vyhnout konfliktu seznamu, přidejte do souboru projektu
Manifest.xml
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">
A do značky
<application/>
musíme přidat:<application tools:replace="android:allowBackup,icon,theme,label">
Stáhněte a rozbalte sadu Baidu Push Android SDK. Zkopírujte soubor
pushservice-x.y.z jar
do složky libs. Pak zkopírujte soubory s příponou.so
do složeksrc/main/jniLibs
(vytvořte novou složku) vaší aplikace pro Android.Ve složce projektu
libs
klikněte pravým tlačítkem napushervice-x.y.z.jar
soubor; vyberte Přidat jako knihovnu , aby se tato knihovna přidala do projektu.Otevřete soubor projektu androidu
AndroidManifest.xml
a přidejte oprávnění vyžadovaná sadou Baidu SDK. NahraďteYOURPACKAGENAME
názvem vašeho 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" />
Přidejte následující konfiguraci v rámci elementu aplikace po elementu aktivity
.MainActivity
a nahraďte řetězec yourprojectname názvem vašeho projektu (napříkladcom.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>
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
na klíč rozhraní API z cloudového projektu Baidu.Nastavte hodnotu
NotificationHubName
řetězce s názvem vašeho centra oznámení z webu Azure Portal a pakNotificationHubConnectionString
naDefaultListenSharedAccessSignature
webu Azure Portal.Otevřete soubor MainActivity.java a přidejte následující kód do metody onCreate:
PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY, API_KEY );
Přidejte novou třídu s názvem
MyPushMessageReceiver.java
a přidejte do ní následující kód. Tato třída 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 "); } } }
Odešlete oznámení do aplikace
Příjem oznámení z webu Azure Portal můžete rychle otestovat pomocí tlačítka Odeslat na obrazovce konfigurace centra oznámení, jak je znázorněno na následujících obrazovkách:
Nabízená oznámení se většinou posílají ve službě back-end, jako je služba Mobile Services, nebo v technologii ASP.NET pomocí kompatibilní knihovny. Pokud pro váš back-end není dostupná žádná knihovna, můžete k přímému odesílání oznámení použít také rozhraní REST API.
Tento kurz pro zjednodušení používá konzolovou aplikaci jako ukázku odeslání oznámení pomocí sady .NET SDK. Nicméně jako další krok pro odesílání oznámení z back-endu ASP.NET doporučujeme absolvovat kurz Použití Notification Hubs k odesílání nabízených oznámení uživatelům.
Tady jsou různé přístupy k odesílání oznámení:
- Rozhraní REST: oznámení můžete podporovat na jakékoli backend platformě pomocí rozhraní REST.
- Microsoft Azure oznámení centra .NET SDK: Ve správci balíčků Nuget pro Visual Studio spusťte položku Install-Package Microsoft.Azure.NotificationHubs.
- Node.js:Jak používat Notification Hubs z Node.js.
- Mobile Apps: Příklad zasílání oznámení z back-endu Azure App Service Mobile Apps integrovaného se službou Notification Hubs najdete v tématu Přidání nabízených oznámení do mobilních aplikací.
- Java / PHP: Příklad odesílání oznámení pomocí rozhraní API REST najdete v části „Použití centra oznámení z Java/PHP“ (Java | PHP).
(Volitelné) Odesílání oznámení z konzoly aplikace .NET.
V této části ukážeme odesílání oznámení pomocí konzolové aplikace .NET.
Vytvořte novou konzolovou aplikaci Visual C#:
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
Tento příkaz přidá referenci na sadu SDK služby Azure Notification Hubs pomocí balíčku NuGet Microsoft.Azure.Notification Hubs.
Otevřete soubor
Program.cs
a přidejte následující příkaz using:using Microsoft.Azure.NotificationHubs;
Do třídy
Program
přidejte následující metodu a nahraďte hodnotyDefaultFullSharedAccessSignatureSASConnectionString
aNotificationHubName
vlastními hodnotami.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); }
Do metody
Main
přidejte následující řádky:SendNotificationAsync(); Console.ReadLine();
Testování aplikace
K testování této aplikace pomocí skutečného telefonu, jednoduše připojte telefon k počítači pomocí kabelu USB. Tato akce načte aplikaci do připojeného telefonu.
Pokud chcete tuto aplikaci otestovat pomocí emulátoru, na horním panelu nástrojů Android Studio klikněte na Spustit a pak vyberte vaši aplikaci: spustí se emulátor, načte se aplikace a spustí se.
Aplikace načte hodnoty userId
a channelId
ze služby nabízených oznámení Baidu a zaregistruje se v centru oznámení.
Pro odeslání testovacího oznámení můžete použít kartu ladění na webu Azure Portal. Pokud jste vytvořili konzolovou aplikaci .NET pro Visual Studio, jednoduše ke spuštění aplikace stiskněte klávesu F5 ve Visual Studiu. Aplikace odešle oznámení, které se zobrazí v horní oznamovací oblasti vašeho zařízení nebo emulátoru.