在 Expo 项目中安装并配置 Adapty React Native SDK

Important

本指南介绍如何在 Expo 项目中安装和配置 Adapty React Native SDK。

如果你使用的是纯 React Native(不含 Expo),请参阅 React Native 安装指南

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

  • Core Adapty:此模块是 Adapty 在您的应用中正常运行的必要组件。
  • AdaptyUI:如果您使用 Adapty 付费墙编辑工具——一款无需编写代码即可轻松创建跨平台付费墙的工具,则需要此模块。AdaptyUI 会随核心模块一并自动激活。

如果您需要一份关于如何在 React Native 应用中实现 IAP 的完整教程,请参阅这篇文章

Tip

想看看 Adapty SDK 如何集成到 Expo 应用中的真实示例?请查看我们的示例应用:

如需完整的实现演示,您也可以观看以下视频:

系统要求

Adapty React Native SDK 需要 iOS 15.0+。

构建 iOS 需要 Swift 6.0 或更高版本。Kids Mode 需要 Swift 6.1 或更高版本。

Info

Adapty React Native SDK 4.0.3 及更高版本支持 Google Play Billing Library v8。

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

Info

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

安装 Adapty SDK

Important

从 v4 版本开始,Adapty React Native SDK 不再支持通过 CocoaPods 安装其原生依赖项。如果你需要 v4 或更高版本(用于 Flow Builder),请按照下方的 Adapty SDK 4.0:启用 Swift Package Manager 进行操作。

Release

Important

Expo Dev Client(自定义开发构建版本)是在 Expo 项目中使用 Adapty 的必要条件。

Expo Go 不支持自定义原生模块,因此只能配合模拟模式用于 UI/逻辑开发(不支持真实购买,也不支持 AdaptyUI/付费墙编辑工具渲染)。

  1. 安装 Adapty SDK:
    npx expo install react-native-adapty
    npx expo prebuild
  2. 使用 EAS 或本地构建为开发环境构建应用:
  1. 启动开发服务器:
    npx expo start --dev-client

Adapty SDK 4.0:启用 Swift Package Manager

React Native SDK 4.0(新增 Flow Builder 支持)需要 React Native 0.75 或更高版本。安装 SDK:

npx expo install react-native-adapty@^4.0.0

v4 通过 Swift Package Manager 而非 CocoaPods 子依赖来拉取原生 iOS SDK(AdaptyAdaptyUIAdaptyPlugin)(CocoaPods 的 spec 仓库将于 2026 年 12 月变为只读)。SPM 需要动态框架,在 Expo 中可通过 expo-build-properties 插件来启用。将其添加到 app.json(或 app.config.js):

{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "ios": {
            "useFrameworks": "dynamic"
          }
        }
      ]
    ]
  }
}

然后安装插件并重新生成原生项目:

npx expo install expo-build-properties
npx expo prebuild --clean

如果 iOS 构建失败并提示 'React/RCTBridge.h' file not found,请参阅故障排除条目

有关完整迁移步骤,请参阅将 Adapty React Native SDK 迁移至 v4

激活 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 模块

如果你计划使用付费墙编辑工具,则需要 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 政策、避免触发应用跟踪透明度(ATT)弹窗,或者你的应用不需要基于广告 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
   },
});

开发环境使用技巧

为 Expo Go / Expo Web 配置模拟模式

Expo Go 和 Expo Web 环境无法访问 Adapty 的原生模块。为了在构建和测试应用 UI 及付费墙逻辑时避免运行时错误,Adapty 提供了模拟模式

Important

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

  • 不会打开 App Store / Google Play 购买流程,也不会创建真实交易。
  • 不会渲染使用 Adapty 付费墙编辑工具 (AdaptyUI) 创建的付费墙/用户引导。
  • Adapty 的原生模块会被完全绕过——即使 Xcode/Android 构建中缺少原生 SDK 文件或 API key 无效,也不会触发错误。

如需测试真实购买和付费墙编辑工具付费墙,请使用 Expo Dev Client / 生产构建,其中模拟模式会自动禁用。

默认情况下,SDK 会自动检测 Expo Go 和 Web 环境并启用模拟模式。除非你想自定义模拟数据,否则无需做任何配置。

