Receba notificações por push usando o SNS (Xamarin Android) - AWS Mobile SDK

O AWS Mobile SDK for Xamarin agora está incluído no AWS SDK for .NET. Este guia faz referência à versão arquivada do Mobile SDK para Xamarin.

Receba notificações por push usando o SNS (Xamarin Android)

O tutorial explica como enviar notificações por push a um aplicativo Xamarin Android usando o Amazon Simple Notification Service (SNS) e o AWS Mobile SDK para .NET e Xamarin.

Configuração do projeto

Pré-requisitos

É necessário concluir todas as instruções na Configuração do AWS Mobile SDK para .NET e Xamarin antes de iniciar este tutorial.

Definir permissões para o SNS

Siga a etapa 2 em Configuração do AWS Mobile SDK para .NET e Xamarin para associar a política mencionada abaixo aos perfis do aplicativo. Isso concederá aplicativo as permissões adequadas para acessar o SNS:

  1. Acesse o console do IAM e selecione a função do IAM a ser configurada.

  2. Clique em Attach Policy (Anexar política), selecione a política AmazonSNSFullAccess policy e clique em Attach Policy (Anexar política).

Atenção

Não é recomendável o uso do AmazonSNSFullAccess em um ambiente de produção. Nós o utilizamos aqui para que você possa avançar rapidamente. Para obter mais informações sobre como especificar permissões para uma perfil do IAM, consulte Visão geral das permissões de funções do IAM.

Habilitar notificações por push no Google Cloud

Primeiro, adicione um novo projeto do Google API:

  1. Acesse o console do Google Developers.

  2. Clique em Create Project (Criar projeto).

  3. Na caixa New Project (Novo projeto), insira um nome de projeto, anote o ID do projeto (você precisará dele mais tarde) e clique em Create (Criar).

Em seguida, habilite o serviço Google Cloud Messaging (GCM) do seu projeto:

  1. No console do Google Developers, o novo projeto já estará selecionado. Se não estiver, selecione-o no menu suspenso na parte superior da página.

  2. Selecione APIs & auth (APIs e autorizações) na barra lateral à esquerda da página.

  3. Na caixa de pesquisa, digite "Google Cloud Messaging para Android" e clique no link Google Cloud Messaging for Android (Google Cloud Messaging para Android).

  4. Clique em Enable API (Permitir API).

Por fim, obtenha uma chave de API:

  1. No Console de desenvolvedores do Google, selecione APIs & auth (APIs e autorizações) > Credentials (Credenciais).

  2. Em Public API access (Acesso à API pública), clique em Create new key (Criar nova chave).

  3. Na caixa de diálogo Create a new key (Criar uma nova chave), clique em Server key (Chave do servidor).

  4. Na caixa de diálogo resultante, clique em Create (Criar) e copie a chave da API exibida. Você a usará para realizar a autenticação posteriormente.

Uso do ID do projeto para criar um Nome de região da Amazon (ARN) de plataforma console do SNS

  1. Acesse o console do SNS.

  2. Clique em Applications (Aplicativos) no lado esquerdo da tela.

  3. Clique em Create platform application (Criar aplicativo de plataforma) para criar um novo aplicativo para a plataforma SNS.

  4. Insira um Application Name (Nome de aplicativo).

  5. Selecione Google Cloud Messaging (GCM) em Push notification platform (Plataforma de notificação por push).

  6. Cole a chave da API na caixa de texto intitulada API key (Chave da API).

  7. Clique em Create platform application (Criar aplicativo de plataforma).

  8. Selecione o aplicativo de plataforma que você acabou de criar e copie o Nome de região da Amazon (ARN) do aplicativo.

Adicionar pacotes NuGet para SNS ao seu projeto

Siga a etapa 4 das instruções em Configuração do AWS Mobile SDK para .NET e Xamarin para adicionar o pacote NuGet do Amazon Simple Notification Service ao seu projeto.

Criação de um cliente SNS

