Tutorial: enviar notificações por push para aplicativos Xamarin. Android usando hubs de notificaçãoTutorial: Send push notifications to Xamarin.Android apps using Notification Hubs

Visão geralOverview

Este tutorial mostra como utilizar os Notification Hubs do Azure para enviar notificações push para uma aplicação Xamarin Android.This tutorial shows you how to use Azure Notification Hubs to send push notifications to a Xamarin.Android application. Vai criar uma aplicação Xamarin.Android em branco que recebe notificações push através do Firebase Cloud Messaging (FCM).You create a blank Xamarin.Android app that receives push notifications by using Firebase Cloud Messaging (FCM). Pode utilizar o hub de notificação para difundir notificações push para todos os dispositivos a executar a sua aplicação.You use your notification hub to broadcast push notifications to all the devices running your app. O código concluído está disponível no exemplo de aplicativo NotificationHubs .The finished code is available in the NotificationHubs app sample.

Neste tutorial, siga os seguintes passos:In this tutorial, you take the following steps:

  • Criar um projeto do Firebase e ativar o Firebase Cloud MessagingCreate a Firebase project and enable Firebase Cloud Messaging
  • Criar um hub de notificaçãoCreate a notification hub
  • Criar uma aplicação Xamarin.Android e ligá-la ao hub de notificaçãoCreate a Xamarin.Android app and connect it to the notification hub
  • Enviar notificações de teste a partir do portal do AzureSend test notifications from the Azure portal

Pré-requisitosPrerequisites

Criar um projeto do Firebase e ativar o Firebase Cloud MessagingCreate a Firebase project and enable Firebase Cloud Messaging

  1. Inicie sessão na consola Firebase.Sign in to the Firebase console. Crie um novo projeto Firebase se ainda não tiver um.Create a new Firebase project if you don't already have one.

  2. Depois de criar o projeto, selecione Adicionar Firebase à aplicação Android.After you create your project, select Add Firebase to your Android app.

    Adicionar Firebase à aplicação Android

  3. Na página Adicionar firebase ao seu aplicativo Android , execute as seguintes etapas:On the Add Firebase to your Android app page, take the following steps:

    1. Para o nome do pacote do Android, insira um nome para o pacote.For the Android package name, enter a name for your package. Por exemplo: tutorials.tutoria1.xamarinfcmapp.For example: tutorials.tutoria1.xamarinfcmapp.

      Especificar o nome do pacote

    2. Selecione registrar aplicativo.Select Register app.

    3. Selecione baixar Google-Services. JSON.Select Download google-services.json. Em seguida, salve o arquivo na pasta do seu projeto e selecione Avançar.Then save the file into the folder of your project and select Next. Se você ainda não criou o projeto do Visual Studio, poderá fazer essa etapa depois de criar o projeto.If you haven't created the Visual Studio project yet, you can do this step after you create the project.

      Baixar o Google-Services. JSON

    4. Selecione Seguinte.Select Next.

    5. Selecione ignorar esta etapa.Select Skip this step.

      Ignorar a última etapa

  4. Na consola da Firebase, selecione o cog do seu projeto.In the Firebase console, select the cog for your project. Em seguida, selecione Definições do projeto.Then select Project Settings.

    Selecione Definições do projeto

  5. Se você não tiver baixado o arquivo Google-Services. JSON , poderá baixá-lo nesta página.If you haven't downloaded the google-services.json file, you can do download it on this page.

    Baixar o Google-Services. JSON na guia geral

  6. Alterne para a guia de mensagens de nuvem na parte superior.Switch to the Cloud Messaging tab at the top. Copie e salve a chave do servidor para uso posterior.Copy and save the Server key for later use. Use esse valor para configurar o Hub de notificação.You use this value to configure your notification hub.

    Copiar chave do servidor

