Recepción de notificaciones de inserción con SNS (Xamarin Android) - SDK para móviles de AWS

El AWS SDK para móviles de Xamarin ahora está incluido en AWS SDK for .NET. Esta guía hace referencia a la versión archivada del SDK para móviles para Xamarin.

Recepción de notificaciones de inserción con SNS (Xamarin Android)

En este tutorial se explica cómo enviar notificaciones de inserción a una aplicación de Xamarin Android con Amazon Simple Notification Service (SNS) y AWS Mobile SDK para .NET y Xamarin.

Configuración del proyecto

Requisitos previos

Debe seguir las instrucciones en Setting Up the AWS Mobile SDK for .NET and Xamarin antes de comenzar este tutorial.

Establecer permisos de SNS

Siga el paso 2 de Setting Up the AWS Mobile SDK for .NET and Xamarin para adjuntar la política que se menciona a continuación a los roles de su aplicación. Esto otorgará a su aplicación los permisos correctos para obtener acceso a SNS:

  1. Vaya a la consola de IAM y seleccione el rol de IAM que desea configurar.

  2. Haga clic en Attach Policy (Adjuntar política), seleccione la política AmazonSNSFullAccess y haga clic en Attach Policy (Adjuntar política).

aviso

No es recomendable usar AmazonSNSFullAccess en un entorno de producción. Aquí lo utilizamos para que pueda comenzar a trabajar rápidamente. Para obtener más información acerca de la especificación de los permisos de un rol de IAM, consulte la información general sobre los permisos de los roles de IAM.

Habilitar notificaciones de inserción en Google Cloud

En primer lugar, añada un nuevo proyecto de API de Google:

  1. Vaya a la Consola para desarrolladores de Google.

  2. Haga clic en Create Project (Crear proyecto).

  3. En el cuadro New Project (Nuevo proyecto), escriba un nombre de proyecto, tome nota del ID de proyecto (lo necesitará más adelante) y haga clic en Create (Crear).

A continuación, habilite el servicio Google Cloud Messaging (GCM) para el proyecto:

  1. En la consola para desarrolladores de Google, el nuevo proyecto ya debería estar seleccionado. En caso contrario, selecciónela en el menú desplegable situado en la parte superior de la página.

  2. Seleccione APIs & auth (API y autenticación) en la barra lateral situada en la parte izquierda de la página.

  3. En el cuadro de búsqueda, escriba "Google Cloud Messaging for Android" y haga clic en el enlace Google Cloud Messaging for Android (Google Cloud Messaging para Android).

  4. Haga clic en Enable API (Habilitar API).

Por último, obtenga una clave de API:

  1. En la consola de Google para desarrolladores, seleccione APIs & auth (API y autenticación) > Credentials (Credenciales).

  2. En Public API access (Acceso a API pública), haga clic en Create new key (Crear nueva clave).

  3. En el cuadro de diálogo Create a new key (Crear nueva clave), haga clic en Server key (Clave de servidor).

  4. En el cuadro de diálogo resultante, haga clic en Create (Crear) y copie la clave de API que se muestra. Utilizará esta clave de API para realizar la autenticación más adelante.

Uso del ID de proyecto para crear un ARN de plataforma en la consola de SNS

  1. Vaya a la consola de SNS.

  2. Haga clic en Applications (Aplicaciones) en la parte izquierda de la pantalla.

  3. Haga clic en Create platform application (Crear aplicación de plataforma) para crear una nueva aplicación de plataforma de SNS.

  4. Introduzca un nombre de aplicación en Application Name (Nombre de aplicación).

  5. Seleccione Google Cloud Messaging (GCM) en Push notification platform (Plataforma de notificación de inserción).

  6. Pegue la clave de API en el cuadro de texto API key (Clave de API).

  7. Haga clic en Create platform application (Crear aplicación de plataforma).

  8. Seleccione la aplicación de plataforma que acaba de crear y copie el ARN de la aplicación.

Añadir NuGet Package para SNS al proyecto

Siga el paso 4 de las instrucciones de Setting Up the AWS Mobile SDK for .NET and Xamarin para añadir el paquete de NuGet Amazon Simple Notification Service a su proyecto.

Creación de un cliente de SNS

var snsClient = new AmazonSimpleNotificationServiceClient(credentials, region);

Registro de una aplicación para recibir notificaciones remotas

Si desea registrarse para recibir notificaciones remotas en Android, tendrá que crear un objeto BroadcastReceiver que pueda recibir mensajes de Google Cloud. Cambie el nombre del paquete cuando se le pida a continuación:

[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); } }

A continuación se puede ver el servicio que recibe la notificación de inserción de BroadcastReceiver y muestra la notificación en la barra de notificaciones del 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()); } }

Envío de un mensaje desde la consola de SNS a un punto de enlace

  1. Vaya a la consola de SNS y haga clic en Applications (Aplicaciones).

  2. Seleccione su aplicación de plataforma, seleccione un punto de enlace y haga clic en Publish to endpoint (Publicar en punto de enlace).

  3. Escriba un mensaje en el cuadro de texto y haga clic en Publish message (Publicar mensaje) para publicarlo.