Instalar y configurar el SDK de Flutter
El SDK de Adapty incluye dos módulos clave para una integración fluida en tu app de Flutter:
- Core Adapty: el SDK esencial, necesario para que Adapty funcione correctamente en tu app.
- AdaptyUI: necesario si usas el Adapty Paywall Builder, una herramienta visual sin código para crear paywalls multiplataforma fácilmente.
¿Quieres ver un ejemplo real de cómo se integra el SDK de Adapty en una app móvil? Consulta nuestra app de ejemplo, que muestra la configuración completa: visualización de paywalls, compras y otras funciones básicas.
Requisitos
El SDK de Adapty es compatible con iOS 13.0+, pero requiere iOS 15.0+ para funcionar correctamente con paywalls creados en el Paywall Builder.
Adapty es compatible con Google Play Billing Library hasta la versión 8.x. Por defecto, Adapty trabaja con Google Play Billing Library v.7.0.0, pero si quieres forzar una versión posterior, puedes añadir la dependencia manualmente.
Instalar el SDK es el paso 5 de la configuración de Adapty. Para que las compras funcionen en tu app, también necesitas conectar tu app a los stores, y luego crear productos, un paywall y un placement en el Adapty Dashboard. La guía de inicio rápido explica todos los pasos necesarios.
Instalar el SDK de Adapty
-
Añade Adapty a tu archivo
pubspec.yaml:dependencies: adapty_flutter: ^<the latest SDK version> -
Ejecuta el siguiente comando para instalar las dependencias:
flutter pub get -
Importa los SDKs de Adapty en tu aplicación:
import 'package:adapty_flutter/adapty_flutter.dart';
Activar el módulo Adapty del SDK de Adapty
Activa el SDK de Adapty en el código de tu app.
El SDK de Adapty solo necesita activarse una vez en tu app.
Para obtener tu Public SDK Key:
- Ve al Adapty Dashboard y navega a App settings → General.
- En la sección Api keys, copia la Public SDK Key (NO la Secret Key).
- Reemplaza
"YOUR_PUBLIC_SDK_KEY"en el código.
- Asegúrate de usar la Public SDK key para inicializar Adapty; la Secret key solo debe usarse para la API del servidor.
- Las SDK keys son únicas para cada app, así que si tienes varias apps asegúrate de elegir la correcta.
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
_initializeAdapty();
super.initState();
}
Future<void> _initializeAdapty() async {
try {
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY'),
);
} catch (e) {
// handle the error
}
}
Widget build(BuildContext context) {
return Text("Hello");
}
}
Espera a que activate se resuelva antes de llamar a cualquier otro método del SDK de Adapty. Consulta Orden de llamadas en el SDK de Flutter para ver la secuencia completa.
Ahora configura los paywalls en tu app:
- Si usas Adapty Paywall Builder, primero activa el módulo AdaptyUI a continuación y luego sigue la guía de inicio rápido de Paywall Builder.
- Si construyes tu propia UI de paywall, consulta la guía de inicio rápido para paywalls personalizados.
Activar el módulo AdaptyUI del SDK de Adapty
Si tienes previsto usar el Paywall Builder y has instalado el módulo AdaptyUI, también necesitas activar AdaptyUI:
Las dependencias relacionadas con AdaptyUI se vinculan a tu app independientemente de si AdaptyUI está activado.
En tu código, debes activar el módulo principal de Adapty antes de activar AdaptyUI.
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withActivateUI(true), // This automatically activates AdaptyUI
);
Configuración opcional
Registro de actividad
Configurar el sistema de registro
Adapty registra errores y otra información importante para ayudarte a entender qué está ocurriendo. Los niveles disponibles son los siguientes:
| Nivel | Descripción |
|---|---|
AdaptyLogLevel.none | No se registrará nada. Valor por defecto |
AdaptyLogLevel.error | Solo se registrarán los errores |
AdaptyLogLevel.warn | Se registrarán los errores y los mensajes del SDK que no causan errores críticos pero merecen atención. |
AdaptyLogLevel.info | Se registrarán errores, advertencias y varios mensajes informativos. |
AdaptyLogLevel.verbose | Se registrará cualquier información adicional que pueda resultar útil durante la depuración, como llamadas a funciones, consultas a la API, etc. |
Puedes establecer el nivel de registro en tu app antes de configurar Adapty:
// Set log level before activation.
// 'verbose' is recommended for development and the first production release
await Adapty().setLogLevel(AdaptyLogLevel.verbose);
// Or set it during configuration
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withLogLevel(AdaptyLogLevel.verbose),
);
Políticas de datos
Adapty no almacena datos personales de tus usuarios a menos que los envíes explícitamente, pero puedes implementar políticas de seguridad de datos adicionales para cumplir con las directrices del store o del país.
Desactivar la recopilación y el uso compartido de direcciones IP
Al activar el módulo de Adapty, establece ipAddressCollectionDisabled en true para desactivar la recopilación y el uso compartido de la dirección IP del usuario. El valor por defecto es false.
Usa este parámetro para mejorar la privacidad del usuario, cumplir con las normativas regionales de protección de datos (como el RGPD o la CCPA), o reducir la recopilación innecesaria de datos cuando las funciones basadas en IP no son necesarias para tu app.
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withIpAddressCollectionDisabled(true),
);
Desactivar la recopilación y el uso compartido del ID publicitario
Al activar el módulo de Adapty, establece appleIdfaCollectionDisabled (iOS) o googleAdvertisingIdCollectionDisabled (Android) en true para desactivar la recopilación de identificadores publicitarios. El valor por defecto es false.
Usa este parámetro para cumplir con las políticas de App Store/Play Store, evitar que se active la solicitud de App Tracking Transparency, o si tu app no requiere atribución publicitaria ni analíticas basadas en IDs publicitarios.
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withAppleIdfaCollectionDisabled(true) // iOS
..withGoogleAdvertisingIdCollectionDisabled(true), // Android
);
Configurar la caché de medios para AdaptyUI
El módulo se activa automáticamente con el SDK de Adapty. Si no usas el Paywall Builder y quieres desactivar el módulo AdaptyUI, pasa withActivateUI(false) durante la activación.
Por defecto, AdaptyUI almacena en caché los medios (como imágenes y vídeos) para mejorar el rendimiento y reducir el uso de red. Puedes personalizar la configuración de la caché proporcionando una configuración personalizada.
Usa withMediaCacheConfiguration para cambiar el tamaño predeterminado de la caché y el período de validez. Es opcional: si no llamas a este método, se usarán los valores por defecto (100 MB en disco, sin límite de elementos en memoria). Sin embargo, si usas la configuración, debes incluir todos los parámetros.
final mediaCacheConfig = AdaptyUIMediaCacheConfiguration(
memoryStorageTotalCostLimit: 200 * 1024 * 1024, // 200 MB
memoryStorageCountLimit: 2147483647, // max int value
diskStorageSizeLimit: 200 * 1024 * 1024, // 200 MB
);
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withMediaCacheConfiguration(mediaCacheConfig),
);
Parámetros:
| Parámetro | Presencia | Descripción |
|---|---|---|
| memoryStorageTotalCostLimit | opcional | Tamaño total de la caché en memoria en bytes. El valor por defecto es 100 MB. |
| memoryStorageCountLimit | opcional | Límite de elementos en el almacenamiento en memoria. El valor por defecto es el máximo entero. |
| diskStorageSizeLimit | opcional | Límite del tamaño de archivo en disco en bytes. El valor por defecto es 100 MB. |
Activar niveles de acceso locales (Android)
Por defecto, los niveles de acceso locales están habilitados en iOS y deshabilitados en Android. Para habilitarlos también en Android, establece withGoogleLocalAccessLevelAllowed en true:
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withGoogleLocalAccessLevelAllowed(true),
);
Borrar datos al restaurar desde copia de seguridad
Cuando clearDataOnBackup se establece en true, el SDK detecta cuándo la app se restaura desde una copia de seguridad de iCloud y elimina todos los datos del SDK almacenados localmente, incluyendo la información de perfil en caché, los detalles de productos y los paywalls. El SDK se inicializa entonces con un estado limpio. El valor por defecto es false.
Solo se elimina la caché local del SDK. El historial de transacciones con Apple y los datos del usuario en los servidores de Adapty permanecen sin cambios.
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withClearDataOnBackup(true) // default – false
);
Solución de problemas
Reglas de copia de seguridad en Android (configuración de Auto Backup)
Algunos SDKs (incluido Adapty) incluyen su propia configuración de Android Auto Backup. Si utilizas varios SDKs que definen reglas de copia de seguridad, el fusionador de manifiestos de Android puede fallar con un error relacionado con android:fullBackupContent, android:dataExtractionRules o android:allowBackup.
Síntomas típicos del error: Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules) is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)
Estos cambios deben realizarse en el directorio de la plataforma Android (normalmente en la carpeta android/ de tu proyecto).
Para resolverlo, necesitas:
-
Indicar al fusionador de manifiestos que use los valores de tu app para los atributos relacionados con la copia de seguridad.
-
Crear archivos de reglas de copia de seguridad que combinen las reglas de Adapty con las de otros SDKs.
1. Añade el namespace tools a tu manifiesto
En tu archivo AndroidManifest.xml, asegúrate de que la etiqueta raíz <manifest> incluya tools:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">
...
</manifest>
2. Sobreescribe los atributos de copia de seguridad en <application>
En el mismo archivo AndroidManifest.xml, actualiza la etiqueta <application> para que tu app proporcione los valores definitivos e indique al fusionador de manifiestos que reemplace los valores de las librerías:
<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/sample_backup_rules"
android:dataExtractionRules="@xml/sample_data_extraction_rules"
tools:replace="android:fullBackupContent,android:dataExtractionRules">
...
</application>
Si algún SDK también define android:allowBackup, inclúyelo en tools:replace:
tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"
3. Crea los archivos de reglas de copia de seguridad combinadas
Crea archivos XML en el directorio res/xml/ de tu proyecto Android que combinen las reglas de Adapty con las de otros SDKs. Android utiliza distintos formatos de reglas de copia de seguridad según la versión del sistema operativo, por lo que crear ambos archivos garantiza la compatibilidad con todas las versiones de Android que admite tu app.
Los ejemplos a continuación usan AppsFlyer como SDK de terceros de muestra. Reemplaza o añade reglas para cualquier otro SDK que uses en tu app.
Para Android 12 y superior (usa el nuevo formato de reglas de extracción de datos):
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="appsflyer-purchase-data"/>
<exclude domain="database" path="afpurchases.db"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="appsflyer-purchase-data"/>
<exclude domain="database" path="afpurchases.db"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
</device-transfer>
</data-extraction-rules>
Para Android 11 e inferior (usa el formato legado de contenido de copia de seguridad completa):
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
Las compras fallan al volver desde otra app en Android
Si la Activity que inicia el flujo de compra utiliza un launchMode distinto al predeterminado, Android puede recrearla o reutilizarla de forma incorrecta cuando el usuario vuelve desde Google Play, una app bancaria o un navegador. Esto puede provocar que el resultado de la compra se pierda o se trate como cancelado.
Para garantizar que las compras funcionen correctamente, usa solo los modos de lanzamiento standard o singleTop para la Activity que inicia el flujo de compra, y evita cualquier otro modo.
En tu AndroidManifest.xml, asegúrate de que la Activity que inicia el flujo de compra tenga el modo standard o singleTop:
<activity
android:name=".MainActivity"
android:launchMode="standard" />
Errores de compilación de Swift 6 causados por la sobreescritura de SWIFT_VERSION en el Podfile
Al compilar tu app de Flutter para iOS, es posible que veas errores de compilación de Swift 6 en los targets de los pods de Adapty. Los síntomas habituales incluyen incompatibilidades de @Sendable en AdaptyUIBuilderLogic, falta de conformidad Sendable en los tipos de Adapty, o errores de aislamiento de actores.
Los pods de Adapty declaran s.swift_version = '6.0' y requieren Swift 6 para compilar. El código de tu propia app puede seguir usando Swift 5: solo los targets de los pods de Adapty (Adapty, AdaptyUI, AdaptyUIBuilder, AdaptyLogger, AdaptyPlugin) necesitan compilarse con Swift 6.
La causa más común es un hook post_install en ios/Podfile que sobreescribe SWIFT_VERSION para todos los targets de pods:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '5.9'
end
end
end
Solución: excluye los targets de los pods de Adapty de la sobreescritura:
post_install do |installer|
installer.pods_project.targets.each do |target|
next if %w[Adapty AdaptyUI AdaptyUIBuilder AdaptyLogger AdaptyPlugin].include?(target.name)
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '5.9'
end
end
end
Luego ejecuta pod install desde el directorio ios/ y vuelve a compilar.
Para verificarlo, abre ios/Pods/Pods.xcodeproj, selecciona el target del pod Adapty → Build Settings → Swift Language Version. Debe aparecer como Swift 6.