Capacitor - Adapty SDK 安装与配置

Adapty SDK 包含两个核心模块,用于无缝集成到你的 Capacitor 应用中:

  • Core Adapty:此模块是 Adapty 在你的应用中正常运行所必需的。
  • AdaptyUI:如果你使用 Adapty 付费墙编辑工具(一款无需编写代码即可轻松创建跨平台付费墙的可视化工具),则需要此模块。AdaptyUI 会与核心模块一同自动激活。
Tip

想看看 Adapty SDK 如何集成到真实移动应用中?欢迎参考我们的示例应用,其中展示了完整的配置流程,包括显示付费墙、发起购买以及其他基础功能。

环境要求

Adapty Capacitor SDK 的版本要求如下:

Adapty SDK 版本Capacitor 版本iOS 版本
3.16.0+815.0+
3.15714.0+

Capacitor 6 及以下版本不受支持。 使用 Adapty SDK v4(测试版)构建 iOS 应用需要 Xcode 26 或更高版本——其底层 iOS SDK 使用 Swift tools 6.2 构建。iOS 15.0+、Capacitor 8 以及 Android minSdk 24 的要求与 SDK 3.16+ 相同。

Info

从 SDK v3.17 起,Adapty SDK 默认使用 Google Play Billing Library v8.0.0。

兼容某个 Billing Library 版本并不意味着 Adapty 支持 Google 在该版本中引入的所有功能。在采用新的 Google Play 计费能力之前,请参阅 Play Store 中的产品

Info

安装 SDK 是 Adapty 配置流程的第 5 步。在应用内购买正常运行之前,您还需要将应用连接到各应用商店,然后在 Adapty 看板中创建产品、付费墙和版位。快速入门指南涵盖了所有必要步骤。

安装 Adapty SDK

Important

以下步骤安装的是 Adapty SDK 3.x。SDK v4(测试版)——Flow Builder 所需,也用于快速入门——安装方式不同:请参阅下方的 Adapty SDK 4.0(测试版),或查看迁移指南

Release

安装 Adapty SDK:

npm install @adapty/capacitor
npx cap sync

Adapty SDK 4.0 (beta)

Capacitor SDK 4.0 — 新增 Flow Builder 支持 — 目前为预发布版本。请安装指定版本(npm 不会通过 caret/tilde 范围解析预发布版本),然后同步:

npm install @adapty/capacitor@4.0.1-beta.1
npx cap sync

在 iOS 上,v4 仅通过 Swift Package Manager 拉取原生 Adapty SDK——CocoaPods podspec 已被移除(CocoaPods 的 spec 仓库将于 2026 年 12 月起只读)。您的 iOS 项目必须使用 Capacitor 的 SPM 集成:

有关 v4 中完整的 API 变更列表,请参阅将 Adapty Capacitor SDK 迁移至 v4

激活 Adapty SDK 的 Adapty 模块

Note

Adapty SDK 在您的应用中只需激活一次。

获取您的 Public SDK Key

  1. 打开 Adapty 看板,导航至 App settings → General
  2. Api keys 部分,复制 Public SDK Key(不是 Secret Key)。
  3. 将代码中的 "YOUR_PUBLIC_SDK_KEY" 替换为实际值。

或者,使用 Adapty CLI 以编程方式获取:

npm install -g adapty
adapty auth login
adapty apps list

或者,直接运行:

npx adapty auth login
adapty apps list
  • 请确保使用 Public SDK key 初始化 Adapty,Secret key 仅用于服务端 API
  • SDK keys 对每个应用都是唯一的,如果您有多个应用,请确保选择正确的那个。

将以下代码复制到任意应用文件中以激活 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);
}
Important

在调用任何其他 Adapty SDK 方法之前,请等待 activate 执行完毕。完整调用顺序请参阅 Capacitor SDK 调用顺序

Tip

若要避免开发环境中的激活错误,请参考使用建议

现在在你的应用中配置付费墙:

激活 Adapty SDK 的 AdaptyUI 模块

如果您计划使用付费墙编辑工具,则需要 AdaptyUI 模块。激活核心模块时会自动完成此操作,您无需进行任何额外操作。

可选配置

日志记录

配置日志系统

Adapty 会记录错误和其他重要信息,帮助你了解运行情况。可用的日志级别如下:

LevelDescription
error仅记录错误日志
warn记录错误以及 SDK 中不会导致严重错误但值得关注的消息
info记录错误、警告及各类信息消息
verbose记录调试时可能有用的所有附加信息,例如函数调用、API 请求等
您可以在配置 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',
  }
});

数据策略

Adapty 不会存储用户的个人数据,除非您明确发送,但您可以实施额外的数据安全策略,以符合应用商店或特定国家/地区的规定。

禁用 IP 地址收集与共享

在激活 Adapty 模块时,将 ipAddressCollectionDisabled 设置为 true 即可禁用用户 IP 地址的收集与共享。默认值为 false。 使用此参数可增强用户隐私保护、遵守区域性数据保护法规(如 GDPR 或 CCPA),或在应用不需要基于 IP 的功能时减少不必要的数据收集。

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

禁用广告 ID 的收集与共享

激活 Adapty 模块时,将 ios.idfaCollectionDisabled(iOS)或 android.adIdCollectionDisabled(Android)设置为 true 可禁用广告标识符的收集,默认值为 false

如需遵守 App Store/Play Store 政策、避免触发应用跟踪透明度(App Tracking Transparency)提示,或者您的应用不需要基于广告 ID 的广告归因或数据分析,请使用此参数。

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

为 AdaptyUI 配置媒体缓存

默认情况下,AdaptyUI 会缓存媒体内容(如图片和视频),以提升性能并减少网络流量。你可以通过自定义配置来调整缓存设置。

