💡Tips
- 激励视频通过
ATRewardVideoAd实例接入:一个 placementId 对应一个实例。- 加载 / 展示失败经监听器的
onRewardedVideoAdFailed等回调上报,不走 Promise.reject。- 激励视频额外提供发奖回调(
onReward)与视频播放状态回调。- 如需由 SDK 托管加载、关闭后自动补量,请参考自动加载模式。
加载前先注册激励视频监听器。ATRewardVideoListener 各字段均为可选,按需实现:
import {
ATRewardVideoAd,
type ATRewardVideoListener,
} from '@anythink/react-native-sdk';
const listener: ATRewardVideoListener = {
onRewardedVideoAdLoaded: () => {
// 加载成功,可以展示
},
onRewardedVideoAdFailed: (error) => {
// 加载失败
console.log('load fail:', error.fullErrorInfo);
},
onRewardedVideoAdPlayStart: (info) => {
// 开始播放
},
onRewardedVideoAdPlayEnd: (info) => {
// 播放结束
},
onRewardedVideoAdClosed: (info) => {
// 广告关闭
},
onRewardedVideoAdPlayClicked: (info) => {
// 广告被点击
},
onReward: (info) => {
// 发奖成功,在此处理奖励逻辑
},
onRewardFailed: (info) => {
// 发奖失败
},
};
建议在组件中用 useRef 持有实例,并在卸载时注销监听:
import { useEffect, useRef } from 'react';
import { ATRewardVideoAd } from '@anythink/react-native-sdk';
const adRef = useRef<ATRewardVideoAd | null>(null);
useEffect(() => {
const ad = new ATRewardVideoAd('your placement id');
ad.setAdListener(listener);
adRef.current = ad;
return () => ad.removeAdListener(); // 卸载时注销,避免串位
}, []);
adRef.current?.load();
如需指定底价 / 渠道等请求参数,可传入 ATAdRequest:
adRef.current?.load({
channelSource: 1,
adxBidFloorInfo: { bidFloor: 1.5, currency: 'USD' },
});
const ready = await adRef.current?.isAdReady();
if (ready) {
// 有缓存广告,可以展示
}
show() 支持三种入参形态:
// ① 直接展示
adRef.current?.show();
// ② 带广告场景 ID
adRef.current?.show('your_scenario_id');
// ③ 带展示配置(场景 ID + 自定义透传)
adRef.current?.show({
scenarioId: 'your_scenario_id',
showCustomExt: 'your_custom_ext',
});
💡 展示前可调用
ATRewardVideoAd.entryAdScenario(placementId, scenarioId)上报进入广告场景(用于场景化数据统计)。
部分广告源支持二次激励,对应 onRewardedVideoAdAgainPlayStart / onAgainReward 等回调。如有此需求,在监听器中实现 onXxxAgainXxx 字段即可,调用方式与首次激励一致。
import { useEffect, useRef, useState } from 'react';
import { Button, View } from 'react-native';
import {
ATRewardVideoAd,
type ATRewardVideoListener,
} from '@anythink/react-native-sdk';
export function RewardDemo() {
const adRef = useRef<ATRewardVideoAd | null>(null);
const [rewarded, setRewarded] = useState(false);
const listener: ATRewardVideoListener = {
onRewardedVideoAdLoaded: () => console.log('loaded'),
onRewardedVideoAdFailed: (e) => console.log('fail', e.fullErrorInfo),
onReward: () => setRewarded(true),
onRewardedVideoAdClosed: () => {
if (rewarded) {
// 发放奖励给用户
}
},
};
useEffect(() => {
const ad = new ATRewardVideoAd('your placement id');
ad.setAdListener(listener);
adRef.current = ad;
return () => ad.removeAdListener();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<View>
<Button title="加载" onPress={() => adRef.current?.load()} />
<Button
title="展示"
onPress={async () => {
if (await adRef.current?.isAdReady()) {
adRef.current?.show('your_scenario_id');
}
}}
/>
</View>
);
}
| 回调 | 入参 | 说明 |
|---|---|---|
onRewardedVideoAdLoaded |
— | 加载成功 |
onRewardedVideoAdFailed |
AdError |
加载失败 |
onRewardedVideoAdPlayStart |
ATAdInfo |
开始播放 |
onRewardedVideoAdPlayEnd |
ATAdInfo |
播放结束 |
onRewardedVideoAdPlayFailed |
AdError, ATAdInfo? |
播放失败 |
onRewardedVideoAdClosed |
ATAdInfo |
关闭 |
onRewardedVideoAdPlayClicked |
ATAdInfo |
点击 |
onReward |
ATAdInfo |
发奖成功 |
onRewardFailed |
ATAdInfo |
发奖失败 |
onDeeplinkCallback |
ATAdInfo, boolean |
DeepLink 跳转结果 |
onDownloadConfirm |
ATAdInfo |
下载二次确认 |
onRewardedVideoAdAgain* / onAgainReward |
— | 二次激励相关 |