Tutorial: Notificações push a determinados dispositivos Android com Notification Hubs do Azure e o Google Cloud Messaging (preterido)Tutorial: Push notifications to specific Android devices using Azure Notification Hubs and Google Cloud Messaging (deprecated)

Aviso

A partir de 10 de Abril de 2018, o Google preteriu Google Cloud Messaging (GCM).As of April 10, 2018, Google has deprecated Google Cloud Messaging (GCM). O servidor do GCM e APIs de cliente foram preteridos e serão removidas assim, 29 de Maio de 2019.The GCM server and client APIs are deprecated and will be removed as soon as May 29, 2019. Para obter mais informações, consulte GCM e o FCM perguntas mais frequentes.For more information, see GCM and FCM Frequently Asked Questions.

Descrição geralOverview

Este tutorial mostra como utilizar os Hubs de Notificação do Microsoft Azure para transmitir notificações de notícias de última hora para uma aplicação Android.This tutorial shows you how to use Azure Notification Hubs to broadcast breaking news notifications to an Android app. Quando terminar, poderá registar-se para obter as categorias de notícias de última hora nas quais tem interesse e receber apenas notificações push para essas categorias.When complete, you will be able to register for breaking news categories you are interested in, and receive only push notifications for those categories. Este é um cenário com um padrão comum para muitas aplicações em que as notificações têm de ser enviadas para grupos de utilizadores que mostraram anteriormente interesse nas mesmas, por exemplo, leitor de RSS, aplicações para fãs de música, etc.This scenario is a common pattern for many apps where notifications have to be sent to groups of users that have previously declared interest in them, for example, RSS reader, apps for music fans, etc.

Os cenários de transmissão são ativados ao incluir uma ou mais etiquetas durante a criação de um registo no Hub de Notificação.Broadcast scenarios are enabled by including one or more tags when creating a registration in the notification hub. Quando as notificações são enviadas para uma etiqueta, todos os dispositivos que foram registados para a etiqueta recebem a notificação.When notifications are sent to a tag, all devices that have registered for the tag will receive the notification. Como as etiquetas são simples cadeias, não têm de ser aprovisionadas com antecedência.Because tags are simply strings, they do not have to be provisioned in advance. Para obter mais informações sobre etiquetas, consulte Encaminhamento de Hubs de Notificação e Expressões de Etiqueta.For more information about tags, see Notification Hubs Routing and Tag Expressions.

Neste tutorial, irá realizar as seguintes ações:In this tutorial, you do the following actions:

  • Adicionar a seleção de categorias à aplicação móvel.Add category selection to the mobile app.
  • Registado para notificações com etiquetas.Registered for notifications with tags.
  • Enviar notificações com etiquetas.Send tagged notifications.
  • Testar a aplicaçãoTest the app

Pré-requisitosPrerequisites

Este tutorial baseia-se a aplicação que criou no Tutorial: Enviar notificações push para dispositivos Android com Notification Hubs do Azure e o Google Cloud Messaging.This tutorial builds on the app you created in Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging. Antes de iniciar este tutorial, conclua o Tutorial: Enviar notificações push para dispositivos Android com Notification Hubs do Azure e o Google Cloud Messaging.Before starting this tutorial, complete the Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging.

Adicionar a seleção de categorias à aplicaçãoAdd category selection to the app

