在纯 React Native 项目中安装和配置 Adapty SDK

Important

本指南仅适用于纯 React Native(非 Expo)项目。 如果你使用的是 Expo,请参阅 Expo 安装指南

Adapty SDK 包含两个关键模块,可无缝集成到你的 React Native 应用中:

  • Core Adapty:此模块是 Adapty 在你的应用中正常运行所必需的。
  • AdaptyUI:此模块用于渲染流程以及旧版编辑工具付费墙。AdaptyUI 会随核心模块自动激活。
Tip

想看看 Adapty SDK 在移动应用中的真实集成示例吗?查看我们的示例应用,其中演示了完整的配置流程,包括展示付费墙、完成购买以及其他基本功能。

系统要求

要求版本
React Native0.75 或更高版本。React Native 的 SPM 集成需要 0.87 或更高版本。
iOS15.0 或更高版本
Swift6.2 或更高版本,随 Xcode 26 一起提供
Google Play Billing LibraryAdapty React Native SDK 4.0.3 起支持 v8
Info

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

Info

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

安装 Adapty SDK

Release

将包添加到您的项目中:

# using npm
npm install react-native-adapty

# or using yarn
yarn add react-native-adapty

设置你的 iOS 项目

Adapty 原生 iOS SDK(AdaptyAdaptyUIAdaptyPlugin)仅以 Swift Package 形式发布——v4 已放弃 CocoaPods 分发方式(CocoaPods 的 spec 仓库将于 2026 年 12 月变为只读)。以下两种方式均可安装这些 Swift Package,区别在于驱动安装的机制不同。

  • CocoaPods(默认方式,SDK 4.0 及以上):你的 iOS 项目保留 Podfile,React Native 的 spm_dependency 辅助方法将 Adapty 的 Swift 包添加到 Pods 项目中。Swift 包以动态方式链接,因此 Podfile 需要切换为动态框架。
  • React Native 的 SPM 集成(SDK 4.1 及以上):你的 iOS 项目不再使用 CocoaPods,React Native 通过 Adapty 附带的 Package.swift 清单文件自行解析 Swift 包。React Native 在 0.87 版本中新增了该集成,目前处于预览阶段,官方暂不建议在生产环境中使用。

激活 Adapty SDK 的 Adapty 模块

获取您的 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 对每个应用都是唯一的,如果您有多个应用,请确保选择正确的那个。

将以下代码复制到 App.tsx 以激活 Adapty:


adapty.activate('YOUR_PUBLIC_SDK_KEY');
Important

在调用其他任何 Adapty SDK 方法之前,请等待 activate 完成。完整调用顺序请参阅 React Native SDK 的调用顺序

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

Tip

如需避免开发环境中的激活错误,请参考相关技巧

激活 Adapty SDK 的 AdaptyUI 模块

如果你计划使用 Flow & 付费墙编辑工具,则需要 AdaptyUI 模块。激活核心模块时,它会自动激活,无需额外操作。

可选配置

日志记录

设置日志系统

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

LevelDescription
error仅记录错误日志
warn记录错误以及 SDK 中不会导致严重错误但值得关注的消息
info记录错误、警告以及各类信息消息
verbose记录调试时可能有用的任何附加信息,例如函数调用、API 请求等

您可以在应用程序中配置 Adapty 之前或配置期间设置日志级别:

// Set log level before activation
// 'verbose' is recommended for development and the first production release
adapty.setLogLevel('verbose');

// Or set it during configuration
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
  logLevel: 'verbose',
});

数据政策

除非您明确发送,否则 Adapty 不会存储用户的个人数据。您还可以实施额外的数据安全政策,以符合应用商店或所在国家/地区的合规要求。

禁用 IP 地址收集与共享

在激活 Adapty 模块时,将 ipAddressCollectionDisabled 设置为 true 可禁用用户 IP 地址的收集与共享。默认值为 false

使用此参数可增强用户隐私保护、遵守区域数据保护法规(如 GDPR 或 CCPA),或在应用不需要基于 IP 的功能时减少不必要的数据收集。

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

禁用广告 ID 的收集与共享

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

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

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

为 AdaptyUI 配置媒体缓存

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

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

