Notification Hub y Xamarin: Android

Carlos Rodríguez
Xoborg — Tecnología disruptiva
5 min readJan 11, 2018

Bienvenidos a la que es la primera parte de una serie de posts que voy a escribir sobre cómo podéis utilizar el Notification Hub de Azure junto a vuestras Apps de Xamarin.

En este post en concreto podréis ver los pasos que tenéis que seguir para integrarlas en Android.

Creando nuestro proyecto en Firebase

Lo primero es lo primero, ¿qué es Firebase?

Firebase es una plataforma de Google en la que nos ofrecen una serie de herramientas para móviles principalmente con las que gestionar analíticas de uso, autenticación mediante servicios de terceros, almacenamiento de archivos, o lo que nos interesa en nuestro caso, notificaciones push.

Para empezar deberemos acceder a la consola de Firebase (https://console.firebase.google.com/) y añadir un nuevo proyecto.

Pantalla principal de la consola de Firebase

Al hacer clic en “crear proyecto” lo siguiente que verás es una pantalla de introducción en la que podrás ver más información sobre los servicios que ofrece Firebase.

Pantalla principal del proyecto de Firebase

Como habrás visto, podemos integrar Firebase en Apps de iOS e incluso en webs, aunque en nuestro caso sólo nos interesa la opción de añadir Firebase a nuestra App de Android, por lo que haremos clic en esa opción.

Ahora tendremos que especificar el nombre del paquete que vamos a utilizar en nuestra App de Android.

Esto es algo importante ya que si no coincide con el que vamos a utilizar, las notificaciones no funcionarán.

También podremos escoger un apodo para identificar mejor la App que utilizaremos.

Por último haremos clic en “registrar la aplicación” para continuar con el siguiente paso.

Pues bien, una vez hemos registrado nuestra App, ahora tenemos la opción de descargar un archivo de configuración. Este archivo servirá para que la aplicación de Android pueda conectarse con Firebase de una forma muy sencilla, solamente teniendo que agregar el propio archivo al proyecto.

Más adelante os enseñaré cómo hacerlo desde Visual Studio.

Al utilizar Xamarin, el siguiente paso no nos interesa así que cerraremos la ventana para continuar con el proceso, en este caso ya desde Visual Studio.

Adaptando nuestra app

Dando por hecho que sabéis crear un proyecto para Xamarin, en mi caso será para Xamarin.Forms, lo primero que tenéis que hacer es añadir el paquete de NuGet “Xamarin.Firebase.Messaging” al proyecto de Android.

Añadiendo el paquete de Firebase al proyecto de Android

Además, también tendremos que instalar el paquete “Xamarin.GooglePlayServices.Base”.

Una vez hemos instalado tanto los paquetes como sus dependencias, es el turno de agregar el archivo “google-services.json” que descargamos anteriormente al proyecto.

Para ello lo arrastraremos dentro del proyecto .Droid, haremos clic secundario sobre el archivo, y en acciones de compilación seleccionaremos la opción “GoogleServicesJson”.

En caso de que esa opción no salga, y aquí es donde esta el “truco”, tendremos que cerrar y volver a abrir Visual Studio para que aparezca.

Lo siguiente que vamos a hacer es crear un par de clases necesarias para gestionar tanto la obtención del token de notificaciones, como para recibir y mostrar las propias notificaciones.

“MyFirebaseIIDService” para la obtención del token:

[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class MyFirebaseIIDService : FirebaseInstanceIdService
{
const string TAG = "MyFirebaseIIDService";

public override void OnTokenRefresh()
{
// Guardamos el token en el almacenamiento de nuestra app para poder usarlo más adelante
//var token = FirebaseInstanceId.Instance.Token;
}
}

Y “MyFirebaseMessagingService” para recibir y mostrar notificaciones:

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
const string TAG = "MyFirebaseMsgService";
public override void OnMessageReceived(RemoteMessage message)
{
base.OnMessageReceived(message);
SendNotification(message.GetNotification().Body);
}

void SendNotification(string messageBody)
{
try
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(
ActivityFlags.NewTask | ActivityFlags.SingleTop
);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot); var defaultSoundUri = RingtoneManager.GetDefaultUri(RingtoneType.Notification); using (var notificationBuilder = new Notification.Builder(this)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentTitle("Título")
.SetContentText(messageBody)
.SetSound(defaultSoundUri)
.SetVibrate(new long[] { 100, 200, 300 })
.SetAutoCancel(true)
.SetContentIntent(pendingIntent))
{
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(1, notificationBuilder.Build());
}
}
catch { }
}
}

Cabe destacar que, tanto el formato del mensaje que llega como la notificación la podéis cambiar a vuestro gusto.

Ahora abriremos el archivo AndroidManifest.xml y añadiremos las siguientes líneas dentro de la etiqueta <application>:

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

También añadiremos antes de la etiqueta <application> lo siguiente:

<uses-permission android:name="android.permission.INTERNET" />

Y por último, en el MainActivity.cs añadiremos las siguientes líneas para poder probar las notificaciones sin tener que estar borrando la aplicación cada vez que la compilamos para que se genere un nuevo token válido.

#if DEBUG
// Force refresh of the token. If we redeploy de app, no new token will be sent but the old will
// be invalid.
Task.Run(() => {
// This may not be executed on the main thread.
FirebaseInstanceId.Instance.DeleteInstanceId();
Console.WriteLine("Forced Token: " + FirebaseInstanceId.Instance.Token);
});
#endif

Antes de seguir, quiero apuntar que esto es una base sobre la que podéis trabajar, es probable que en vuestras apps tengáis que realizar algunas adaptaciones, como comprobar si la app se está ejecutando en un dispositivo que tiene los servicios de Google Play (es probable que uno de una marca china no muy conocida no los tenga), guardar el token para suscribirse sólo cuando el usuario realiza alguna acción, etc.

Ahora ya sólo nos queda volver a la consola de Firebase y mandar una notificación de prueba escribiendo el texto del mensaje y seleccionando la aplicación:

Envío de notificación de prueba

Y unos instantes después de hacer clic en “enviar mensaje” la notificación llegará al dispositivo.

Con esto tendremos las notificaciones push funcionando en Android, en el siguiente post hablaremos del proceso para iOS.

--

--