模拟模式激活后:

  • 所有 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(); // 可选:传入 mockConfig 来自定义模拟数据

// 现在可以在激活前调用方法

await adapty.activate('YOUR_PUBLIC_SDK_KEY');

出于开发目的延迟 SDK 激活

Adapty 在 SDK 激活时会预先获取所有必要的用户数据,从而更快地访问最新数据。

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

启用 __debugDeferActivation 属性后,activate 调用会被挂起,直到你发起下一次 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 的快速刷新(fast refresh)功能会在开发过程中触发多次激活调用。为了避免这种情况,请将 __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 一旦完成激活,便会跳过后续的整个激活调用,因此在快速刷新时对激活参数的更改不会生效。如需应用新的激活参数,请完全关闭应用后重新启动。

故障排查

iOS 最低版本错误

在为 iOS 构建时,你可能会看到关于 最低 iOS 版本 或部署目标的错误。Adapty 要求 iOS 15.0+

由于 Expo 在执行 expo prebuild 时会自动生成 iOS 项目(包括 Podfile),请勿直接编辑 Podfile。应通过 expo-build-properties 配置插件来设置部署目标。

  1. 安装插件:

    npx expo install expo-build-properties
  2. 更新你的 Expo 配置(app.jsonapp.config.js),设置 iOS 部署目标:

{
    "expo": {
        // ...other Expo config...
        "plugins": [
            [
                "expo-build-properties",
                {
                    "ios": {
                        // Adapty requires iOS 15.0+.
                        "deploymentTarget": "15.0"
                    }
                }
            ],
        ]
    }
}
  1. 重新生成原生 iOS 项目并重新构建:
npx expo prebuild --clean
npx expo run:ios      # or `eas build -p ios` on your CI

Android 自动备份清单冲突

当使用 Expo 并集成多个配置 Android Auto Backup 的 SDK(如 Adapty、AppsFlyer 或 expo-secure-store)时,可能会遇到 manifest 合并冲突。

典型的错误如下:Manifest merger failed : Attribute application@fullBackupContent value=(@xml/secure_store_backup_rules) from AndroidManifest.xml:24:248-306 is also present at [io.adapty:android-sdk:3.12.0] AndroidManifest.xml:9:18-70 value=(@xml/adapty_backup_rules). 要解决此冲突,您需要让 Adapty 插件管理 Android 备份配置。 如果您的项目也使用了 expo-secure-store,请禁用其自身的备份设置以避免冲突。

以下是配置 app.json 的方法:

{
  "expo": {
    "plugins": [
      ["react-native-adapty", { "replaceAndroidBackupConfig": true }],
      ["expo-secure-store", { "configureAndroidBackup": false }]
    ]
  }
}

replaceAndroidBackupConfig 选项默认为 false。启用后,Adapty 插件将接管 Android 备份规则的控制权。 如果你使用了 expo-secure-store,请添加 "configureAndroidBackup": false 以避免警告,因为 SecureStore 的备份配置现在将由 Adapty 统一管理。

Important

此设置仅满足 Adapty、AppsFlyer 和 expo-secure-store 的备份需求。 如果项目中的其他库定义了自定义备份规则,则需要手动配置。

iOS 构建失败,报错 'React/RCTBridge.h' file not found

为 Adapty SDK 4.0 启用动态框架后,iOS 构建可能在 expo-updates@expo/ui 或其他包含 Objective-C 源码的包中失败,报错如下:

error: 'React/RCTBridge.h' file not found

该故障是由 expo-modules-autolinking 包(expo 的依赖项)中的一个缺陷引起的。受影响的版本为 57.0.5–57.0.9(Expo SDK 57)和 56.0.19–56.0.21(Expo SDK 56);该缺陷已在 57.0.10 和 56.0.22 中修复。

要修复构建问题,请将 expo-modules-autolinking 更新到已修复的版本并重新生成原生项目:

npm update expo-modules-autolinking
npx expo prebuild

如果当前使用的 Expo SDK 版本尚未提供已修复的版本,请改为从源码构建 React Native。此方法可以绕过该缺陷,但会导致 iOS 构建时间变长:

{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "ios": {
            "useFrameworks": "dynamic",
            "buildReactNativeFromSource": true
          }
        }
      ]
    ]
  }
}