O primeiro passo consiste em adicionar os elementos de IU à sua atividade principal existente, para permitir que o utilizador selecione categorias a registar.The first step is to add the UI elements to your existing main activity that enable the user to select categories to register. As categorias selecionadas pelo utilizador são armazenadas no dispositivo.The categories selected by a user are stored on the device. Quando a aplicação é iniciada, é criado o registo do dispositivo no seu Hub de Notificação com as categorias selecionadas como etiquetas.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Abra o res/layout/activity_main.xml filee substitua o conteúdo pelo seguinte:Open the res/layout/activity_main.xml file, and replace the content with the following:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.breakingnews.MainActivity"
        android:orientation="vertical">
    
            <CheckBox
                android:id="@+id/worldBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_world" />
            <CheckBox
                android:id="@+id/politicsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_politics" />
            <CheckBox
                android:id="@+id/businessBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_business" />
            <CheckBox
                android:id="@+id/technologyBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_technology" />
            <CheckBox
                android:id="@+id/scienceBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_science" />
            <CheckBox
                android:id="@+id/sportsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_sports" />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="subscribe"
                android:text="@string/button_subscribe" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:id="@+id/text_hello"
            />
    </LinearLayout>
    
  2. Abra o res/values/strings.xml de ficheiros e adicione as seguintes linhas:Open the res/values/strings.xml file and add the following lines:

    <string name="button_subscribe">Subscribe</string>
    <string name="label_world">World</string>
    <string name="label_politics">Politics</string>
    <string name="label_business">Business</string>
    <string name="label_technology">Technology</string>
    <string name="label_science">Science</string>
    <string name="label_sports">Sports</string>
    

    Sua main_activity.xml layout gráfico deve ser semelhante na imagem seguinte:Your main_activity.xml graphical layout should look like in the following image:

  3. Criar uma classe Notifications no mesmo pacote como sua MainActivity classe.Create a class Notifications in the same package as your MainActivity class.

    import java.util.HashSet;
    import java.util.Set;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    import android.view.View;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private GoogleCloudMessaging gcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
    
        public Notifications(Context context, String senderId, String hubName,
                                String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            gcm = GoogleCloudMessaging.getInstance(context);
            hub = new NotificationHub(hubName, listenConnectionString, context);
        }
    
        public void storeCategoriesAndSubscribe(Set<String> categories)
        {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            settings.edit().putStringSet("categories", categories).commit();
            subscribeToCategories(categories);
        }
    
        public Set<String> retrieveCategories() {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            return settings.getStringSet("categories", new HashSet<String>());
        }
    
        public void subscribeToCategories(final Set<String> categories) {
            new AsyncTask<Object, Object, Object>() {
                @Override
                protected Object doInBackground(Object... params) {
                    try {
                        String regid = gcm.register(senderId);
    
                        String templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(regid,"simpleGCMTemplate", templateBodyGCM,
                            categories.toArray(new String[categories.size()]));
                    } catch (Exception e) {
                        Log.e("MainActivity", "Failed to register - " + e.getMessage());
                        return e;
                    }
                    return null;
                }
    
                protected void onPostExecute(Object result) {
                    String message = "Subscribed for categories: "
                            + categories.toString();
                    Toast.makeText(context, message,
                            Toast.LENGTH_LONG).show();
                }
            }.execute(null, null, null);
        }
    
    }
    

    Esta classe utiliza o armazenamento local para armazenar as categorias de notícias que este dispositivo tem de receber.This class uses the local storage to store the categories of news that this device has to receive. Contém também métodos para se registar nestas categorias.It also contains methods to register for these categories.

  4. No seu MainActivity classe remover os campos particulares para NotificationHub e GoogleCloudMessaging, e adicione um campo para Notifications:In your MainActivity class remove your private fields for NotificationHub and GoogleCloudMessaging, and add a field for Notifications:

    // private GoogleCloudMessaging gcm;
    // private NotificationHub hub;
    private Notifications notifications;
    
  5. Em seguida, na onCreate método, remover a inicialização do hub campo e o registerWithNotificationHubs método.Then, in the onCreate method, remove the initialization of the hub field and the registerWithNotificationHubs method. Em seguida, adicione as seguintes linhas, inicializar uma instância do Notifications classe.Then add the following lines, which initialize an instance of the Notifications class.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainActivity = this;
    
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId,
                MyHandler.class);
    
        notifications = new Notifications(this, NotificationSettings.SenderId, NotificationSettings.HubName, NotificationSettings.HubListenConnectionString);
    
        notifications.subscribeToCategories(notifications.retrieveCategories());
    }
    

    Confirme se o nome do hub e a cadeia de ligação estão definidos corretamente na classe NotificationSettings.Confirm that the hub name and the connection string are set properly in the NotificationSettings class.

    Nota

    Como as credenciais que são distribuídas com uma aplicação cliente não são geralmente seguras, só deve distribuir a chave de acesso de escuta com a sua aplicação cliente.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. O acesso de escuta permite que a sua aplicação seja registada para receber notificações, mas não é possível modificar os registos existentes nem enviar notificações.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. A chave de acesso total é utilizada num serviço back-end protegido para enviar notificações e alterar registos existentes.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  6. Em seguida, adicione as seguintes importações:Then, add the following imports:

    import android.widget.CheckBox;
    import java.util.HashSet;
    import java.util.Set;
    
  7. Adicione o seguinte método subscribe para gerir o evento de clique do botão Subscrever:Add the following subscribe method to handle the subscribe button click event:

    public void subscribe(View sender) {
        final Set<String> categories = new HashSet<String>();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        if (world.isChecked())
            categories.add("world");
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        if (politics.isChecked())
            categories.add("politics");
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        if (business.isChecked())
            categories.add("business");
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        if (technology.isChecked())
            categories.add("technology");
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        if (science.isChecked())
            categories.add("science");
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        if (sports.isChecked())
            categories.add("sports");
    
        notifications.storeCategoriesAndSubscribe(categories);
    }
    

    Este método cria uma lista de categorias e utiliza o Notifications etiquetas de classe para armazenar a lista no armazenamento local e registe-se de que o correspondente com o seu hub de notificação.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Quando as categorias são alteradas, o registo é recriado com as novas categorias.When categories are changed, the registration is recreated with the new categories.