Criar um hub de notificaçãoCreate a notification hub

  1. Inicie sessão no portal do Azure.Sign in to the Azure portal.

  2. Selecione todos os serviços no menu à esquerda e, em seguida, selecione os Hubs de notificação no Mobile secção.Select All services on the left menu, and then select Notification Hubs in the Mobile section. Selecione o ícone de estrela junto ao nome do serviço para adicionar o serviço para o Favoritos secção no menu da esquerda.Select the star icon next to the service name to add the service to the FAVORITES section on the left menu. Depois de adicionar os Hubs de notificação ao Favoritos, selecione-o no menu da esquerda.After you add Notification Hubs to FAVORITES, select it on the left menu.

    Portal do Azure – selecione os Hubs de notificação

  3. Sobre o os Hubs de notificação página, selecione Add na barra de ferramentas.On the Notification Hubs page, select Add on the toolbar.

    Os Hubs de notificação - adicionar botão de barra de ferramentas

  4. Sobre o Hub de notificação página, efetue os seguintes passos:On the Notification Hub page, do the following steps:

    1. Introduza um nome na Hub de notificação.Enter a name in Notification Hub.

    2. Introduza um nome na criar um novo namespace.Enter a name in Create a new namespace. Um espaço de nomes contém um ou mais hubs.A namespace contains one or more hubs.

    3. Selecione um valor de localização caixa de lista pendente.Select a value from the Location drop-down list box. Este valor Especifica a localização na qual pretende criar o hub.This value specifies the location in which you want to create the hub.

    4. Selecione um grupo de recursos existente no grupo de recursos, ou criar um nome para um novo grupo de recursos.Select an existing resource group in Resource Group, or create a name for a new resource group.

    5. Selecione Criar.Select Create.

      Portal do Azure – definir as propriedades do hub de notificação

  5. Selecione notificações (o ícone de sino) e, em seguida, selecione Ir para recurso.Select Notifications (the bell icon), and then select Go to resource. Pode também atualizar a lista a os Hubs de notificação página e selecione o seu hub.You can also refresh the list on the Notification Hubs page and select your hub.

    Portal do Azure - notificações -> Ir para o recurso

  6. Selecione Políticas de Acesso na lista.Select Access Policies from the list. Tenha em atenção que as duas cadeias de ligação estão disponíveis para.Note that the two connection strings are available to you. Irá precisar posteriormente para processar as notificações push.You'll need them later to handle push notifications.

    Importante

    Fazer não utilizar o DefaultFullSharedAccessSignature política na sua aplicação.Do not use the DefaultFullSharedAccessSignature policy in your application. Isso se destina a ser utilizado no seu back-end.This is meant to be used in your back end only.

    Portal do Azure – cadeias de ligação do hub de notificação

Definir as configurações do GCM/FCM para o Hub de notificaçãoConfigure GCM/FCM settings for the notification hub

  1. Selecione Google (GCM/FCM)/ na seção configurações no menu à esquerda.Select Google (GCM/FCM)/ in the Settings section on the left menu.

  2. Insira a chave do servidor que você anotou no console do Google firebase.Enter the server key you noted down from the Google Firebase Console.

  3. Selecione Guardar na barra de ferramentas.Select Save on the toolbar.

O Notification Hub está configurado para trabalhar com FCM e tem as cadeias de ligação para registar a sua aplicação e para receber notificações e enviar notificações push.Your notification hub is configured to work with FCM, and you have the connection strings to both register your app to receive notifications and to send push notifications.

Criar um aplicativo Xamarin. Android e conectá-lo ao Hub de notificaçãoCreate a Xamarin.Android app and connect it to notification hub

Criar um projeto do Visual Studio e adicionar pacotes NuGetCreate Visual Studio project and add NuGet packages

Nota

