Instalación
Instalación del paquete SDK
Añade el SDK de Singular para Flutter a tu proyecto utilizando el gestor de dependencias pubspec.yaml. El SDK proporciona enlaces Dart a los SDK nativos de Singular para iOS y Android.
Añadir la dependencia del SDK
-
Actualiza pubspec.yaml: añade la dependencia del SDK de Singular para Flutter
al archivo `
pubspec.yaml` de tu proyecto:dependencies: flutter: sdk: flutter singular_flutter_sdk: ^1.8.0 -
Instalar dependencias: Navega hasta el directorio de tu proyecto
en la terminal y ejecuta:
flutter packages get
Configuración de la plataforma
Configuración de iOS
Completa la configuración específica de iOS para habilitar la compatibilidad del marco AdServices con el seguimiento de atribución de iOS.
Añadir el marco AdServices
El marco AdServices es necesario para la atribución de Apple Search Ads y la integración de SKAdNetwork en iOS 14.3 y versiones posteriores.
-
Accede al proyecto de iOS: abre el directorio iOS de tu proyecto de Flutter
y localiza el espacio de trabajo de Xcode.
-
Ve a la carpeta «
ios» de tu proyecto de Flutter. -
Abre
Runner.xcworkspaceen Xcode (utiliza.xcworkspacesi usas CocoaPods; de lo contrario, utiliza.xcodeproj).
-
Ve a la carpeta «
-
Añade el marco AdServices: configura el marco
en los ajustes de tu proyecto de Xcode.
- En Xcode, selecciona el destino de tu proyecto (por ejemplo, «Runner»).
- Ve a la pestaña General.
- Desplázate hasta la sección «Frameworks, Libraries, and EmbeddedContent» .
- Haz clic en el botón +.
-
Busca «
AdServices.framework» y añádelo. - Establece el estado del marco en Opcional (garantiza la compatibilidad con versiones anteriores de iOS).
¿Por qué Opcional? Establecer AdServices como opcional garantiza que tu aplicación siga siendo compatible con las versiones de iOS que no incluyen este marco (iOS 14.2 y anteriores).
Configuración de Android
Configura tus archivos de compilación de Android para añadir los permisos y dependencias necesarios para que el SDK funcione correctamente.
Añadir los permisos necesarios
Añade estos permisos a tu archivo ` AndroidManifest.xml ` bajo
la etiqueta ` <manifest> ` para habilitar la funcionalidad básica del SDK.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
Importante: Excluye el
permiso com.google.android.gms.permission.AD_ID si
estás integrando el
SDK para niños.
Este permiso es necesario para la recopilación de GAID en aplicaciones estándar,
pero debe omitirse en aplicaciones dirigidas a menores de 13 años.
Compatibilidad con Samsung Galaxy Store
Para habilitar el seguimiento de referencias de instalación desde Samsung Galaxy Store, añada lo
siguiente a su AndroidManifest.xml:
<queries>
<package android:name="com.sec.android.app.samsungapps" />
</queries>
Dependencias transitivas
Si ha desactivado las dependencias transitivas para el SDK de Singular en su configuración de Gradle, añada manualmente estas dependencias necesarias:
dependencies {
// Required for install referrer tracking
implementation 'com.android.installreferrer:installreferrer:2.2'
// Required for App Set ID
implementation 'com.google.android.gms:play-services-appset:16.0.0'
}
Configuración de ProGuard
Al compilar APK de lanzamiento, ProGuard (o R8) puede eliminar u ofuscar las clases del SDK . Añade estas reglas de retención para preservar la funcionalidad de Singular.
Por qué es importante: ProGuard está habilitado de forma predeterminada en las compilaciones de lanzamiento de Flutter para Android. Sin las reglas de conservación adecuadas, es posible que el SDK no funcione correctamente en producción.
-
Localiza el archivo de ProGuard: ve a
android/app/proguard-rules.proen tu proyecto de Flutter. -
Añade reglas de retención: añade las siguientes reglas para conservar
las clases del SDK:
# Preserve Singular SDK classes -keep class com.singular.sdk.** { *; } # Preserve Android Install Referrer library -keep public class com.android.installreferrer.** { *; } # Uncomment if using Singular revenue tracking with Google Play Billing Library #-keep public class com.android.billingclient.** { *; }
Integración del SDK
Cumplimiento de la normativa de privacidad: Cumpla con las leyes de privacidad de sus regiones de operación, incluyendo el RGPD, la CCPA, la COPPA y otras, al implementar el SDK de Singular. Para obtener orientación, consulte Prácticas de inclusión y exclusión del SDK.
Inicialice el SDK de Singular cada vez que se inicie su aplicación. La inicialización del SDK es esencial para todas las funciones de atribución de Singular y crea una nueva sesión para calcular las métricas de retención de usuarios.
Importar clases del SDK
Importe las clases del SDK de Singular al principio del archivo principal de su aplicación
(normalmente main.dart).
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
Acerca del SDID
El Singular Device ID (SDID) es un identificador a nivel de dispositivo que Singular genera y administra. En una integración híbrida, donde este SDK se ejecuta en tu app y tu servidor también envía eventos a través de la API Server-to-Server (S2S), enviar el mismo SDID en esos eventos del lado del servidor los vincula al mismo dispositivo que el SDK está rastreando. Esto permite que Singular atribuya la actividad del SDK y de S2S a un único dispositivo sin depender de identificadores publicitarios específicos de la plataforma.
SDID habilitado de forma predeterminada: A partir del 15 de julio de 2026, el Singular Device ID (SDID) está habilitado de forma predeterminada para los nuevos clientes de Singular. El SDK genera y resuelve el SDID automáticamente durante la inicialización, por lo que no se requiere configuración adicional. El siguiente ejemplo registra el callback de recepción del SDID para que puedas confirmar en tus logs que el SDK recibió el SDID.
El SDID personalizado es una función enterprise: Establecer un SDID personalizado es una función enterprise y no está habilitada de forma predeterminada. No configures un SDID personalizado a menos que tu cuenta esté habilitada para ello; comunícate con tu Singular Customer Success Manager. Los ejemplos a continuación intencionalmente no configuran un SDID personalizado.
Inicialice el SDK
Cree un objeto ` SingularConfig ` con sus credenciales del SDK,
configure las funciones opcionales e inicialice el SDK utilizando el
método ` start() `.
Inicialización básica
- Obtener credenciales: Inicie sesión en su cuenta de Singular y vaya a Herramientas para desarrolladores > Integración del SDK > Claves del SDK para encontrar su clave y secreto del SDK.
-
Crear configuración: instancie un
objeto
SingularConfigcon sus credenciales. - Añadir configuración: Opcionalmente, configura el comportamiento del SDK utilizando los setters de propiedades (consulta Referencia de configuración).
-
Inicializar el SDK: Llama a
Singular.start()para iniciar el SDK.
Ejemplo de inicialización
Inicialice el SDK en el punto de entrada de su aplicación, normalmente dentro del
método initState() de su StatefulWidget principal.
import 'package:flutter/material.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
// Create configuration with credentials
SingularConfig config = SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
);
// Log the SDID once the SDK receives it (SDID is enabled by default for new accounts)
config.sdidReceivedCallback = (String sdid) {
print('Singular SDID received: $sdid');
};
// Enable debug logging
config.enableLogging = true;
config.logLevel = 4;
// Set session timeout (in seconds)
config.sessionTimeout = 60.0;
// Initialize SDK
Singular.start(config);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
Ejemplo de configuración avanzada
Configure múltiples funciones del SDK durante la inicialización estableciendo propiedades adicionales
en el objeto SingularConfig antes de llamar a
start() .
import 'package:flutter/material.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
import 'package:singular_flutter_sdk/singular_link_params.dart';
import 'package:singular_flutter_sdk/singular_global_property.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
initializeSingularSDK();
}
void initializeSingularSDK() {
// Create configuration with credentials
SingularConfig config = SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
);
// User identification
config.customUserId = 'user_123456';
// Privacy settings
config.limitDataSharing = false;
// Deep linking handler
config.singularLinksHandler = (SingularLinkParams params) {
print('Deep link received: ${params.deeplink}');
print('Passthrough params: ${params.passthrough}');
print('Is deferred: ${params.isDeferred}');
// Handle navigation based on deep link
};
// Short link timeout
config.shortLinkResolveTimeOut = 10.0;
// Facebook integration
config.facebookAppId = 'YOUR_FACEBOOK_APP_ID';
// SKAdNetwork settings (iOS)
config.skAdNetworkEnabled = true;
config.manualSkanConversionManagement = false;
config.waitForTrackingAuthorizationWithTimeoutInterval = 30;
// Conversion value callbacks (iOS)
config.conversionValueUpdatedCallback = (int conversionValue) {
print('Conversion value updated: $conversionValue');
};
config.conversionValuesUpdatedCallback = (int cv, int coarse, bool lock) {
print('Fine: $cv, Coarse: $coarse, Locked: $lock');
};
// Global properties
config.globalProperties = [
SingularGlobalProperty('app_version', '2.5.0', true),
SingularGlobalProperty('user_tier', 'premium', false)
];
// Debugging
config.enableLogging = true;
config.logLevel = 4;
// Session timeout
config.sessionTimeout = 60.0;
// Initialize SDK
Singular.start(config);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
Referencia de configuración: Para obtener una lista completa de las opciones de configuración disponibles, consulta la Referencia de configuración del SDK de Flutter.
Importante: NO utilice la clave de la API de Singular Reporting. Utilice únicamente las credenciales específicas del SDK que se indican en la página de integración del SDK . El uso de credenciales incorrectas impide que los datos lleguen a Singular.
Configuración avanzada
Requisitos para la medición de conversiones integrada de Google Ads en iOS
Si su aplicación ejecuta campañas de Google Ads dirigidas a usuarios de iOS 14.5 o superior, se requieren pasos de configuración adicionales del SDK para admitir la medición de conversiones integrada (ICM) de iOS. Esto incluye:
- Integrar el SDK de medición en el dispositivo (ODM) de Google
- Actualización al SDK de Singular para iOS v12.8.1+ (o v5.5.0+ para Unity, v1.8.0+ para Flutter/Cordova, v3.9.0+ para React Native)
-
Añadir el indicador del enlazador «
-ObjC» y habilitar «enableOdmWithTimeoutInterval» enSingularConfig
Nota: Al habilitar enableOdmWithTimeoutInterval
se retrasa la inicialización del SDK
y puede aplazarse la recepción de callbacks de enlaces profundos. Realice esta configuración
durante la implementación inicial del SDK para evitar tener que volver a trabajar en ello.
Consulte los requisitos técnicos completos de ICM para iOS