SDK de Android - Soporte para notificaciones push

Soporte para notificaciones push

Realiza el seguimiento de las interacciones del usuario con las notificaciones push para medir campañas de re-engagement y atribuir conversiones con precisión integrando Firebase Cloud Messaging (FCM) con el SDK de Singular.

Sigue las directrices de implementación a continuación para asegurar que los datos de las notificaciones se pasen correctamente al SDK de Singular para una atribución adecuada.

Por qué realizar el seguimiento de las notificaciones push: Las notificaciones push impulsan el re-engagement, pero el seguimiento requiere una integración correcta. Singular garantiza que los usuarios que interactúan con las notificaciones se atribuyan correctamente, optimizando las campañas de marketing y las estrategias de engagement.


Guía de implementación

Manejar notificaciones de FCM

Sobrescribe el método onMessageReceived() en tu FirebaseMessagingService para capturar los datos de la notificación cuando lleguen los mensajes push.

Kotlin Java
override fun onMessageReceived(message: RemoteMessage) {
    super.onMessageReceived(message)
    var title = ""
    var body = ""

    message.notification?.let {
        Log.d("singular-app", it.toString())
        title = it.title ?: ""
        body = it.body ?: ""
    }

    val data: Map<String, String> = message.data
    if (data.isNotEmpty()) {
        Log.d("singular-app", data.toString())
    }

    // Forward payload data to intent
    processNotification(title, body, data)
}

Mejor práctica: Captura tanto el contenido de la notificación (title, body) como el payload de datos para asegurar que esté disponible la información de seguimiento completa para la atribución.


Procesar y reenviar los datos de la notificación

Crea un intent que inicie tu MainActivity con el payload de la notificación adjunto, garantizando que Singular reciba los datos de seguimiento.

Kotlin Java
private fun processNotification(title: String, body: String, data: Map<String, String>) {
    val intent = Intent(this, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

        // Attach notification data to the intent
        data.forEach { (key, value) ->
            putExtra(key, value)
        }
    }

    val pendingIntent = PendingIntent.getActivity(
        this,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

    val notificationBuilder = NotificationCompat.Builder(this, "your_channel_id")
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(body)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setAutoCancel(true)
        .setContentIntent(pendingIntent)

    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager
    notificationManager?.notify(0, notificationBuilder.build())
}

Requisito para Android 12+: Usa PendingIntent.FLAG_IMMUTABLE para Android API 31+ para cumplir con los requisitos de seguridad.


Configurar el SDK para los payloads de push

Agrega selectores de payload de notificaciones push a tu configuración del SDK para especificar dónde se encuentran los enlaces de Singular dentro de la estructura de datos de la notificación.

Cómo encaja la atribución push. El SDK no analiza los payloads entrantes de push dentro de onMessageReceived . En su lugar, el enlace se extrae cuando se inicia una activity desde una notificación: el sistema operativo pasa los datos de la notificación como el intent de inicio, que reenvías a Singular.init() a través de SingularConfig . El ciclo de vida es:

  1. Llega la notificación → onMessageReceived la muestra (tu código).
  2. El usuario toca la notificación → Android inicia tu activity con los datos de la notificación adjuntos al intent.
  3. Tu activity llama a Singular.init(context, config) , pasando el intent a través de withPushNotificationPayload(intent, selectors) .
  4. El SDK recorre los selectores, encuentra el enlace de Singular y registra la sesión atribuida al push.

La atribución push depende de que se alcance Singular.init() después de que la activity se inicie desde la notificación. Sin withPushNotificationPayload configurado, el enlace no se extrae independientemente de cómo se construya la notificación. El seguimiento de desinstalaciones a través de setFCMDeviceToken es independiente y no es necesario para la atribución push.

Kotlin Java
val pushSelectors = arrayOf(
    arrayOf("sng_link"),
    arrayOf("rootObj", "nestedObj", "anotherNested", "singularLink")
)

val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withPushNotificationPayload(intent, pushSelectors)

Singular.init(applicationContext, config)

Configuración de selectores:

  • Claves simples: Usa arrayOf("sng_link") para claves de nivel superior en el payload.
  • Claves anidadas: Usa arrayOf("rootObj", "nestedObj", "key") para recorrer estructuras JSON anidadas.
  • Múltiples rutas: Define múltiples arreglos de selectores para verificar diferentes ubicaciones posibles de los enlaces de Singular.

Guía de validación

Verificar el payload en Start Session

Confirma que los enlaces de notificaciones push se pasen correctamente a Singular inspeccionando la llamada al API de Start Session.

El SDK de Singular incluye el payload de la notificación push bajo el parámetro singular_link en la solicitud de Start Session cuando los usuarios tocan las notificaciones.

Ejemplo de uso de solicitud de Start Session:

https://sdk-api-v1.singular.net/api/v1/start?
a=<SDK-Key>
&singular_link=https://singularassist2.sng.link/C4nw9/r1m0?_dl=singular://test&_smtype=3
&i=net.singular.singularsampleapp
&s=1740905574084
&sdk=Singular/v12.6.2

Verificación alternativa: Usa la Singular SDK Console para verificar el seguimiento de notificaciones push. Revisa el campo Deeplink URL para confirmar que el enlace de seguimiento se capturó correctamente.


Configuración avanzada

Configuración de dominios ESP

Configura dominios externos si envuelves los enlaces de Singular dentro de dominios de proveedores de servicios de correo electrónico (ESP) u otros dominios de terceros.

Kotlin Java
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withESPDomains(listOf("sl.esp.link", "custom.domain.com"))

Nota de seguridad: De forma predeterminada, solo se permiten los dominios sng.link predefinidos en la página Manage Links de Singular. Configura los dominios ESP explícitamente si usas enlaces envueltos.


Enrutamiento dinámico de deep links

Implementa múltiples destinos de deep link desde una única notificación configurando un enlace de seguimiento de Singular con overrides dinámicos de redirección.

Ejemplo de uso: Una notificación de noticias de última hora con múltiples opciones de acción

  • Leer las últimas noticias: newsapp://article?id=12345
  • Temas en tendencia: newsapp://trending
  • Deportes: newsapp://sports

En lugar de crear múltiples enlaces de seguimiento, usa un único enlace de Singular y sobrescribe las redirecciones dinámicamente según la selección del usuario. Consulta Sobrescribir redirecciones en enlaces de seguimiento de Singular para detalles de implementación.


Consideraciones importantes

Notas de implementación

  • Sin manejador de callback: A diferencia de withSingularLink , la funcionalidad de notificaciones push no proporciona callbacks de payload. Implementa tu propia lógica de deep linking para enrutar a los usuarios a contenido específico dentro de tu app.
  • Flujo de atribución: Cuando los usuarios tocan notificaciones, Singular recupera el payload y lo incluye en el evento de Start Session disparado por Singular.init() . El backend procesa estos datos para atribuir el touchpoint de la notificación push y registrar el seguimiento de re-engagement.
  • Restricciones de dominio: Solo los dominios de enlaces de Singular ( sng.link ) de la página Manage Links están permitidos de forma predeterminada. Configura los dominios ESP explícitamente para enlaces envueltos usando withESPDomains()

Listo: Siguiendo estos pasos, tu app ahora realiza el seguimiento de las interacciones con notificaciones push con Singular, mejorando los insights de rendimiento de campañas y garantizando una atribución de re-engagement precisa.