As etapas documentadas neste tutorial são para o Visual Studio 2017.The steps documented in this tutorial are for Visual Studio 2017.

  1. No Visual Studio, abra o menu arquivo , selecione novoe, em seguida, selecione projeto.In Visual Studio, open the File menu, select New, and then select Project. Na janela novo projeto , siga estas etapas:In the New Project window, do these steps:

    1. Expanda instalado, Visual C# e clique em Android.Expand Installed, Visual C#, and then click Android.

    2. Selecione aplicativo Android (Xamarin) na lista.Select Android App (Xamarin) from the list.

    3. Introduza um nome para o projeto.Enter a name for the project.

    4. Selecione um local para o projeto.Select a location for the project.

    5. Selecione OKSelect OK

      Caixa de diálogo Novo Projeto

  2. Na caixa de diálogo novo aplicativo Android , selecione aplicativo em brancoe selecione OK.On the New Android App dialog box, select Blank App, and select OK.

    Caixa de diálogo Novo Projeto

  3. Na janela Explorador de Soluções, expanda Propriedades e clique em AndroidManifest.xml.In the Solution Explorer window, expand Properties, and click AndroidManifest.xml. Atualize o nome do pacote para corresponder ao nome do pacote que introduziu ao adicionar o Firebase Cloud Messaging ao seu projeto na consola Google Firebase.Update the package name to match the package name you entered when adding Firebase Cloud Messaging to your project in the Google Firebase Console.

    Nome do pacote no GCM

  4. Defina a versão de destino do Android para o projeto como Android 9,0 (pizza) seguindo estas etapas:Set the target Android version for the project to Android 9.0 (pie) by following these steps:

    1. Clique com o botão direito do mouse no projeto e selecione Propriedades.Right-click your project, and select Properties.
    2. Para o campo compilar usando a versão do Android: (estrutura de destino) , selecione Android 9,0 (pizza) .For the Compile using Android version: (Target framework) field, select Android 9.0 (Pie).
    3. Selecione Sim na caixa de mensagem para continuar com a alteração da estrutura de destino.Select Yes on the message box to continue with changing the target framework.
  5. Adicione os pacotes NuGet necessários ao projeto seguindo estas etapas:Add required NuGet packages to the project by following these steps:

    1. Clique com o botão direito do rato no projeto e selecione Gerir Pacotes NuGet... .Right-click your project, and select Manage NuGet Packages....

    2. Alterne para a guia instalado , selecione Xamarin. Android. support. Designe selecione Atualizar no painel direito para atualizar o pacote para a versão mais recente.Switch to the Installed tab, select Xamarin.Android.Support.Design, and select Update in the right pane to update the package to the latest version.

    3. Alterne para a guia procurar . procure por Xamarin. GooglePlayServices. base.Switch to the Browse tab. Search for Xamarin.GooglePlayServices.Base. Selecione Xamarin.GooglePlayServices.Base na lista de resultados.Select Xamarin.GooglePlayServices.Base in the result list. Em seguida, selecione Instalar.Then, select Install.

      NuGet dos Serviços do Google Play

    4. Na janela Gestor de Pacotes NuGet, procure Xamarin.Firebase.Messaging.In the NuGet Package Manager window, search for Xamarin.Firebase.Messaging. Selecione Xamarin.Firebase.Messaging na lista de resultados.Select Xamarin.Firebase.Messaging in the result list. Em seguida, selecione Instalar.Then, select Install.

    5. Agora, procure Xamarin.Azure.NotificationHubs.Android.Now, search for Xamarin.Azure.NotificationHubs.Android. Selecione Xamarin.Azure.NotificationHubs.Android na lista de resultados.Select Xamarin.Azure.NotificationHubs.Android in the result list. Em seguida, selecione Instalar.Then, select Install.

Adicionar o Ficheiro JSON dos Serviços GoogleAdd the Google Services JSON File

  1. Copie o arquivo google-services.json que você baixou do console do Google firebase para a pasta do projeto.Copy the google-services.json file that you downloaded from the Google Firebase Console to the project folder.

  2. Adicione google-services.json ao projeto.Add google-services.json to the project.

  3. Selecione google-services.json na janela Gerenciador de soluções .Select google-services.json in the Solution Explorer window.

  4. No painel Propriedades, defina a Ação de Compilação como GoogleServicesJson.In the Properties pane, set the Build Action to GoogleServicesJson. Se não vir GoogleServicesJson, feche o Visual Studio, reinicie-o, reabra o projeto e repita.If you don't see GoogleServicesJson, close Visual Studio, relaunch it, reopen the project, and retry.

    Ação de compilação GoogleServicesJson

