Unity中如何阻止AppOpenAd重复展示?
解决Admob Rewarded广告结束后误触发AppOpenAd的问题
问题核心是:观看Rewarded广告时,系统会将广告界面判定为应用进入后台,广告结束回到应用时触发AppState.Foreground状态,进而调用ShowAdIfAvailable()展示开屏广告,属于误判场景。
可以通过添加状态标记的方式区分「从Rewarded广告返回」和「真正的应用后台唤醒」,具体实现步骤如下:
- 添加状态标记变量
在你的广告管理类中定义一个布尔变量,用于标记当前是否是从Rewarded广告返回应用:
private bool isReturningFromRewardedAd = false;
- 显示Rewarded广告时设置标记
在触发Rewarded广告展示的方法中,将标记设为true,告知后续状态切换逻辑当前是广告返回场景:
public void ShowRewardedAd() { if (rewardedAd != null && rewardedAd.IsLoaded()) { isReturningFromRewardedAd = true; rewardedAd.Show(HandleReward); } }
- 广告回调中重置标记
- 在奖励发放的回调中,延迟重置标记(避免状态切换时标记还未更新):
private void HandleReward(Reward reward) { // 处理用户奖励逻辑(比如发放金币) Invoke(nameof(ResetRewardedFlag), 0.5f); }
- 在Rewarded广告关闭的回调中也重置标记(覆盖用户中途关闭广告的场景):
// 初始化RewardedAd时绑定关闭回调 rewardedAd.OnAdClosed += () => { ResetRewardedFlag(); // 其他广告关闭后的逻辑 }; // 重置标记的方法 private void ResetRewardedFlag() { isReturningFromRewardedAd = false; }
- 修改AppState监听逻辑
在OnAppStateChanged方法中加入标记判断,只有当不是从Rewarded广告返回时,才触发AppOpenAd展示:
private void OnAppStateChanged(AppState state) { UnityEngine.Debug.Log("App State is " + state); if (state == AppState.Foreground && !isReturningFromRewardedAd) { AppOpenAdManager.Instance.ShowAdIfAvailable(); } }
该方案通过精准的状态标记,避免了系统误判带来的重复广告问题,同时不影响Rewarded广告和AppOpenAd的正常功能。
内容的提问来源于stack exchange,提问作者DannyRoy
相关产品推荐
相关产品推荐

