Opciones avanzadas
Configure las funciones avanzadas del SDK, como la instalación de la recopilación de referencias, la gestión de sesiones, la integración de JavaScript y los identificadores de dispositivos alternativos para casos de uso especializados.
Instalar recopilación de referencias (dispositivos heredados)
Descripción general
El referente de instalación proporciona una atribución precisa al identificar en qué anuncio hizo clic el usuario antes de instalar su aplicación desde Google Play Store.
Obsoleto: Google ha dejado de utilizar la difusión de intenciones de INSTALL_REFERRER. Consulte ¿Sigue utilizando InstallBroadcast? Cambie a la Play Referrer API antes del 1 de marzo de 2020. Las versiones modernas de Singular SDK utilizan automáticamente la Google Play Referrer API.
Recopilación automática:
En los dispositivos con la última versión de Google Play Store, Singular SDK recopila automáticamente la referencia de instalación mediante la API de referencia de Google Play. La configuración manual sólo es necesaria para la compatibilidad con dispositivos heredados.
Integración con el receptor existente
Reenvíe los datos de referencia de instalación a Singular cuando su aplicación ya tenga un BroadcastReceiver para INSTALL_REFERRER.
Implementación:
Añada una llamada a SingularInstallReceiver dentro del método onReceive de su receptor existente.
class MyCustomInstallReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// Forward install referrer to Singular
SingularInstallReceiver().onReceive(context, intent)
// Your existing logic
// ...
}
}
public class MyCustomInstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Forward install referrer to Singular
new SingularInstallReceiver().onReceive(context, intent);
// Your existing logic
// ...
}
}
Registre el receptor de Singular
Configure el receptor de referencia de instalación de Singular cuando su aplicación no disponga de un gestor de INSTALL_REFERRER.
Configuración de AndroidManifest.xml:
<application>
<!-- Other application components -->
<receiver
android:name="com.singular.sdk.SingularInstallReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
Recomendación: Esta configuración sólo es necesaria para aplicaciones que soporten dispositivos muy antiguos. Las implementaciones modernas deberían confiar en la integración automática de Google Play Referrer API.
Gestión de sesiones
Gestión automática de sesiones
Singular SDK gestiona automáticamente la sesión para Android API 14 (Ice Cream Sandwich) y superiores sin necesidad de configuración adicional.
Comportamiento por defecto:
Cuando la app pasa a segundo plano durante 60 segundos o más, el SDK registra una nueva sesión al volver al primer plano.
Configurar el tiempo de espera de la sesión
Personalice la duración del tiempo de espera de la sesión para adaptarla a los patrones de uso de su aplicación.
Firma del método:
SingularConfig.withSessionTimeoutInSec(int timeoutInSeconds)
// Set session timeout to 120 seconds (2 minutes)
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withSessionTimeoutInSec(120)
Singular.init(applicationContext, config)
// Set session timeout to 120 seconds (2 minutes)
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withSessionTimeoutInSec(120);
Singular.init(getApplicationContext(), config);
Timeout Valores:
- Predeterminado: 60 segundos
- Mínimo: 0 segundos (cada transición fondo/primer plano crea una nueva sesión)
- Recomendado: 30-180 segundos dependiendo de los patrones de uso de la app
Gestión manual de sesiones (API < 14)
Para aplicaciones con minSdkVersion por debajo de 14, gestiona manualmente las sesiones llamando a los métodos del ciclo de vida en cada actividad.
Importante: La gestión manual de sesiones sólo es necesaria para las aplicaciones con niveles de API de Android inferiores a 14 (Ice Cream Sandwich). Las aplicaciones modernas pueden omitir esta sección.
Implementación
Llame a onActivityResumed() y onActivityPaused()en los métodos del ciclo de vida de cada actividad, o impleméntelos en una clase de actividad base.
class MainActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
Singular.onActivityResumed()
// Your other code
}
override fun onPause() {
super.onPause()
Singular.onActivityPaused()
// Your other code
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
Singular.onActivityResumed();
// Your other code
}
@Override
protected void onPause() {
super.onPause();
Singular.onActivityPaused();
// Your other code
}
}
Práctica recomendada: Si tienes una clase de actividad base común, implementa estas llamadas en los métodos onResume()y onPause() de la clase base en lugar de duplicar el código en todas las actividades.
Interfaz JavaScript para aplicaciones híbridas
Descripción general
Habilite la funcionalidad de Singular SDK desde código JavaScript en aplicaciones híbridas basadas en WebView utilizando SingularJSInterface.
Métodos admitidos:
- setCustomUserId: Establece el identificador de usuario personalizado
- unsetCustomUserId: Elimina el identificador de usuario personalizado
- event: Seguimiento de eventos con o sin atributos
- ingresos: Seguimiento de ingresos
Configurar integración WebView
Configure la interfaz JavaScript en el método onCreate() de su actividad para cada WebView que necesite funcionalidad Singular.
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(this, config)
// Configure WebView
val myWebView = findViewById<WebView>(R.id.webview)
myWebView.settings.javaScriptEnabled = true
myWebView.loadUrl("file:///android_asset/index.html")
// Add Singular JavaScript interface
val singularJSInterface = SingularJSInterface(this)
singularJSInterface.setWebViewId(R.id.webview)
myWebView.addJavascriptInterface(singularJSInterface, "SingularInterface")
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Singular SDK
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET");
Singular.init(this, config);
// Configure WebView
WebView myWebView = findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.loadUrl("file:///android_asset/index.html");
// Add Singular JavaScript interface
SingularJSInterface singularJSInterface = new SingularJSInterface(this);
singularJSInterface.setWebViewId(R.id.webview);
myWebView.addJavascriptInterface(singularJSInterface, "SingularInterface");
}
Múltiples WebViews:
- Configure la interfaz JavaScript para cada WebView de su aplicación
- Utilice el mismo nombre de interfaz ("SingularInterface") para mantener la coherencia.
- Establezca IDs de WebView únicos para cada instancia
Uso de JavaScript
Llame a los métodos de Singular desde el código JavaScript que se ejecuta en su WebView.
Seguimiento de eventos
// Simple event without attributes
SingularInterface.event('level_completed');
// Event with attributes (pass as JSON string)
SingularInterface.event('purchase_attempt',
JSON.stringify({
"item_name": "sword",
"item_category": "weapons",
"item_price": 9.99
})
);
Seguimiento de ingresos
// Track revenue in USD
SingularInterface.revenue('USD', 9.99);
// Track revenue in other currencies
SingularInterface.revenue('EUR', 8.50);
Gestión de ID de usuario personalizados
// Set custom user ID
SingularInterface.setCustomUserId('user_12345');
// Remove custom user ID
SingularInterface.unsetCustomUserId();
Identificadores de dispositivo alternativos
OAID (Identificador de publicidad abierto)
Habilite el seguimiento en dispositivos Android en regiones sin Google Play mediante el identificador de publicidad abierto (OAID).
Compatibilidad con OAID:
- Dispositivos Huawei: Implementación OAID propietaria de Huawei.
- Dispositivos MSA: Marcas miembro de la Mobile Security Alliance (OPPO, Vivo, Xiaomi, etc.)
Requisitos previos
Integre tanto el SDK de MSAcomo el SDK de OAID deHuawei para recopilar OAID en todas las plataformas compatibles.
Habilitar la recopilación de OAID
Configure el SDK Singular para recopilar y utilizar OAID para el seguimiento.
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withOAIDCollection()
Singular.init(applicationContext, config)
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withOAIDCollection();
Singular.init(getApplicationContext(), config);
Detecciónautomática:
- El SDK detecta automáticamente si el dispositivo tiene un OAID.
- El SDK selecciona el SDK OAID apropiado (MSA o Huawei) basado en el dispositivo
- Amazon Advertising ID (AMID) se recoge automáticamente sin dependencias adicionales
IMEI (Identidad Internacional de Equipo Móvil)
Recopila el número IMEI del dispositivo para el seguimiento en dispositivos en regiones sin Google Play Services.
Advertencia crítica: La recopilación de IMEI infringe el acuerdo de Google Play Services. Utiliza la recopilación de IMEI sólo para aplicaciones distribuidas fuera de Google Play Store en regiones sin servicios de Google.
Añadir permiso requerido
Añade el permiso READ_PHONE_STATE a tu AndroidManifest.xml.
<manifest>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application>
<!-- Your application components -->
</application>
</manifest>
Recuperar el número IMEI
Obtenga el IMEI del dispositivo utilizando TelephonyManager con el manejo adecuado del nivel de API.
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val imei: String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
telephonyManager.imei
} else {
@Suppress("DEPRECATION")
telephonyManager.deviceId
}
// Validate IMEI before use
if (imei != null && imei.isNotEmpty()) {
// Send to Singular
Log.d("IMEI", "Retrieved: $imei")
} else {
Log.w("IMEI", "Failed to retrieve IMEI")
}
TelephonyManager telephonyManager =
(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String imei = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imei = telephonyManager.getImei();
} else {
imei = telephonyManager.getDeviceId();
}
// Validate IMEI before use
if (imei != null && !imei.isEmpty()) {
// Send to Singular
Log.d("IMEI", "Retrieved: " + imei);
} else {
Log.w("IMEI", "Failed to retrieve IMEI");
}
Enviar IMEI a Singular
Configure el IMEI durante la inicialización del SDK (recomendado) o configúrelo dinámicamente después de la inicialización.
Opción 1: Método de configuración (recomendado)
// Set IMEI during initialization
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withIMEI(imei)
Singular.init(applicationContext, config)
// Set IMEI during initialization
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withIMEI(imei);
Singular.init(getApplicationContext(), config);
Opción 2: Método en tiempo de ejecución
// Set IMEI after initialization
Singular.setIMEI(imei)
// Set IMEI after initialization
Singular.setIMEI(imei);
Práctica recomendada: Configure el IMEI en SingularConfigantes de la inicialización del SDK para asegurarse de que esté disponible desde la primera sesión. Utilice setIMEI() sólo cuando el IMEI esté disponible después de la inicialización.