adapty.activate('YOUR_PUBLIC_SDK_KEY', {
  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

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

恢复备份时清除数据

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

Note

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

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

启用 Adapty 归因

Info

此参数从 SDK 4.1 版本开始支持。

如果您使用 Adapty 归因,请在激活 SDK 时将 adaptyAttributionEnabled 设置为 true。默认值为 false:不设置此参数时,SDK 不会注册安装事件,也不会向您的应用传递安装详情。在 4.1 以下版本的 SDK 中,Adapty 归因会自动启用。

adapty.activate('YOUR_PUBLIC_SDK_KEY', {
   adaptyAttributionEnabled: true,
});

开发环境使用技巧

在开发阶段延迟 SDK 激活

Adapty 在 SDK 激活时会预先拉取所有必要的用户数据,从而加快获取最新数据的速度。

然而,在 iOS 模拟器中,这可能会引发一个问题——开发过程中模拟器会频繁弹出身份验证提示。虽然 Adapty 无法控制 StoreKit 的身份验证流程,但可以推迟 SDK 发出请求以获取最新用户数据的时机。

通过启用 __debugDeferActivation 属性,激活调用将被推迟,直到你发起下一次 Adapty SDK 调用。这样可以避免在不需要认证数据时弹出不必要的提示。

需要注意的是,此功能仅供开发使用,因为它并不能覆盖所有潜在的用户场景。在生产环境中,不应延迟激活,因为真实设备通常会记住认证数据,不会反复提示输入凭据。

以下是推荐的使用方式:

try {
  adapty.activate('PUBLIC_SDK_KEY', {
    __debugDeferActivation: isSimulator(), // 'isSimulator' from any 3rd party library
  });
} catch (error) {
  console.error('Failed to activate Adapty SDK:', error);
  // Handle the error appropriately for your app
}

排查 React Native Fast Refresh 中 SDK 激活报错的问题

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

这是因为 React Native 的快速刷新功能在开发过程中会多次触发激活调用。为避免此问题,请将 __ignoreActivationOnFastRefresh 选项设置为 __DEV__(React Native 的开发模式标志)。

try {
  adapty.activate('PUBLIC_SDK_KEY', {
    __ignoreActivationOnFastRefresh: __DEV__,
  });
} catch (error) {
  console.error('Failed to activate Adapty SDK:', error);
  // Handle the error appropriately for your app
}
Note

启用此选项后,SDK 一旦完成激活便会跳过整个激活调用,因此更改激活参数不会在快速刷新时生效。若要应用新的激活参数,请完全关闭应用并重新启动。

为本地测试设置模拟模式

在本地开发和测试时,你可以启用模拟模式,从而无需沙盒 App Store/Google Play 账号,加快迭代速度。模拟模式会完全绕过 Adapty 的原生模块并返回模拟数据。

Important

模拟模式不是用于测试真实购买的工具:

  • 不会打开 App Store / Google Play 的购买流程,也不会创建真实交易。
  • 不会渲染流程或旧版编辑工具付费墙(AdaptyUI)。
  • Adapty 的原生模块会被完全绕过——即使 Xcode/Android 构建中缺少原生 SDK 文件或 API 密钥无效,也不会触发错误。
  • 不会向 Adapty 服务器发送任何数据。

如需测试真实购买和付费墙编辑工具付费墙,请禁用模拟模式并使用沙盒账户。

要启用模拟模式,请将 enableMock 设置为 true

adapty.activate('YOUR_PUBLIC_SDK_KEY', {
  enableMock: true,
});

当模拟模式处于激活状态时:

  • 所有 Adapty 方法均返回模拟数据,不会向 Adapty 服务器发起网络请求。
  • 默认情况下,初始模拟用户画像不包含任何活跃订阅。
  • 默认情况下,makePurchase(...) 会模拟一次成功的购买并授予高级访问权限。

你可以在激活时通过 mockConfig 自定义模拟数据。配置格式和支持的参数详见此处


try {
   await adapty.activate('YOUR_PUBLIC_SDK_KEY', {
      mockConfig: {
         // Customize the initial mock profile (optional)
      },
   });
} catch (error) {
   console.error('Failed to activate Adapty SDK:', error);
}

如果你需要在激活之前调用 SDK 方法(例如 isActivated()setLogLevel()),请在 activate() 之前使用 enableMock()。如果 bridge 已经初始化,此方法将不执行任何操作。

adapty.enableMock(); // Optional: pass mockConfig to customize mock data

// Now you can call methods before activation

await adapty.activate('YOUR_PUBLIC_SDK_KEY');

故障排查

iOS 最低版本错误

如果遇到 iOS 最低版本错误,请更新你的 Podfile:

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

Android 自动备份清单冲突

部分 SDK(包括 Adapty)会附带自己的 Android Auto Backup 配置。如果您使用了多个定义备份规则的 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)

Note

以下修改应在您的 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 版本上都能正常运行。

Note

以下示例以 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"/>

    

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

如果启动购买流程的 Activity 使用了非默认的 launchMode,当用户从 Google Play、银行应用或浏览器返回时,Android 可能会以错误的方式重新创建或复用该 Activity,导致购买结果丢失或被视为已取消。

为确保购买流程正常运行,请仅对启动购买流程的 Activity 使用 standardsingleTop 启动模式,避免使用其他模式。

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

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

React Native 0.73 以下版本的 Kotlin Gradle 插件版本错误

在低于 0.73.0 的 React Native 版本中,Android 构建会因 Kotlin Gradle 插件版本问题而失败。请更新 /android/build.gradle 文件,确保其中包含 kotlin-gradle-plugin:1.8.0 或更新版本的依赖:

...
buildscript {
  ...
  dependencies {
    ...
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
  }
}
...

由 Podfile SWIFT_VERSION 覆盖导致的 Swift 6 构建错误

Note

此说明适用于 SDK 3.x,在该版本中,原生 iOS SDK 以 CocoaPods 方式安装。从 SDK 4.0 起,它们改为以 Swift Package 方式安装,因此在 post_install 中覆盖 SWIFT_VERSION 将不再对其生效。

在为 iOS 构建 React Native 应用时,你可能会在 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/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

然后从 ios/ 目录运行 pod install 并重新构建。

如需验证,打开 ios/Pods/Pods.xcodeproj,选择 Adapty pod 目标 → Build SettingsSwift Language Version,确认显示为 Swift 6