You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何阻止AppOpenAd重复展示?

解决Admob Rewarded广告结束后误触发AppOpenAd的问题

问题核心是:观看Rewarded广告时,系统会将广告界面判定为应用进入后台,广告结束回到应用时触发AppState.Foreground状态,进而调用ShowAdIfAvailable()展示开屏广告,属于误判场景。

可以通过添加状态标记的方式区分「从Rewarded广告返回」和「真正的应用后台唤醒」,具体实现步骤如下:

  1. 添加状态标记变量
    在你的广告管理类中定义一个布尔变量,用于标记当前是否是从Rewarded广告返回应用:
private bool isReturningFromRewardedAd = false;
  1. 显示Rewarded广告时设置标记
    在触发Rewarded广告展示的方法中,将标记设为true,告知后续状态切换逻辑当前是广告返回场景:
public void ShowRewardedAd()
{
    if (rewardedAd != null && rewardedAd.IsLoaded())
    {
        isReturningFromRewardedAd = true;
        rewardedAd.Show(HandleReward);
    }
}
  1. 广告回调中重置标记
  • 在奖励发放的回调中,延迟重置标记(避免状态切换时标记还未更新):
private void HandleReward(Reward reward)
{
    // 处理用户奖励逻辑(比如发放金币)
    Invoke(nameof(ResetRewardedFlag), 0.5f);
}
  • 在Rewarded广告关闭的回调中也重置标记(覆盖用户中途关闭广告的场景):
// 初始化RewardedAd时绑定关闭回调
rewardedAd.OnAdClosed += () =>
{
    ResetRewardedFlag();
    // 其他广告关闭后的逻辑
};

// 重置标记的方法
private void ResetRewardedFlag()
{
    isReturningFromRewardedAd = false;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:50:46