SDK de Android - Tracking de desinstalación

Tracking de desinstalación

Rastrea las desinstalaciones de aplicaciones para medir la retención de usuarios y optimizar las campañas de reengagement integrando Firebase Cloud Messaging (FCM) con el SDK de Singular.

Importante: Google declaró obsoletas las API de GCM en abril de 2018. Usa Firebase Cloud Messaging (FCM) para todas las implementaciones de tracking de desinstalación.

Requisitos previos

Configurar la plataforma de Singular

Antes de implementar el tracking de desinstalación en tu aplicación, configura tu app en la plataforma de Singular y completa los pasos de integración del SDK de Android + FCM descritos en Configuración del tracking de desinstalación en Android .


Requisitos del sistema

El tracking de desinstalación requiere Firebase Cloud Messaging y configuraciones específicas del dispositivo.

Requisitos de FCM ( fuente ):

  • Versión de Android: Los dispositivos deben ejecutar Android 4.1 (API 16) o superior
  • Servicios de Google Play: Los dispositivos deben tener la aplicación Google Play Store instalada
  • Compatibilidad con emuladores: Se admiten emuladores con Android 4.1+ que incluyan las API de Google
  • Distribución: Las aplicaciones pueden distribuirse fuera de Google Play Store y aun así admitir el tracking de desinstalación

Nota: Los usuarios con versiones de Android no compatibles o dispositivos sin los Servicios de Google Play no serán rastreados para desinstalaciones.


Pasos de implementación

Paso 1: Integrar Firebase Cloud Messaging

Configura Firebase Cloud Messaging en tu aplicación si aún no está configurado.

Sigue la guía oficial de Google para Configurar una aplicación cliente de Firebase Cloud Messaging en Android . Esto incluye:

  1. Agregar Firebase a tu proyecto de Android
  2. Agregar la dependencia del SDK de FCM a tu app/build.gradle
  3. Crear una clase Firebase Messaging Service
  4. Solicitar permisos de notificación (Android 13+)

Paso 2: Confirmar la configuración de FCM en AndroidManifest.xml

Verificar el servicio y los permisos de FCM

Asegúrate de que tu aplicación ya esté integrada con Firebase Cloud Messaging y que el manifiesto de Android declare un FirebaseMessagingService para recibir los mensajes de FCM.

XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.package">

    <!-- FCM Permissions -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <application>

        <!-- App Firebase Messaging Service -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

    </application>

</manifest>

Importante: Reemplaza .MyFirebaseMessagingService por el nombre completamente calificado de tu clase que extiende FirebaseMessagingService . Solo un servicio debe manejar el intent com.google.firebase.MESSAGING_EVENT en tu aplicación.


Paso 3: Registrar el token de dispositivo de FCM

Obtén el token de dispositivo de FCM y envíalo a Singular para el tracking de desinstalación.

Obtener y establecer el token

Obtén el token de FCM y regístralo en Singular inmediatamente después de inicializar el SDK.

Kotlin Java
import com.google.firebase.messaging.FirebaseMessaging
import com.singular.sdk.Singular

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Initialize Singular SDK
        val config = SingularConfig("SDK_KEY", "SDK_SECRET")
        Singular.init(applicationContext, config)

        // Retrieve and register FCM token
        FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w("FCM", "Fetching FCM token failed", task.exception)
                return@addOnCompleteListener
            }

            // Get FCM token
            val token = task.result

            // Register token with Singular
            Singular.setFCMDeviceToken(token)
            Log.d("FCM", "FCM token registered with Singular: $token")
        }
    }
}

Mejor práctica: Registra el token de FCM inmediatamente después de Singular.init() para garantizar que el tracking de desinstalación esté habilitado desde la primera sesión de la aplicación.

Singular.setFCMDeviceToken() no realiza ninguna acción de forma silenciosa si se llama antes de que Singular.init() se complete, o si el argumento del token es null o está vacío. Si el registro del token parece no hacer nada, confirma que el SDK se inicializó primero y que el token de FCM devuelto por Firebase es una cadena no vacía.


Manejar la actualización del token

Actualiza el token de FCM en Singular cada vez que se renueve para mantener un tracking de desinstalación preciso.

Kotlin Java
import com.google.firebase.messaging.FirebaseMessagingService
import com.singular.sdk.Singular

class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)

        // Send updated token to Singular
        Singular.setFCMDeviceToken(token)
        Log.d("FCM", "New FCM token registered: $token")

        // Also send token to your server if needed
        sendTokenToServer(token)
    }

    private fun sendTokenToServer(token: String) {
        // Implement your server communication logic here
    }
}

Importante: Los tokens de FCM pueden actualizarse en cualquier momento (actualizaciones de la app, restauración del dispositivo, etc.). Implementa siempre onNewToken() para mantener a Singular actualizado.


Método de configuración alternativo

Establecer el token durante la inicialización

Si tienes el token de FCM disponible antes de la inicialización del SDK, configúralo en el objeto SingularConfig .

Kotlin Java
// Get token synchronously (if cached)
val cachedToken = getStoredFCMToken() // Your caching logic

val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withFCMDeviceToken(cachedToken)

Singular.init(applicationContext, config)

Firma del método:

public SingularConfig withFCMDeviceToken(String fcmDeviceToken);

withFCMDeviceToken solo inicializa el SDK con el token que tienes en el momento de la inicialización. No se suscribe a las actualizaciones del token. Aún debes implementar FirebaseMessagingService.onNewToken y llamar a Singular.setFCMDeviceToken(newToken) allí para mantener actualizado el registro de Singular. El método de configuración también no realiza ninguna acción de forma silenciosa si el token proporcionado es null o está vacío.


Verificación y solución de problemas

Verificar la implementación

Confirma que el tracking de desinstalación esté funcionando correctamente.

  1. Verifica los logs: Confirma que el registro del token de FCM aparece en tus logs
  2. Prueba la generación del token: Asegúrate de que los tokens se generen en el primer lanzamiento de la aplicación
  3. Monitorea el dashboard: Revisa el dashboard de Singular para ver los datos de tracking de desinstalación después de 24-48 horas
  4. Prueba la actualización del token: Borra los datos de la aplicación y verifica que el token se actualice correctamente

Problemas comunes

  • Token no generado: Verifica que las dependencias de FCM se hayan agregado correctamente y que Firebase esté configurado en tu proyecto
  • El token no se actualiza: Verifica que el callback de onNewToken() esté implementado en tu FirebaseMessagingService
  • Datos faltantes: Asegúrate de que los dispositivos cumplan con los requisitos de FCM (Android 4.1+, Servicios de Google Play instalados)
  • Error de configuración: Confirma que el tracking de desinstalación esté habilitado en la configuración de la plataforma de Singular

Recursos adicionales: Para una solución de problemas detallada, consulta la Guía de configuración del tracking de desinstalación y la Documentación de Firebase Cloud Messaging .