var snsClient = new AmazonSimpleNotificationServiceClient(credentials, region);

Registro do aplicativo para notificações remotas

Para registrar-se para receber notificações remotas no Android, você precisará criar um BroadcastReceiver, que pode receber mensagens do Google Cloud. Altere o nome do pacote abaixo quando solicitado:

[BroadcastReceiver(Permission = "com.google.android.c2dm.permission.SEND")] [IntentFilter(new string[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] [IntentFilter(new string[] { "com.google.android.c2dm.intent.REGISTRATION" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] [IntentFilter(new string[] { "com.google.android.gcm.intent.RETRY" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] public class GCMBroadcastReceiver: BroadcastReceiver { const string TAG = "PushHandlerBroadcastReceiver"; public override void OnReceive(Context context, Intent intent) { GCMIntentService.RunIntentInService(context, intent); SetResult(Result.Ok, null, null); } } [BroadcastReceiver] [IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })] public class GCMBootReceiver: BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { GCMIntentService.RunIntentInService(context, intent); SetResult(Result.Ok, null, null); } }

Veja a seguir o serviço que recebe a notificação por push de BroadcastReceiver e exibe a notificação na barra de notificação do dispositivo:

[Service] public class GCMIntentService: IntentService { static PowerManager.WakeLock sWakeLock; static object LOCK = new object(); public static void RunIntentInService(Context context, Intent intent) { lock(LOCK) { if (sWakeLock == null) { // This is called from BroadcastReceiver, there is no init. var pm = PowerManager.FromContext(context); sWakeLock = pm.NewWakeLock( WakeLockFlags.Partial, "My WakeLock Tag"); } } sWakeLock.Acquire(); intent.SetClass(context, typeof(GCMIntentService)); context.StartService(intent); } protected override void OnHandleIntent(Intent intent) { try { Context context = this.ApplicationContext; string action = intent.Action; if (action.Equals("com.google.android.c2dm.intent.REGISTRATION")) { HandleRegistration(intent); } else if (action.Equals("com.google.android.c2dm.intent.RECEIVE")) { HandleMessage(intent); } } finally { lock(LOCK) { //Sanity check for null as this is a public method if (sWakeLock != null) sWakeLock.Release(); } } } private void HandleRegistration(Intent intent) { string registrationId = intent.GetStringExtra("registration_id"); string error = intent.GetStringExtra("error"); string unregistration = intent.GetStringExtra("unregistered"); if (string.IsNullOrEmpty(error)) { var response = await SnsClient.CreatePlatformEndpointAsync(new CreatePlatformEndpointRequest { Token = registrationId, PlatformApplicationArn = "YourPlatformArn" /* insert your platform application ARN here */ }); } } private void HandleMessage(Intent intent) { string message = string.Empty; Bundle extras = intent.Extras; if (!string.IsNullOrEmpty(extras.GetString("message"))) { message = extras.GetString("message"); } else { message = extras.GetString("default"); } Log.Info("Messages", "message received = " + message); ShowNotification(this, "SNS Push", message); //show the message } public void ShowNotification(string contentTitle, string contentText) { // Intent Notification.Builder builder = new Notification.Builder(this) .SetContentTitle(contentTitle) .SetContentText(contentText) .SetDefaults(NotificationDefaults.Sound | NotificationDefaults.Vibrate) .SetSmallIcon(Resource.Drawable.Icon) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)); // Get the notification manager: NotificationManager notificationManager = this.GetSystemService(Context.NotificationService) as NotificationManager; notificationManager.Notify(1001, builder.Build()); } }

Envio de uma mensagem do console do SNS para o endpoint

  1. Acesse SNS Console (Console do SNS) > Applications (Aplicativos).

  2. Selecione o aplicativo de plataforma, selecione um endpoint e clique em Publish to endpoint (Publicar no endpoint).

  3. Digite uma mensagem de texto na caixa de texto e clique em Publish message (Publicar mensagem) para publicar uma mensagem.