使用 mediaCache 覆盖默认缓存配置:

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
    },
  }
});
参数是否必填描述
memoryStorageTotalCostLimit可选内存缓存的总大小,单位为字节。默认值因平台而异。
memoryStorageCountLimit可选内存存储的最大条目数量。默认值因平台而异。
diskStorageSizeLimit可选磁盘上的文件大小限制,单位为字节。默认值因平台而异。

启用本地访问等级(Android)

默认情况下,本地访问等级 在 iOS 上已启用,在 Android 上已禁用。要在 Android 上也启用此功能,请将 localAccessLevelAllowed 设置为 true

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

备份恢复时清除数据

clearDataOnBackup 设置为 true 时,SDK 会检测到应用从 iCloud 备份中恢复,并删除所有本地存储的 SDK 数据,包括缓存的用户画像信息、产品详情和付费墙。SDK 随后将以全新状态重新初始化。默认值为 false

Note

仅删除本地 SDK 缓存。Apple 的交易记录以及 Adapty 服务器上的用户数据不受影响。

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

开发环境使用技巧

排查 Capacitor 热重载时的 SDK 激活报错

在 Capacitor 中使用 Adapty SDK 开发时,你可能会遇到以下报错:Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.

这是因为 Capacitor 的热重载功能在开发过程中会多次触发激活调用。要避免此问题,请将 __ignoreActivationOnFastRefresh 选项设置为 Capacitor 的开发模式标志——具体取值取决于你所使用的打包工具。

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
}

故障排查

iOS 最低版本错误

Note

此问题适用于使用 CocoaPods 的项目(SDK 3.x)。SDK 4.0 仅通过 Swift Package Manager 安装(无 Podfile),且要求 iOS 15.0 — 请在 Xcode 中将部署目标设置为 15.0。

如果在 SDK 3.x 上遇到 iOS 最低版本错误,请更新你的 Podfile:

-platform :ios, min_ios_version_supported
+platform :ios, '15.0'

Android 备份规则(自动备份配置)

部分 SDK(包括 Adapty)会自带 Android 自动备份配置。如果多个 SDK 都定义了备份规则,Android 清单合并工具可能会报错,提示 android:fullBackupContentandroid:dataExtractionRulesandroid:allowBackup 相关问题。

常见错误示例: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)

以下更改应在你的 Android 平台目录(通常位于项目的 android/ 文件夹)中进行。

要解决此问题,你需要:

  • 告知清单合并工具使用应用自身的备份相关属性值。

  • 创建备份规则文件,将 Adapty 的规则与其他 SDK 的规则合并。

1. 在清单中添加 tools 命名空间

AndroidManifest.xml 文件中,确保根标签 <manifest> 包含 tools:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">

    ...
</manifest>

2. 在 <application> 中覆盖备份属性

在同一个 AndroidManifest.xml 文件中,更新 <application> 标签,使应用提供最终属性值,并告知清单合并工具替换库中的值:

<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>

如果某个 SDK 也设置了 android:allowBackup,请将其一并加入 tools:replace

tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"

3. 创建合并后的备份规则文件

在 Android 项目的 res/xml/ 目录下创建 XML 文件,将 Adapty 的规则与其他 SDK 的规则合并。Android 根据系统版本使用不同的备份规则格式,同时创建两个文件可确保应用所支持的所有 Android 版本都能正常兼容。

以下示例以 AppsFlyer 作为第三方 SDK 的示例。请替换或添加你应用中实际使用的其他 SDK 的规则。

Android 12 及更高版本(使用新的数据提取规则格式):

<?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>

Android 11 及更低版本(使用旧版完整备份内容格式):

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    
    <exclude domain="sharedpref" path="appsflyer-data"/>

    
    <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>

    
Tip

修改原生 Android 文件后,请运行 npx cap sync android,这样在重新生成平台时 Capacitor 可以获取到更新后的资源。

从其他应用返回后 Android 购买失败

如果启动购买流程的 Activity 使用了非默认的 launchMode,当用户从 Google Play、银行应用或浏览器返回时,Android 可能会错误地重建或复用该 Activity。这会导致购买结果丢失或被视为已取消。 为确保购买流程正常运行,请仅对启动购买流程的 Activity 使用 standardsingleTop 启动模式,避免使用其他模式。

AndroidManifest.xml 中,确保启动购买流程的 Activity 设置为 standardsingleTop

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

由 Podfile 中 SWIFT_VERSION 覆盖引发的 Swift 6 构建错误

Note

此内容适用于基于 CocoaPods 的 SDK 3.x 项目。SDK 4.0 通过 Swift Package Manager 安装原生 SDK,因此无需调整 Podfile

在为 iOS 构建 Capacitor 应用时,你可能会在 Adapty pod 目标上看到 Swift 6 编译错误。常见症状包括:AdaptyUIBuilderLogic 中的 @Sendable 不匹配、Adapty 类型缺少 Sendable 协议遵循,或 actor 隔离错误。 Adapty pods 声明了 s.swift_version = '6.0',构建时需要 Swift 6。你自己的应用代码可以继续使用 Swift 5 —— 只有 Adapty 相关的 pod 目标(AdaptyAdaptyUIAdaptyUIBuilderAdaptyLoggerAdaptyPlugin)需要用 Swift 6 构建。

最常见的原因是 ios/App/Podfile 中存在 post_install 钩子,它会为所有 pod 目标重写 SWIFT_VERSION

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

修复方法:将 Adapty pod 目标从覆盖范围中排除:

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

然后运行 npx cap sync ios 并重新构建。

如需验证,请打开 ios/App/Pods/Pods.xcodeproj,选择 Adapty pod target → Build SettingsSwift Language Version,确认显示的是 Swift 6