Capacitor - Instalación y configuración del SDK de Adapty

El SDK de Adapty incluye dos módulos principales para integrarse en tu app de Capacitor:

  • Core Adapty: Este módulo es necesario para que Adapty funcione correctamente en tu app.
  • AdaptyUI: Este módulo es necesario si utilizas el Adapty Paywall Builder, una herramienta visual sin código para crear paywalls multiplataforma fácilmente. AdaptyUI se activa automáticamente junto con el módulo principal.

¿Quieres ver un ejemplo real de cómo se integra el SDK de Adapty en una app móvil? Echa un vistazo a nuestras apps de ejemplo, donde se muestra la configuración completa: cómo mostrar paywalls, realizar compras y otras funciones básicas.

Requisitos

El SDK de Adapty para Capacitor tiene los siguientes requisitos de versión:

Versión del SDK de AdaptyVersión de CapacitorVersión de iOS
3.16.0+815.0+
3.15714.0+

Las versiones 6 e inferiores de Capacitor no están soportadas.

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

Release

Instala el SDK de Adapty:

npm install @adapty/capacitor
npx cap sync

Activar el módulo Adapty del SDK

El SDK solo necesita activarse una vez en tu app.

Para obtener tu Public SDK Key:

  1. Ve al Adapty Dashboard y navega a App settings → General.
  2. En la sección Api keys, copia la Public SDK Key (NO la Secret Key).
  3. 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.

Copia el siguiente código en cualquier archivo de tu app para activar Adapty:


try {
  await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
      // verbose logging is recommended for the development purposes and for the first production release
        logLevel: 'verbose',
      // in the development environment, use this variable to avoid multiple activation errors. Set it to your development environment variable
      __ignoreActivationOnFastRefresh: true,
    }
  });
  console.log('Adapty activated successfully!');
} catch (error) {
  console.error('Failed to activate Adapty SDK:', error);
}

Espera a que activate se resuelva antes de llamar a cualquier otro método del SDK de Adapty. Consulta el orden de llamadas en el SDK de Capacitor para ver la secuencia completa.

Para evitar errores de activación en el entorno de desarrollo, usa los consejos.

Ahora configura los paywalls en tu app:

Activar el módulo AdaptyUI del SDK de Adapty

Si planeas usar el Paywall Builder, necesitas el módulo AdaptyUI. Se activa automáticamente cuando activas el módulo principal; no necesitas hacer nada más.

Configuración opcional

Registro

Configura el sistema de registro

Adapty registra errores y otra información importante para ayudarte a entender qué está ocurriendo. Hay los siguientes niveles disponibles:

NivelDescripción
errorSolo se registrarán errores
warnSe registrarán errores y mensajes del SDK que no causan errores críticos, pero que conviene tener en cuenta
infoSe registrarán errores, advertencias y varios mensajes informativos
verboseSe registrará cualquier información adicional que pueda ser útil durante la depuración, como llamadas a funciones, consultas a la API, etc.
Puedes establecer el nivel de log en tu app antes o durante la configuración de Adapty:
// Set log level before activation
adapty.setLogLevel({ logLevel: 'verbose' });

// Or set it during configuration
await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    logLevel: '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 adicionales de seguridad de datos para cumplir con las directrices de la 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 predeterminado es false. Usa este parámetro para mejorar la privacidad del usuario, cumplir con normativas regionales de protección de datos (como GDPR o CCPA) o reducir la recopilación de datos innecesaria cuando las funciones basadas en IP no son necesarias para tu app.

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    ipAddressCollectionDisabled: true,
  }
});

Deshabilitar la recopilación y el uso compartido del ID publicitario

Al activar el módulo de Adapty, establece ios.idfaCollectionDisabled (iOS) o android.adIdCollectionDisabled (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 aparezca el aviso de App Tracking Transparency, o si tu app no necesita atribución publicitaria ni análisis basados en IDs publicitarios.

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    ios: {
      idfaCollectionDisabled: true,
    },
    android: {
      adIdCollectionDisabled: true,
    },
  }
});

Configurar la caché de medios para AdaptyUI