A sua aplicação pode agora armazenar um conjunto de categorias no armazenamento local do dispositivo e ficar registada no Hub de Notificação sempre que o utilizador alterar a seleção das categorias.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Registar-se para receber notificaçõesRegister for notifications

Estes passos são registados no Hub de Notificação durante o arranque com as categorias que foram armazenadas no armazenamento local.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Nota

Como o registrationId atribuído pelo Google Cloud Messaging (GCM) pode mudar em qualquer altura, deve registar-se para receber notificações frequentemente para evitar falhas de notificação.Because the registrationId assigned by Google Cloud Messaging (GCM) can change at any time, you should register for notifications frequently to avoid notification failures. Este exemplo é registado para notificação sempre que a aplicação é iniciada.This example registers for notification every time that the app starts. Relativamente às aplicações executadas com frequência, ou seja, mais do que uma vez por dia, pode provavelmente ignorar o registo para poupar a largura de banda, caso tenha passado menos de um dia desde o registo anterior.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. Adicione o seguinte código no final da onCreate método no MainActivity classe:Add the following code at the end of the onCreate method in the MainActivity class:

    notifications.subscribeToCategories(notifications.retrieveCategories());
    

    Este código garante que, sempre que a aplicação é iniciada, as categorias são obtidas a partir do armazenamento local e é pedido o registo destas categorias.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. Em seguida, atualize o método onStart() da classe MainActivity da seguinte forma:Then update the onStart() method of the MainActivity class as follows:

    @Override
    protected void onStart() {
    
        super.onStart();
        isVisible = true;
    
        Set<String> categories = notifications.retrieveCategories();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        world.setChecked(categories.contains("world"));
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        politics.setChecked(categories.contains("politics"));
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        business.setChecked(categories.contains("business"));
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        technology.setChecked(categories.contains("technology"));
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        science.setChecked(categories.contains("science"));
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        sports.setChecked(categories.contains("sports"));
    }
    

    Este código atualiza a atividade principal com base no estado das categorias guardadas anteriormente.This code updates the main activity based on the status of previously saved categories.