Configurar Notification Hubs no seu projetoSet up notification hubs in your project

Registar no Firebase Cloud MessagingRegistering with Firebase Cloud Messaging

  1. Abra o arquivo AndroidManifest.xml e insira os seguintes elementos <receiver> no elemento <application>:Open the AndroidManifest.xml file and insert the following <receiver> elements into the <application> element:

    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    
  2. Adicione as instruções a seguir antes do elemento Application .Add the following statements before the application element.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    
  3. Recolha as seguintes informações para a sua aplicação Android e Notification Hub:Gather the following information for your Android app and notification hub:

    • Escutar a cadeia de ligação: no dashboard, no portal do Azure, escolha Ver cadeias de ligação.Listen connection string: On the dashboard in the Azure portal, choose View connection strings. Copie a cadeia de conexão DefaultListenSharedAccessSignature para esse valor.Copy the DefaultListenSharedAccessSignature connection string for this value.
    • Nome do hub: nome do hub a partir do portal do Azure.Hub name: Name of your hub from the Azure portal. Por exemplo, mynotificationhub2.For example, mynotificationhub2.
  4. Na janela Gerenciador de soluções , clique com o botão direito do mouse no projeto, selecione Adicionare, em seguida, selecione classe.In the Solution Explorer window, right-click your project, select Add, and then select Class.

  5. Crie uma classe Constants.cs para seu projeto Xamarin e defina os valores constantes a seguir na classe.Create a Constants.cs class for your Xamarin project and define the following constant values in the class. Substitua os marcadores de posição com os seus valores.Replace the placeholders with your values.

    public static class Constants
    {
        public const string ListenConnectionString = "<Listen connection string>";
        public const string NotificationHubName = "<hub name>";
    }
    
  6. Adicione as seguintes instruções using a MainActivity.cs:Add the following using statements to MainActivity.cs:

    using Android.Util;
    using Android.Gms.Common;
    
  7. Adicione as propriedades a seguir à classe MainActivity.Add the following properties to the MainActivity class. A variável de marca será usada para mostrar uma caixa de diálogo de alerta quando o aplicativo estiver em execução:The TAG variable will be used to show an alert dialog when the app is running:

    public const string TAG = "MainActivity";
    internal static readonly string CHANNEL_ID = "my_notification_channel";
    
  8. Adicione o método a seguir à classe MainActivity.Add the following method to the MainActivity class. Ele verifica se Google Play Services estão disponíveis no dispositivo.It checks whether Google Play Services are available on the device.

    public bool IsPlayServicesAvailable()
    {
        int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.Success)
        {
            if (GoogleApiAvailability.Instance.IsUserResolvableError(resultCode))
                Log.Debug(TAG, GoogleApiAvailability.Instance.GetErrorString(resultCode));
            else
            {
                Log.Debug(TAG, "This device is not supported");
                Finish();
            }
            return false;
        }
    
        Log.Debug(TAG, "Google Play Services is available.");
        return true;
    }
    
  9. Adicione o método a seguir à classe MainActivity que cria um canal de notificação.Add the following method to the MainActivity class that creates a notification channel.

    private void CreateNotificationChannel()
    {
        if (Build.VERSION.SdkInt < BuildVersionCodes.O)
        {
            // Notification channels are new in API 26 (and not a part of the
            // support library). There is no need to create a notification
            // channel on older versions of Android.
            return;
        }
    
        var channelName = CHANNEL_ID;
        var channelDescription = string.Empty;
        var channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationImportance.Default)
        {
            Description = channelDescription
        };
    
        var notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.CreateNotificationChannel(channel);
    }
    
  10. No MainActivity.cs, adicione o seguinte código a OnCreate após base.OnCreate(savedInstanceState):In MainActivity.cs, add the following code to OnCreate after base.OnCreate(savedInstanceState):

    if (Intent.Extras != null)
    {
        foreach (var key in Intent.Extras.KeySet())
        {
            if(key!=null)
            {
                var value = Intent.Extras.GetString(key);
                Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
            }
        }
    }
    
    IsPlayServicesAvailable();
    CreateNotificationChannel();
    
  11. Adicione uma classe chamada MyFirebaseMessagingService ao seu projeto.Add a class named MyFirebaseMessagingService to your project.

  12. Adicione as seguintes instruções using a MyFirebaseMessagingService.cs.Add the following using statements to MyFirebaseMessagingService.cs.

    using Android.Util;
    using Firebase.Messaging;
    using Android.Support.V4.App;    
    using WindowsAzure.Messaging;
    
  13. Adicione o seguinte acima da declaração de classe e faça com que sua classe herde de FirebaseMessagingService:Add the following above your class declaration, and have your class inherit from FirebaseMessagingService:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    
  14. Adicione o código a seguir a MyFirebaseMessagingService.cs para processar as mensagens que são recebidas.Add the following code to MyFirebaseMessagingService.cs to process messages that are received.

        const string TAG = "MyFirebaseMsgService";
        NotificationHub hub;
    
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
            if (message.GetNotification() != null)
            {
                //These is how most messages will be received
                Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
                SendNotification(message.GetNotification().Body);
            }
            else
            {
                //Only used for debugging payloads sent from the Azure portal
                SendNotification(message.Data.Values.First());
    
            }
        }
    
        void SendNotification(string messageBody)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
    
            var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID);
    
            notificationBuilder.SetContentTitle("FCM Message")
                        .SetSmallIcon(Resource.Drawable.ic_launcher)
                        .SetContentText(messageBody)
                        .SetAutoCancel(true)
                        .SetShowWhen(false)
                        .SetContentIntent(pendingIntent);
    
            var notificationManager = NotificationManager.FromContext(this);
    
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    
  15. Adicione os seguintes métodos à classe MyFirebaseMessagingService para receber o token de registro FCM e enviá-lo para a instância de hubs de notificação (Hub).Add the following methods to the MyFirebaseMessagingService class to receive the FCM registration token and send it to the Notification Hubs instance (hub).

        public override void OnNewToken(string token)
        {
            Log.Debug(TAG, "FCM token: " + token);
            SendRegistrationToServer(token);
        }
    
        void SendRegistrationToServer(string token)
        {
            // Register with Notification Hubs
            hub = new NotificationHub(Constants.NotificationHubName,
                                        Constants.ListenConnectionString, this);
    
            var tags = new List<string>() { };
            var regID = hub.Register(token, tags.ToArray()).RegistrationId;
    
            Log.Debug(TAG, $"Successful registration of ID {regID}");
        }
    
  16. Crie o projeto.Build your project.

  17. Execute a aplicação no dispositivo ou emulador carregadoRun your app on your device or loaded emulator

Enviar notificação de teste a partir do portal do AzureSend test notification from the Azure portal

Pode testar a receção das notificações na aplicação com a opção Envio de Teste no portal do Azure.You can test receiving notifications in your app with the Test Send option in the Azure portal. Esta ação envia uma notificação push de teste para o seu dispositivo.It sends a test push notification to your device.

Portal do Azure – Envio de Teste

Normalmente, as notificações push são enviadas num serviço de back-end, como Mobile Services ou ASP.NET, através de uma biblioteca compatível.Push notifications are normally sent in a back-end service like Mobile Services or ASP.NET through a compatible library. Se uma biblioteca não estiver disponível para seu back-end, você também poderá usar a API REST diretamente para enviar mensagens de notificação.If a library isn't available for your back-end, you can also use the REST API directly to send notification messages.

Passos seguintesNext steps

Neste tutorial, enviou notificações de difusão para todos os dispositivos Android registados no back-end.In this tutorial, you sent broadcast notifications to all your Android devices registered with the backend. Para saber como enviar notificações push para dispositivos Android específicos, avance para o tutorial seguinte:To learn how to push notifications to specific Android devices, advance to the following tutorial: