Esta guía corresponde al uso y manejo de Google Firebase Cloud Messaging V1, la versión más reciente del servicio de mensajería
Agregue el plugin de Firebase a su aplicación móvil en Tool > Firebase.
Conectese a su proyecto de Firebase
Añada las dependencias
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import org.json.JSONObject
class FCMService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
val obj = JSONObject(message.data as Map<*, *>)
val json = obj.toString()
}
}Para android 13 o superior, se requiere usar este permiso
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />requestPermissions(
arrayOf(
android.Manifest.permission.POST_NOTIFICATIONS
), 1
)Para empezar a recibir mensajes debe primero suscribirse a un topic. Luego de suscrito, los google play services mantendrán comunicación activa con el Broker de mensajería
Firebase.messaging.subscribeToTopic("noti").addOnSuccessListener {
Log.e(">>>","Suscrito")
}import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import org.json.JSONObject
class FCMService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
val obj = JSONObject(message.data as Map<*, *>)
val json = obj.toString()
}
}<application>
...
<service
android:name=".fcm.FCMService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
...
</application>Generar notificaciones visualmente. Puede invocarlas dentro del servicio
import android.content.Context
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import androidx.core.app.NotificationCompat
object NotificationUtil {
private val CHANNEL_ID = "messages";
private val CHANNEL_NAME = "Messages";
private var id = 0;
fun showNotification(context: Context, title:String, message:String){
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)
notificationManager.createNotificationChannel(channel)
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
.setDefaults(Notification.DEFAULT_ALL)
.setContentText(message)
.setContentTitle(title)
.setSmallIcon(R.drawable.ic_launcher_foreground)
val notification = builder.build()
notificationManager.notify(id, notification)
id++
}
}Si necesita que al pulsar la notificación se abra la actividad necesitará un pending intent
val notifyIntent = Intent(context, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val notifyPendingIntent = PendingIntent.getActivity(
context, 0, notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
...
manager.notify(
id++,
NotificationCompat
.Builder(context, CHANNEL_ID)
.setDefaults(Notification.DEFAULT_ALL)
.setContentText(message)
.setContentTitle(title)
.setContentIntent(notifyPendingIntent) <-- Se abre la aplicación al dar click a la notificación
.setAutoCancel(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
)
Para enviar datos debe hacer un POST Request a su nodo backend de modo que este nodo redirija al servicio de FCM. Recuerde que puede hacer POST Request por medio de la librería de Retrofit. Aquí hay una guía
Necesatará el modelo de mensaje de FCM, lo puede ver más adelante
Este es el servivio de mensajería actualizado y está pensado para se un nodo de backend. La razón es que ahora no hay clave de servicio estática, sino que es ahora un Token (dinámico). El Token se extrae mediante una credencial de administrados generado desde la Google Cloud Console
-
Para obtener una clave de servicio ingrese a la configuración de su proyecto.
-
Vaya a su proyecto de Firebase.
Configuración del proyecto>Cloud Messaging -
Si no esta habilitada la V1, actívela mendiante el link
-
Vaya a Administrar cuentas de servicio
-
Cree una cuenta de servicio usando el botón CREAR CUENTA DE SERVICIO con un nombre cualquiera
-
En rol escoga Firebase Admin y guarde
-
Ingrese a la cuenta de servicio y vaya a la pestaña CLAVES
-
Agrege una CLAVE JSON nueva
-
Descargue el JSON, ese será su clave.json para el programa
-
Ya tendrá todo lo necesario para publicar mensajes PUSH
El nodo de backend debe tener al menos un endpoint que reciba la solicitud de publicación de mensaje. Para realizarlo escoga el backend que mejor se ajuste a sus saberes
https://github.com/Domiciano/FCMNode
Este nodo está hecho con el framework Springboot con el lenguaje de programación JAVA.
https://github.com/Domiciano/FCMNodeJS
Este nodo está hecho con NodeJS en Javascript usando la librería de expressJS
Ambos repositorios muestran cómo se puede generar un short-time token para poder enviar solicitudes a FCM
El módulo de backend hace una solicitud HTTP POST al endpoint
https://fcm.googleapis.com/v1/projects/facelogprueba/messages:send
Los headers que usa son
Content-Type: application/json; UTF-8
Authorization: Bearer <FCM_KEY>
Donde <FCM_KEY> corresponde al token obtenido a partir de la clave de Cuenta de Servicio.
El payload del mensaje es
{
"message": {
"topic": "noti",
"data": {
"alfa": "Nuevo cambio"
}
}
}