A aplicação está agora completa e pode armazenar um conjunto de categorias no armazenamento local do dispositivo utilizado para ficar registada no Hub de Notificação sempre que o utilizador alterar a seleção das categorias.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Em seguida, defina um back-end apto a enviar notificações de categoria para esta aplicação.Next, define a backend that can send category notifications to this app.

Enviar notificações com etiquetasSend tagged notifications

Nesta secção, irá enviar notícias de última hora como notificações de modelo etiquetadas a partir da aplicação de consola .NET.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. No Visual Studio, crie um novo elemento Visual C# aplicação de consola: um.In Visual Studio, create a new Visual C# console application: a. No menu, selecione arquivo > New > projeto.On the menu, select File > New > Project. b.b. Expanda Visual C# e selecione ambiente de trabalho do Windows.Expand Visual C#, and select Windows Desktop. c.c. Selecione aplicação de consola (.NET Framework) na lista de modelos.Select Console App (.NET Framework) in the list of templates. d.d. Introduza um nome para a aplicação.Enter a name for the app. e.e. Selecione um pasta para a aplicação.Select a folder for the app. f.f. Selecione OK para criar o projeto.Select OK to create the project.

  2. No menu principal do Visual Studio, selecione ferramentas > Gestor de pacotes NuGet > Package Manager Console e, em seguida, na janela da consola, Introduza a seguinte cadeia:On the Visual Studio main menu, select Tools > NuGet Package Manager > Package Manager Console and then, in the console window, enter the following string:

    Install-Package Microsoft.Azure.NotificationHubs
    
  3. Prima Enter.Select Enter.
    Esta ação adiciona uma referência ao SDK dos Hubs de Notificação do Azure mediante a utilização do Pacote NuGet Microsoft.Azure.Notification Hubs.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Abra o ficheiro Program.cs e adicione a seguinte instrução using:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Na classe Program, adicione o seguinte método ou substitua-o se já existir:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Este código envia uma notificação de modelo para cada uma das seis etiquetas na matriz de cadeias.This code sends a template notification for each of the six tags in the string array. A utilização de etiquetas assegura que os dispositivos recebem notificações apenas para as categorias registadas.The use of tags ensures that devices receive notifications only for the registered categories.

  6. No código anterior, substitua os marcadores de posição <hub name> e <connection string with full access> pelo nome do seu hub de notificação e pela cadeia de ligação para DefaultFullSharedAccessSignature do dashboard do seu hub de notificação.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. No método Principal, adicione as linhas seguintes:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Crie a aplicação de consola.Build the console app.

Testar a aplicaçãoTest the app

  1. No Android Studio, execute a aplicação no seu dispositivo Android ou emulador.In Android Studio, run the app on your Android device or emulator. A IU da aplicação fornece um conjunto de botões de alternar que lhe permite selecionar as categorias que pretende subscrever.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Ative um ou mais seletores de categorias e, em seguida, clique em Subscrever.Enable one or more categories toggles, then click Subscribe. A aplicação converte as categorias selecionadas em etiquetas e pede um novo registo do dispositivo para as etiquetas selecionadas do Hub de Notificação.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. As categorias registadas são devolvidas e apresentadas numa notificação de alerta.The registered categories are returned and displayed in a toast notification.

    Subscrever categorias

  3. Execute a aplicação de consola .NET, que envia notificações para cada categoria.Run the .NET console app, which sends notifications for each category. As notificações das categorias selecionadas são apresentadas como notificações de alerta.Notifications for the selected categories appear as toast notifications.

    Notificações de notícias de tecnologia

Passos SeguintesNext steps

Neste tutorial, enviou notificações de transmissões para dispositivos Android específicos que foram registados para as categorias.In this tutorial, you sent broadcast notifications to specific Android devices that have registered for the categories. Para saber como enviar notificações push para utilizadores específicos, avance para o seguinte tutorial:To learn how to push notifications to specific users, advance to the following tutorial: