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:

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:

  1. Crie uma conta Baidu.
  2. Crie um projeto de push na nuvem do Baidu e anote a chave da API e a chave secreta.

Configurar um novo Notification Hub

  1. Inicie sessão no portal do Azure.

  2. Selecione Todos os serviços no menu à esquerda. A screenshot showing select All Services for an existing namespace.

  3. Digite Hubs de Notificação na caixa de texto Serviços defiltro . 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.

    A screenshot showing how to filter for notification hubs.

  4. Na página Hubs de Notificação, selecione Criar na barra de ferramentas.

    A screenshot showing how to create a new notification hub.

  5. Na guia Noções básicas na página Hub de Notificação, execute as seguintes etapas:

    1. 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.

    2. Insira um nome exclusivo para o novo namespace em Detalhes do namespace.

    3. 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.

    4. Selecione um valor na caixa de listagem suspensa Local . Esse valor especifica o local no qual você deseja criar o hub.

      Screenshot showing notification hub details.

    5. 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.

    6. 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.

      Screenshot showing availability zone details.

    7. Selecione Criar.

  6. 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).

    Azure Notification Hubs - Baidu

  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.

    Azure Notification Hubs - Baidu Secrets

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

  1. No Android Studio, crie um novo projeto Android (File > New > New Project).

    Azure Notification Hubs - Baidu New Project

  2. 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

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

  3. 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.

    Azure Notification Hubs - Baidu Add Activity

  4. Certifique-se de que a Compilação do Projeto de Destino está definida corretamente.

  5. 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">
    
  6. 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 pastas src/main/jniLibs (criar uma nova pasta) da sua aplicação Android.

    Azure Notification Hubs - Baidu SDK Libs

  7. Na pasta do projeto, clique com o botão direito do libspushervice-x.y.z.jar mouse no arquivo, selecione Adicionar como biblioteca para incluir esta biblioteca no projeto.

    Azure Notification Hubs - Baidu Add As A Library

  8. Abra o arquivo do AndroidManifest.xml projeto Android e adicione as permissões exigidas pelo SDK do Baidu. Substitua YOURPACKAGENAME 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" />
    
    
  9. 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>
    
  10. 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 com DefaultListenSharedAccessSignature o portal do Azure.

  11. Abra MainActivity.java e adicione o seguinte ao método onCreate:

    PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY,  API_KEY );
    
  12. 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:

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.

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:

(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.

  1. Crie uma nova aplicação de consola do Visual c#:

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

  2. 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.

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

  3. Abra o ficheiro Program.cs e adicione a seguinte instrução:

    using Microsoft.Azure.NotificationHubs;
    
  4. Na classe Program, adicione o seguinte método e substitua DefaultFullSharedAccessSignatureSASConnectionString e NotificationHubName 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);
    }
    
  5. 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.