概览
CloudX React Native SDK 设置和核心功能概览
CloudX React Native SDK 可让您通过横幅、MREC、插页式、激励视频和 App Open 广告在 iOS 和 Android 上实现 React Native 应用的变现。支持新架构 (Fabric) 和旧架构 (Paper)。
手动安装
要求 React Native 0.70+、React 18.0+、iOS 13.0+、Android API 23+。
npm install cloudx-react-nativeiOS 设置
在 ios/Podfile 中添加广告网络适配器 Pod:
platform :ios, '15.0'
target 'YourApp' do
# ... 现有配置 ...
# CloudX 广告网络适配器(按需添加)
pod 'CloudXBigoAdapter', '~> 6.1.0.0' # BigoADS 6.1.0
pod 'CloudXMetaAdapter', '~> 6.22.0.0' # FBAudienceNetwork 6.22.0
pod 'CloudXVungleAdapter', '~> 7.7.6.0' # VungleAds 7.7.6
pod 'CloudXInMobiAdapter', '~> 11.4.1.0' # InMobiSDK 11.4.1
pod 'CloudXMintegralAdapter', '~> 8.1.6.1' # MintegralAdSDK 8.1.6
pod 'CloudXUnityAdsAdapter', '~> 4.20.1.0' # UnityAds 4.20.1
pod 'CloudXMagniteAdapterV2', '~> 1.0.0.2' # MagniteSDK 1.0.0
pod 'CloudXMobileFuseAdapter', '~> 1.11.0.1' # MobileFuseSDK 1.11.0
pod 'CloudXMolocoAdapter', '~> 4.11.1.0' # MolocoSDKiOS 4.11.1
pod 'CloudXVerveAdapter', '~> 3.9.0.0' # HyBid 3.9.0
pod 'CloudXDigitalTurbineAdapter', '~> 8.4.10.0' # Fyber Marketplace SDK 8.4.10
pod 'CloudXGoogleWaterfallAdapter', '~> 13.9.0.0' # Google Mobile Ads SDK 13.9.0
pod 'CloudXPangleAdapter', '~> 8.3.0.6.0' # Ads-Global(Pangle / 字节跳动)8.3.0.6
pod 'CloudXTaurusXAdapter', '~> 1.18.2.0' # TaurusX SDK 1.18.2
end然后安装 Pod:
cd ios && pod installApp Transport Security
CloudX SDK 不需要禁用应用传输安全(App Transport Security)。如果某个聚合广告网络确实通过特定域名的纯 HTTP 提供素材,请在 Info.plist 中为该域名单独配置例外,而不要在整个应用范围启用任意加载(全局 NSAllowsArbitraryLoads 会削弱应用的传输安全,并可能引起 App Store 审核关注):
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example-ad-network.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>Android 设置
在 android/app/build.gradle 中添加 CloudX SDK 和适配器依赖:
dependencies {
// CloudX Android SDK
implementation "io.cloudx:sdk:4.9.0"
// 广告网络适配器(按需添加)
implementation "io.cloudx:adapter-bigo:6.1.0.0" // BIGO Ads SDK 6.1.0
implementation "io.cloudx:adapter-digitalturbine:8.4.7.1" // Digital Turbine Marketplace SDK 8.4.7
implementation "io.cloudx:adapter-googlewaterfall:25.5.0.0" // Google Mobile Ads SDK 25.5.0
implementation "io.cloudx:adapter-inmobi:11.5.0.0" // InMobi SDK 11.5.0
implementation "io.cloudx:adapter-magnite:1.0.0.2" // Magnite Ads SDK 1.0.0
implementation "io.cloudx:adapter-meta:6.22.0.0" // Meta Audience Network 6.22.0
implementation "io.cloudx:adapter-mintegral:17.1.81.0" // Mintegral SDK 17.1.81
implementation "io.cloudx:adapter-mobilefuse:1.12.0.0" // MobileFuse SDK 1.12.0
implementation "io.cloudx:adapter-moloco:4.13.0.0" // Moloco SDK 4.13.0
implementation "io.cloudx:adapter-pangle:8.3.0.4.0" // Pangle SDK 8.3.0.4
implementation "io.cloudx:adapter-taurusx:1.19.1.0" // TaurusX SDK 1.19.1
implementation "io.cloudx:adapter-unityads:4.21.0.0" // Unity Ads SDK 4.21.0
implementation "io.cloudx:adapter-verve:3.9.2.0" // Verve HyBid SDK 3.9.2
implementation "io.cloudx:adapter-vungle:7.7.9.0" // Vungle SDK 7.7.9
}如果集成 Mintegral 适配器,还需要在 android/build.gradle 中声明其 Maven 仓库:
allprojects {
repositories {
maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" }
}
}可选 MMP 广告收入连接器
如果您的应用使用 Adjust、AppsFlyer 或 Singular,可以无需编写 React Native JavaScript 胶水代码,直接将 CloudX 竞得展示收入转发给移动归因合作伙伴。请按照各连接器页面的说明,在 ios/Podfile 和 android/app/build.gradle 中添加连接器的原生依赖。
请只选择连接器或您自己的 onAdRevenuePaid 转发代码其中一种方式,不要同时使用。
初始化
在加载任何广告之前初始化 SDK:
import { CloudX, CloudXLogLevel } from 'cloudx-react-native';
// 可选:启用详细日志(仅限开发环境)
CloudX.setMinLogLevel(CloudXLogLevel.VERBOSE);
// 使用您的应用密钥初始化
const result = await CloudX.initialize('YOUR_APP_KEY');
if (result.success) {
console.log('CloudX 初始化完成');
} else {
console.error('CloudX 初始化失败:', result.message);
}CloudX.initialize() 返回 CloudXInitializationResult,包含:
success: boolean— 初始化是否成功message?: string— 附加详情,失败时填充
其他初始化工具方法:
const initialized = await CloudX.isInitialized();
const version = await CloudX.getVersion();
const tablet = await CloudX.isTablet();广告格式
CloudX React Native 支持横幅、MREC、插页式、激励视频和 App Open 广告集成。具体实现请参阅对应的广告格式指南:
横幅和 MREC 广告
创建程序化叠加展示广告位,并可控制刷新。
插页式广告
加载并展示全屏插页式广告位。
激励视频广告
在用户完成激励视频观看后发放奖励。
App Open 广告
在应用启动和回到前台时展示全屏广告位。
广告信息 (CloudXAdInfo)
大多数广告事件回调都会收到 CloudXAdInfo 对象:
| 属性 | 类型 | 描述 |
|---|---|---|
adUnitId | string | 广告单元 ID |
adFormat | string | 广告格式:BANNER、MREC、INTERSTITIAL、REWARDED 或 APP_OPEN |
networkName | string | 胜出广告网络名称 |
networkPlacement | string | null | 广告网络侧的 placement ID |
creativeId | string | null | 用于素材级问题排查的素材标识符 |
placement | string | null | 集成侧设置的自定义 placement |
revenue | number | 美元收入值 |
adValues | Record<string, string> | SDK 提供的广告元数据,可用于 Trusted Arbiter 等功能 |
当需求方未返回素材 ID 时,creativeId 为 null。它与您在 reportRevenueData 中传入的 creativeId 不同,后者描述的是在 CloudX 广告流程之外竞得的展示。
错误处理
所有 SDK 错误都会在回调或 rejected promise 中以错误对象返回:
| 属性 | 类型 | 描述 |
|---|---|---|
code | CloudXErrorCode | 错误类别 |
message | string | null | 人类可读的错误描述 |
错误码类别
| 范围 | 类别 | 常见错误码 |
|---|---|---|
| 0 | 通用 | internalError |
| 100-199 | 网络 | networkError、networkTimeout、networkNoConnection |
| 200-299 | 初始化 | notInitialized、sdkDisabled、invalidAppKey |
| 300-399 | 广告加载 | noFill、invalidAdUnit、adsDisabled |
| 400-499 | 展示 | adNotReady、adAlreadyShowing |
| 600-699 | 适配器 | adapterNoFill、adapterTimeout |
完整错误码列表请参阅 CloudXErrorCode 导出。
高级功能
调试日志
import { CloudX, CloudXLogLevel } from 'cloudx-react-native';
// 启用详细日志(在 initialize 之前调用)
CloudX.setMinLogLevel(CloudXLogLevel.VERBOSE);
// 可用级别: VERBOSE, DEBUG, INFO, WARN, ERROR, NONE日志级别: VERBOSE < DEBUG < INFO < WARN < ERROR < NONE
原生 SDK 日志会出现在 iOS 和 Android 平台日志中。JavaScript 侧调用和事件处理也可以通过应用常规的 React Native 日志记录。
Mediation Debugger
打开 Mediation Debugger 可在设备上检查集成情况:每个已安装适配器的版本和状态、SDK 配置、隐私状态以及您的广告单元。您还可以为每个广告单元加载测试广告,并为下次启动请求测试模式。
import { CloudX } from 'cloudx-react-native';
const opened = await CloudX.showMediationDebugger();请在 CloudX.initialize() 成功后调用。在此之前,它返回 false 且不会打开任何内容。它适用于开发和 QA 构建;请将其接入调试菜单或手势。
展示级收入追踪
在任意广告格式上设置 addAdRevenuePaidListener 回调即可接收展示级收入事件。CloudXAdInfo 对象包含美元收入值和胜出广告网络名称。
CloudXInterstitialAd.addAdRevenuePaidListener((adInfo) => {
trackRevenue(adInfo.revenue, adInfo.networkName, adInfo.adUnitId);
});适用于所有 React Native 广告格式:横幅、MREC、插页式、激励视频和 App Open。
如果需要将其他聚合平台或报表平台的 paid event 转发到 CloudX,请调用 CloudX.reportRevenueData()。收入值是货币单位,不是 micros。
import { CloudX, CloudXRevenuePlatform, CloudXRevenuePrecision } from 'cloudx-react-native';
const accepted = await CloudX.reportRevenueData({
platform: CloudXRevenuePlatform.ADMOB,
revenue: adValue.valueMicros / 1_000_000.0,
adFormat: 'INTERSTITIAL',
currencyCode: adValue.currencyCode,
precision: CloudXRevenuePrecision.ESTIMATED,
networkName: 'admob',
adUnitId: 'interstitial_ad_unit',
});Google Ad Manager paid event 请使用 CloudXRevenuePlatform.GAM。对于没有 JavaScript 常量的聚合平台,可使用 CloudXRevenuePlatform.custom('TopOn')、CloudXRevenuePlatform.custom('InMobi') 或其他非空平台名称。
发布商上报收入数据
如果您的应用在 CloudX 广告流程之外接收来自 AdMob、Google Ad Manager 或其他提供方的展示级收入回调,请在 CloudX 初始化完成后将这些事件转发给 CloudX:
| 字段 | 必填 | 描述 |
|---|---|---|
platform | 是 | CloudXRevenuePlatform.ADMOB、CloudXRevenuePlatform.GAM 或 CloudXRevenuePlatform.custom("MyProvider") |
revenue | 是 | 单次展示收入,使用传入货币;不是 CPM/eCPM |
adFormat | 是 | 广告格式字符串,例如 banner、mrec、interstitial 或 rewarded |
currencyCode | 否 | ISO 4217 货币代码(如已知) |
precision | 否 | CloudXRevenuePrecision.EXACT、ESTIMATED、PUBLISHER_DEFINED 或 UNDEFINED |
networkName | 否 | 胜出广告网络名称(如已知) |
adUnitId | 否 | 聚合平台广告单元 ID |
thirdPartyAdPlacementId | 否 | 广告网络侧广告单元或 placement ID |
creativeId | 否 | 广告网络返回的素材 ID |
networkPlacement | 否 | 广告网络 placement 标识 |
countryCode | 否 | 用户国家代码(如已知) |
userSegment | 否 | 用户分群(如已知) |
当事件被 CloudX 收益链路接受时,CloudX.reportRevenueData() 会解析为 true。当 payload 无效、平台名称为空、SDK 尚未初始化或收入追踪不可用时,它会解析为 false。
AdMob paid event
Google 不提供官方的 React Native AdMob 插件。本示例使用 react-native-google-mobile-ads,这是基于官方 Google Mobile Ads Android 和 iOS SDK 的第三方 React Native 封装。
const toCloudXRevenuePrecision = (precision) => {
switch (precision) {
case RevenuePrecisions.PRECISE:
return CloudXRevenuePrecision.EXACT;
case RevenuePrecisions.ESTIMATED:
return CloudXRevenuePrecision.ESTIMATED;
case RevenuePrecisions.PUBLISHER_PROVIDED:
return CloudXRevenuePrecision.PUBLISHER_DEFINED;
case RevenuePrecisions.UNKNOWN:
default:
return CloudXRevenuePrecision.UNDEFINED;
}
};
const reportAdMobPaidEvent = (event, adFormat, adUnitId) =>
CloudX.reportRevenueData({
platform: CloudXRevenuePlatform.ADMOB,
revenue: event.value,
adFormat,
currencyCode: event.currency,
precision: toCloudXRevenuePrecision(event.precision),
adUnitId,
});
const AdMobBanner = () => (
<BannerAd
unitId={ADMOB_BANNER_UNIT_ID}
size={BannerAdSize.BANNER}
onPaid={(event) => {
reportAdMobPaidEvent(event, 'banner', ADMOB_BANNER_UNIT_ID);
}}
/>
);对于 Google Ad Manager paid event,请保持相同的收入和精度映射,并设置 platform: CloudXRevenuePlatform.GAM。
自定义平台事件
React Native 为 AdMob 和 Google Ad Manager 提供 JavaScript 常量。对于没有 CloudX JavaScript SDK 常量的 provider,请使用 custom,例如 InMobi、TopOn、TradPlus 和 Nimbus。这里的值只表示 provider 名称,例如 CloudXRevenuePlatform.custom("TradPlus") 或 CloudXRevenuePlatform.custom("Nimbus")。请保持名称稳定,便于 CloudX 一致归类该 provider 的收益。
不要把金额或币种放进 provider 名称里。如果一条 TradPlus 展示带来 USD 0.01 收入,请传 platform: CloudXRevenuePlatform.custom("TradPlus")、revenue: 0.01 和 currencyCode: "USD"。如果来源返回 CPM/eCPM,请先除以 1_000.0。
const reportCustomRevenueEvent = (
providerName,
revenue,
adFormat,
currencyCode,
adUnitId,
placementId,
) =>
CloudX.reportRevenueData({
platform: CloudXRevenuePlatform.custom(providerName),
revenue,
adFormat,
currencyCode,
precision: CloudXRevenuePrecision.PUBLISHER_DEFINED,
adUnitId,
thirdPartyAdPlacementId: placementId,
});测试模式
测试模式通过设备白名单由服务端控制,这样可以更安全、更可控地指定哪些设备接收测试广告。
启用测试模式:
- 启用详细日志后初始化 SDK。
- 在 iOS 或 Android 平台日志中查找您的设备广告 ID。
- 将广告 ID 添加到 CloudX 服务端控制台的设备白名单。
注意: 测试模式由服务端决定,因此无需在开发和生产构建之间修改代码。
隐私合规
CloudX SDK 通过读取平台存储(iOS 上的 NSUserDefaults、Android 上的 SharedPreferences)中的标准 IAB 隐私字符串来支持 GDPR 和 CCPA 隐私合规。这些值通常由您的同意管理平台 (CMP) 自动设置,如 Google UMP、OneTrust 或 Sourcepoint。
工作原理
原生 SDK 会自动检测用户位置并读取同意信号:
- 欧盟用户 (GDPR):根据 IAB 全球供应商列表 检查 TCF v2 目的 1 和 2 的同意和供应商同意(CloudX 供应商 ID:1510)
- 美国用户 (CCPA):检查销售/共享退出信号
- 其他地区:不应用限制
当同意被拒绝或用户选择退出时,SDK 会从广告请求中删除个人身份信息:
- 广告 ID (IDFA/GAID) 被清除
- 地理坐标(经纬度)被删除
- 用户键值对不发送
- 哈希用户 ID 会从发送给竞价方的请求中移除,并且不会写入展示级报表
支持的隐私密钥
| 键 | 标准 | 描述 |
|---|---|---|
IABGPP_HDR_GppString | GPP | 全球隐私平台字符串(现代) |
IABGPP_GppSID | GPP | 部分 ID(例如,“2” 代表欧盟,“7” 代表美国国家,“8” 代表美国加州) |
IABTCF_TCString | TCF v2 | GDPR 同意字符串(传统) |
IABTCF_gdprApplies | TCF v2 | GDPR 是否适用(1 = 是,0 = 否) |
IABUSPrivacy_String | US Privacy | CCPA 隐私字符串(传统,例如 “1YNN”) |
注意:当 GPP(现代标准)和传统 TCF/US Privacy 字符串同时存在时,SDK 优先使用 GPP。
手动隐私 API
如果您自行管理用户同意(不使用 CMP),可以直接设置 GDPR 和 CCPA 隐私状态。这些方法可以在 SDK 初始化之前或之后调用。
import { CloudX } from 'cloudx-react-native';
// GDPR 同意:true、false 或 null(回退到 CMP)
CloudX.setHasUserConsent(true);
// CCPA do-not-sell:true、false 或 null(回退到 CMP)
CloudX.setDoNotSell(true);用户定向
import { CloudX } from 'cloudx-react-native';
// 设置哈希用户 ID 用于定向
CloudX.setHashedUserID('hashed-user-id');
// 设置自定义用户键值对
CloudX.setUserKeyValue('age', '25');
CloudX.setUserKeyValue('gender', 'male');
CloudX.setUserKeyValue('location', 'US');
// 设置自定义应用键值对
CloudX.setAppKeyValue('app_version', '1.0.0');
CloudX.setAppKeyValue('user_level', 'premium');
// 清除所有自定义键值对
CloudX.clearAllKeyValues();哈希用户 ID 是由发布商提供的假名标识符。当适用的隐私信号允许时,CloudX 会在请求和展示活动导出中以 hashed_user_id 返回竞价时记录的值。使用 auction_id 关联这些导出。您可以使用该 ID 将 CloudX 活动与自己的用户数据分群关联。未设置 ID、隐私信号阻止持久化或值超过 128 个字符时,导出值为空。请勿传递未经哈希的个人数据。
每次加载的额外参数
React Native SDK 3.4.4 及更高版本可以为单次广告加载附加广告网络或服务端配置。参数值支持 string、number、boolean、null、数组和嵌套对象。
对于程序化广告,请在启动加载的方法之前调用对应广告格式的 setExtraParameters 方法:
import {
CloudXBannerAd,
CloudXMRECAd,
CloudXInterstitialAd,
CloudXRewardedAd,
CloudXAdPosition,
} from 'cloudx-react-native';
const extraParameters = {
requestId: 'request-456',
bidFloor: 0.5,
testRequest: false,
keywords: ['sports', 'scores'],
context: {
screen: 'home',
refreshIndex: null,
},
};
// 程序化横幅和 MREC 广告:在 createAd() 之前调用。
CloudXBannerAd.setExtraParameters(BANNER_AD_UNIT_ID, extraParameters);
CloudXBannerAd.createAd(BANNER_AD_UNIT_ID, CloudXAdPosition.BOTTOM_CENTER);
CloudXMRECAd.setExtraParameters(MREC_AD_UNIT_ID, extraParameters);
CloudXMRECAd.createAd(MREC_AD_UNIT_ID, CloudXAdPosition.CENTERED);
// 插屏和激励视频广告:在 loadAd() 之前调用。
CloudXInterstitialAd.setExtraParameters(INTERSTITIAL_AD_UNIT_ID, extraParameters);
CloudXInterstitialAd.loadAd(INTERSTITIAL_AD_UNIT_ID);
CloudXRewardedAd.setExtraParameters(REWARDED_AD_UNIT_ID, extraParameters);
CloudXRewardedAd.loadAd(REWARDED_AD_UNIT_ID);对于插屏和激励视频广告,loadAd() 运行时会记录参数值;之后的修改会用于下一次加载。对于程序化横幅和 MREC 广告,请在 createAd() 之前设置参数,以便用于首次竞价。创建广告后的修改会用于后续刷新。
对于组件广告位,请通过 CloudXBannerView 或 CloudXMRECView 的 extraParameters prop 传入参数,不要调用程序化 setter:
import { CloudXBannerView, CloudXMRECView } from 'cloudx-react-native';
<CloudXBannerView
adUnitId={BANNER_AD_UNIT_ID}
extraParameters={{ section: 'top_stories', refreshIndex: 1 }}
/>
<CloudXMRECView
adUnitId={MREC_AD_UNIT_ID}
extraParameters={{ section: 'article_body', refreshIndex: 1 }}
/>完整的组件 API 请参阅横幅和 MREC 广告。
身份透传
通过 setUserKeyValue 传入 UID 2.0、EUID、LiveRamp、ID5 和 Intent IQ。有值时设置一次,刷新后再设一次。
| 键 | 传入内容 |
|---|---|
uidapi.com | UID2 广告 token,不要传 refresh token。不要解密。UID2 文档 |
euid.eu | EUID 广告 token,不要传 refresh token。不要解密。EUID 文档 |
liveramp.com | LiveRamp ATS 信封,不要传 RampID。LiveRamp 文档 |
id5-sync.com | ID5 通用 UID。不要传 0。ID5 文档 |
intentiq.com | Intent IQ ID(IIQ ID),来自你的 Intent IQ 集成。Intent IQ 文档 |
CloudX 不会生成这些 ID。请先用 UID2、EUID、LiveRamp ATS、ID5 或 Intent IQ 生成,再把字符串传进来。这与哈希用户 ID 不是同一回事。
CloudX.setUserKeyValue('uidapi.com', uid2Token);
CloudX.setUserKeyValue('euid.eu', euidToken);
CloudX.setUserKeyValue('liveramp.com', liveRampEnvelope);
CloudX.setUserKeyValue('id5-sync.com', id5Id);
CloudX.setUserKeyValue('intentiq.com', intentIQId);App Tracking Transparency (iOS)
在 iOS 14+ 上请求跟踪授权:
import { requestTrackingAuthorization, getTrackingAuthorizationStatus, CloudXATTStatus } from 'cloudx-react-native';
const status = await requestTrackingAuthorization();
if (status === CloudXATTStatus.AUTHORIZED) {
console.log('跟踪已授权');
}ATT 状态值:AUTHORIZED、DENIED、RESTRICTED、NOT_DETERMINED、NOT_REQUIRED。
在 Android 或 iOS < 14 上,requestTrackingAuthorization() 返回 NOT_REQUIRED。
可视化调试
启用可视化调试覆盖层以查看广告单元边界和网络信息:
CloudX.setVisualDebuggingEnabled(true);支持
如需支持,请联系 support@cloudx.io