Por defecto, AdaptyUI guarda 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 mediaCache para sobreescribir la configuración de caché predeterminada:

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    mediaCache: {
      memoryStorageTotalCostLimit: 200 * 1024 * 1024, // Optional: memory cache size in bytes
      memoryStorageCountLimit: 2147483647,            // Optional: max number of items in memory
      diskStorageSizeLimit: 200 * 1024 * 1024,       // Optional: disk cache size in bytes
    },
  }
});
ParámetroObligatorioDescripción
memoryStorageTotalCostLimitopcionalTamaño total de la caché en memoria en bytes. Por defecto, el valor específico de la plataforma.
memoryStorageCountLimitopcionalLímite de número de elementos en la caché en memoria. Por defecto, el valor específico de la plataforma.
diskStorageSizeLimitopcionalLímite de tamaño de archivo en disco en bytes. Por defecto, el valor específico de la plataforma.

Habilitar 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 localAccessLevelAllowed en true:

await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
        android: {
            localAccessLevelAllowed: true,
        },
    }
});

Borrar datos al restaurar desde copia de seguridad

Cuando clearDataOnBackup se establece en true, el SDK detecta cuándo se restaura la app desde una copia de seguridad de iCloud y elimina todos los datos almacenados localmente, incluida la información de perfil en caché, los detalles de productos y los paywalls. Después, el SDK se inicializa con un estado limpio. El valor predeterminado 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 no se ven afectados.

await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
        ios: {
            clearDataOnBackup: true,
        },
    }
});

Consejos para el entorno de desarrollo

Solución de errores de activación del SDK en el live-reload de Capacitor

Al desarrollar con el SDK de Adapty en Capacitor, puede que encuentres el error: Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.

Esto ocurre porque la función de live-reload de Capacitor dispara múltiples llamadas de activación durante el desarrollo. Para evitarlo, usa la opción __ignoreActivationOnFastRefresh con el flag del modo de desarrollo de Capacitor; este flag variará según el bundle que estés utilizando.

try {
  await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
        // Set your development environment variable
      __ignoreActivationOnFastRefresh: true,
    }
  });
} catch (error) {
  console.error('Failed to activate Adapty SDK:', error);
  // Handle the error appropriately for your app
}

Solución de problemas

Error de versión mínima de iOS

Si recibes un error de versión mínima de iOS, actualiza tu Podfile:

-platform :ios, min_ios_version_supported
+platform :ios, '14.0'  # For core features only
# OR
+platform :ios, '15.0'  # If using paywalls created in the paywall builder

Reglas de copia de seguridad de 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"/>

    

Después de modificar archivos nativos de Android, ejecuta npx cap sync android para que Capacitor recoja los recursos actualizados si regeneras la plataforma.

Las compras fallan al volver desde otra app en Android

Si la Activity que inicia el flujo de compra utiliza un launchMode no predeterminado, Android puede recrearla o reutilizarla incorrectamente cuando el usuario regresa 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 que las compras funcionen correctamente, usa únicamente 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 esté configurada como standard o singleTop:

<activity
    android:name=".MainActivity"
    android:launchMode="standard" />

Errores de compilación de Swift 6 causados por la sobrescritura de SWIFT_VERSION en el Podfile

Al compilar tu app de Capacitor para iOS, es posible que veas errores de compilación de Swift 6 en los targets de los pods de Adapty. Los síntomas típicos incluyen discrepancias de @Sendable en AdaptyUIBuilderLogic, falta de conformidad con Sendable en los tipos de Adapty, o errores de aislamiento de actores. El pod de Adapty declara s.swift_version = '6.0' y requiere Swift 6 para compilarse. Tu propio código de la app puede quedarse en Swift 5 — solo los targets del pod 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/App/Podfile que reescribe SWIFT_VERSION para todos los targets del pod:

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 del pod de Adapty del override:

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 npx cap sync ios y reconstruye el proyecto.

Para verificarlo, abre ios/App/Pods/Pods.xcodeproj, selecciona el target del pod AdaptyBuild SettingsSwift Language Version. Debería mostrar Swift 6.