Introdução aos Hubs de Notificação utilizando o Baidu
O Baidu Cloud Push é um serviço em nuvem chinês que pode utilizar para enviar notificações push para dispositivos móveis.
Como o Google Play e o FCM (Firebase Cloud Messaging) não estão disponíveis na China, é necessário utilizar várias lojas de aplicações e serviços push. O Baidu é um deles e o utilizado atualmente pelo Hub de Notificação.
Pré-requisitos
Este tutorial requer:
- SDK Android (partimos do princípio que utiliza o Android Studio), que pode transferir a partir do site do Android
- SDK Android do Baidu Push
Nota
Para concluir este tutorial, tem de ter uma conta ativa do Azure. Se não tiver uma conta, pode criar uma conta de avaliação gratuita em apenas alguns minutos. Para obter mais detalhes, veja Avaliação Gratuita do Azure.
Para começar, faça o seguinte:
- Crie uma conta Baidu.
- Crie um projeto de push na nuvem do Baidu e anote a chave da API e a chave secreta.
Configurar um novo Notification Hub
Inicie sessão no portal do Azure.
Selecione Todos os serviços no menu à esquerda.
Digite Hubs de Notificação na caixa de texto Serviços de filtro . Selecione o ícone de estrela ao lado do nome do serviço para adicionar o serviço à seção FAVORITOS no menu à esquerda. Selecione Hubs de Notificação.
Na página Hubs de Notificação, selecione Criar na barra de ferramentas.
Na guia Noções básicas na página Hub de Notificação, execute as seguintes etapas:
Em Subscrição, selecione o nome da subscrição do Azure que pretende utilizar e, em seguida, selecione um grupo de recursos existente ou crie um novo.
Insira um nome exclusivo para o novo namespace em Detalhes do namespace.
Um namespace contém um ou mais hubs de notificação, portanto, digite um nome para o hub em Detalhes do Hub de Notificação.
Selecione um valor na caixa de listagem suspensa Local . Esse valor especifica o local no qual você deseja criar o hub.
Reveja a opção Zonas de disponibilidade . Se você escolher uma região que tenha zonas de disponibilidade, a caixa de seleção será marcada por padrão. As Zonas de Disponibilidade são uma funcionalidade paga, pelo que é adicionada uma taxa adicional ao seu nível.
Escolha uma opção de recuperação de desastres: nenhuma, região de recuperação emparelhada ou região de recuperação flexível. Se você escolher Região de recuperação emparelhada, a região de failover será exibida. Se você selecionar Região de recuperação flexível, use a lista suspensa para escolher em uma lista de regiões de recuperação.
Selecione Criar.
Quando a implantação estiver concluída, selecione Ir para recurso.
6. No seu hub de notificação, selecione Serviços de Notificação e, em seguida, Baidu (Android China).
7. Role para baixo até a seção de configurações de notificação do Baidu. Introduza a chave de API e a chave secreta que obteve na consola do Baidu, no projeto Baidu Cloud Push. Em seguida, clique em Guardar.
O seu hub de notificação está agora configurado para funcionar com o Baidu. Dispõe também de cadeias de ligação para registar a sua aplicação para enviar e receber notificações push.
Tome nota da DefaultListenSharedAccessSignature
e da DefaultFullSharedAccessSignature
na janela de informações de ligação de acesso.
Ligar a aplicação ao Notification Hub
No Android Studio, crie um novo projeto Android (File > New > New Project).
Introduza um Nome da Aplicação e certifique-se de que a versão do SDK Mínimo Necessário está definida como API 16: Android 4.1. Certifique-se também de que o seu nome do pacote (应用包名) é igual ao do Portal Push da Cloud do Baidu
Clique em Seguinte e continue a seguir o assistente até aparecer a janela Criar Atividade. Certifique-se de que a opção Atividade Vazia está selecionada e, por fim, selecione Concluir para criar uma nova Aplicação Android.
Certifique-se de que a Compilação do Projeto de Destino está definida corretamente.
Em seguida, adicione bibliotecas dos Hubs de Notificação do Azure. No ficheiro
Build.Gradle
da aplicação, adicione as linhas seguintes na secção de dependências.implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar' implementation 'com.microsoft.azure:azure-notifications-handler:1.0.1@aar'
Adicione o repositório seguinte depois da secção de dependências.
repositories { maven { url "https://dl.bintray.com/microsoftazuremobile/SDK" } }
Para evitar o conflito List, adicione o seguinte código no arquivo do
Manifest.xml
projeto:<manifest package="YOUR.PACKAGE.NAME" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
e na etiqueta
<application/>
:<application tools:replace="android:allowBackup,icon,theme,label">
Transfira e descomprima o SDK Android do Baidu Push. Copie o ficheiro
pushservice-x.y.z jar
na pasta de bibliotecas. Em seguida, copie os ficheiros.so
nas pastassrc/main/jniLibs
(criar uma nova pasta) da sua aplicação Android.Na pasta do projeto, clique com o botão direito do
libs
pushervice-x.y.z.jar
mouse no arquivo, selecione Adicionar como biblioteca para incluir esta biblioteca no projeto.Abra o arquivo do
AndroidManifest.xml
projeto Android e adicione as permissões exigidas pelo SDK do Baidu. SubstituaYOURPACKAGENAME
pelo nome do pacote.<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" />
Adicione a seguinte configuração no elemento da aplicação depois do elemento de atividade
.MainActivity
ao substituir nomedoprojeto (por exemplo,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>
Adicione uma nova classe denominada
ConfigurationSettings.java
ao projeto.public class ConfigurationSettings { public static String API_KEY = "..."; public static String NotificationHubName = "..."; public static String NotificationHubConnectionString = "..."; }
Defina o valor da cadeia
API_KEY
com a API_KEY do projeto Baidu Cloud.Defina o valor da cadeia de caracteres com o
NotificationHubName
nome do hub de notificação no portal do Azure e, em seguida,NotificationHubConnectionString
comDefaultListenSharedAccessSignature
o portal do Azure.Abra MainActivity.java e adicione o seguinte ao método onCreate:
PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY, API_KEY );
Adicione uma nova classe denominada
MyPushMessageReceiver.java
e adicione o código seguinte. Esta é a classe que processa as notificações push que são recebidas do servidor push do 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 "); } } }
Enviar notificações para a sua aplicação
Você pode testar rapidamente o recebimento de notificações do portal do Azure por meio do botão Enviar na tela de configuração do hub de notificação, conforme mostrado nas seguintes telas:
Normalmente, as notificações push são enviadas num serviço de back-end como os Mobile Services ou ASP.NET utilizando uma biblioteca compatível. Caso não esteja disponível uma biblioteca para o back-end, pode utilizar a API REST diretamente para enviar mensagens de notificação.
Para ser mais simples, este tutorial utiliza uma aplicação de consola como demonstração sobre como enviar uma notificação com o SDK .NET. No entanto, recomendamos o tutorial Utilizar Hubs de Notificação para notificações push a utilizadores como passo seguinte para enviar notificações de um back-end do ASP.NET.
Seguem-se diferentes abordagens para enviar notificações:
- Interface REST: pode suportar notificações em qualquer plataforma de back-end utilizando a Interface REST.
- SDK .NET dos Notification Hubs do Microsoft Azure: no Gestor de Pacotes Nuget para Visual Studio, execute Install-Package Microsoft.Azure.NotificationHubs.
- Node.js: como utilizar os Hubs de Notificação do Node.js.
- Aplicações Móveis: para obter um exemplo de como enviar notificações de um back-end das Aplicações Móveis do Serviço de Aplicações do Azure integrado aos Hubs de Notificação, veja Add push notifications to your mobile app (Adicionar notificações push à sua aplicação móvel).
- Java/PHP: para obter um exemplo de como enviar notificações com as APIs REST, consulte “Como utilizar os Hubs de Notificação de Java/PHP” (Java | PHP).
(Opcional) Envie notificações a partir de uma aplicação de consola do .NET.
Nesta secção, mostramos como enviar uma notificação com uma aplicação de consola do .NET.
Crie uma nova aplicação de consola do Visual c#:
Na janela Consola do Gestor de Pacotes, defina o Projeto predefinido como o novo projeto da aplicação de consola e, em seguida, execute o seguinte comando na janela da consola:
Install-Package Microsoft.Azure.NotificationHubs
Esta instrução adiciona uma referência ao SDK dos Hubs de Notificação do Azure através do Pacote NuGet Microsoft.Azure.Notification Hubs.
Abra o ficheiro
Program.cs
e adicione a seguinte instrução:using Microsoft.Azure.NotificationHubs;
Na classe
Program
, adicione o seguinte método e substituaDefaultFullSharedAccessSignatureSASConnectionString
eNotificationHubName
pelos valores que tem.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); }
Adicione as seguintes linhas no método
Main
:SendNotificationAsync(); Console.ReadLine();
Testar a sua aplicação
Para testar esta aplicação com um telefone real, basta ligar o telefone ao computador utilizando um cabo USB. Esta ação carrega a aplicação para o telefone anexado.
Para testar esta aplicação com o emulador, na barra de ferramentas superior do Android Studio, clique em Executar e selecione a aplicação: inicia o emulador, carrega e executa a aplicação.
A aplicação obtém o userId
e o channelId
a partir do serviço de notificações do Baidu Push e regista-os no hub de notificação.
Para enviar uma notificação de teste, pode utilizar o separador de depuração do portal do Azure. Se criou a aplicação de consola do .NET para Visual Studio, basta premir a tecla F5 no Visual Studio para executar a aplicação. A aplicação envia uma notificação apresentada na área de notificação superior do dispositivo ou emulador.