主题
激励视频广告
文档版本 v1.0.0
本页对应 SDK 1.0.0,与离线包 docs/ 目录里的同一份文档内容一致。其他版本见文档中心。
与另两种广告位最大的区别是它带「奖励」语义,而奖励一旦有现金价值就必须经服务端验证。
完整示例
java
RewardAd rewardAd = new RewardAd("reward_main");
rewardAd.load(activity, new RewardAdListener() {
@Override public void onAdLoaded(String adnType) {
rewardAd.show(activity); // 加载成功后展示
}
@Override public void onAdLoadFailed(AdError error) { }
@Override public void onAdShow() { }
@Override public void onAdClick() { }
@Override public void onAdClose() { }
@Override public void onReward() { /* 发放奖励 */ }
@Override public void onVideoComplete() { }
});
// Activity onDestroy 中
rewardAd.destroy();一次 load 的广告只能 show 一次,展示后需重新 load。 加载中再次调用 load() 会被静默忽略并打一条 warn 日志 —— 选择静默忽略而不是回调失败, 是因为回调失败会让业务侧以为「没广告」从而错误降级。
onReward 与 onVideoComplete 是两件事
不要互相替代,也不要假设先后顺序。 两家广告平台都一样。
- 优量汇的激励条件不一定是「看完视频」。实测创意可能是「打开 App 体验 15 秒」或「点击广告」, 只播完视频
onReward不触发 - 反过来也实测到过:两条优量汇激励(「打开 App 体验 15 秒」、视频「奖励将于 15 秒后发放」) 都发了
onReward,但onVideoComplete一次都没回调
业务侧的判据只能是 onReward,onVideoComplete 只适合做「视频播完」这类界面反馈。
关闭行为
穿山甲点「跳过」不会直接关闭,会先弹挽留弹窗「再看一个获取更多奖励 / 坚持退出」, 用户点「坚持退出」才触发 onAdClose。优量汇点关闭同样会弹挽留弹窗。
业务侧不要假设「点跳过 == 广告结束」,一切以 onAdClose 为准。
奖励有现金价值时必须接服务端验证
onReward 发生在用户手机上,可被 Hook、重放伪造
奖励能提现、抵扣、抽奖,或者有人会为它刷量时,onReward 只用于界面反馈 (如提示「奖励发放中」),真实发奖以服务端通知为准。金融类 App 基本都落在这一档。
接法见《服务端对接》。奖励只是「多一次复活」这类无价值的,只用 onReward 即可。
带上服务端验证参数后,该对象的请求不使用预加载缓存(缓存里的广告在请求时没有这次的用户 ID):
java
RewardAd rewardAd = new RewardAd("reward_main")
// 用户 ID、自定义数据,均可传 null;必须在 load 之前调用,对之后每次 load 都生效
.setServerSideVerification(currentUser.getId(), "scene=daily_sign");
rewardAd.load(activity, listener);预加载
激励视频入口页打开时预加载,用户点按钮时大概率已经就绪:
java
AdMix.preload(this, "reward_main");未命中缓存但有预加载在飞时,load() 会等它的结果而不重复请求。 带了服务端验证参数的请求既不取缓存也不等预加载。详见《预加载与缓存》。
Kotlin 写法
kotlin
private var rewardAd: RewardAd? = null
private fun loadReward() {
rewardAd?.destroy() // 重新 load 前先销毁上一个
val ad = RewardAd("reward_main")
.setServerSideVerification(currentUser.id, "scene=daily_sign") // 可选,返回 this
rewardAd = ad
ad.load(this, object : RewardAdListener {
override fun onAdLoaded(adnType: String) { ad.show(this@MyActivity) }
override fun onAdLoadFailed(error: AdError) {}
override fun onAdShow() {}
override fun onAdClick() {}
override fun onAdClose() {}
// onReward 与 onVideoComplete 是两件事,不要互相替代
override fun onReward() { /* 奖励有现金价值时只更新界面,发奖以服务端通知为准 */ }
override fun onVideoComplete() {}
})
}
override fun onDestroy() {
rewardAd?.destroy() // 不调必然泄漏
super.onDestroy()
}GroMore 通道的额外效果
穿山甲侧开启服务端激励回调后,平台的验签结果会回传给 GroMore,onReward 只在验证通过时触发。
这仍然不能代替接入方服务器的验签 —— 客户端回调本身可被伪造。