如何确保iOS应用中AdMob广告的userDidEarnRewardHandler回调正常触发
激励广告奖励回调未触发排查方案
- 验证广告实例有效性
激励广告属于一次性消费资源,单例缓存的Ad.shared.rewardedAd在完成一次展示后就会自动失效,即便实例不为空也无法正常触发奖励回调。你需要在每次广告展示结束(无论用户是否看完)、或展示失败后,立即调用广告加载接口请求新的激励广告实例,保证后续调用present时使用的是新的有效实例。 - 修正代码语法与内存引用问题
你提供的代码存在两处可优化点:一是child.("Coins")多了多余的点符号,属于语法错误需要删除;二是回调块未使用弱引用,可能因循环引用或视图控制器提前销毁导致后续逻辑不执行,修正后的代码参考如下:
if let ad = Ad.shared.rewardedAd { ad.present(fromRootViewController: self, userDidEarnRewardHandler: { [weak self] in guard let self = self else { return } // 先打印日志确认回调是否触发 print("用户完成广告,发放奖励") self.dbRef.child("Users").child("Coins").setValue(ServerValue.increment(1)) }) }
同时需要确认present方法与回调内的数据库操作都在主线程执行,避免跨线程调用导致SDK回调派发失败。
- 检查广告平台配置规则
首先确认你使用的是平台官方提供的测试广告单元ID,部分平台的测试激励广告需要手动点击弹窗的「确认领取奖励」按钮才会触发回调,而非广告播放结束就自动触发。如果你的后台开启了激励广告服务端验证,客户端默认不会触发userDidEarnRewardHandler,需要对接服务端验证接口完成校验后再自行处理奖励发放逻辑。 - 补充全流程监听定位问题
实现广告SDK提供的所有生命周期代理回调,包括广告加载失败、广告展示失败、广告关闭、奖励发放失败等回调,通过日志定位具体故障环节:比如是广告本身展示失败,还是奖励发放环节被平台拦截。
内容的提问来源于stack exchange,提问作者Sofian Tragha
相关产品推荐
相关产品推荐

