1***@qq.com
1***@qq.com
  • 发布:2026-08-07 19:31
  • 更新:2026-08-07 19:46
  • 阅读:25

关于多个页面的激励广告相互串的问题

分类:uni-app

采用API方式调用激励广告组件:uni.createRewardedVideoAd

3个页面都有自己的广告位,分别用自己的广告位id加载广告。

当三个页面都访问过之后,再通过其中一个页面看广告,出现如下两个问题:

1、通过A页面看广告,实际用的B页面广告。(通过时长判断的,AB两个页面的广告位时长一个是15s,一个是30s)

2、看完广告后,会导致三个页面的广告完成回调(onClose)都执行。

2026-08-07 19:31 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-ad交流群 ) 咨询,群中有相关专业的管理员和群友。

这个问题是典型的激励视频广告实例未正确销毁导致的串扰问题。结合知识库和 uni-ad 广告接入规范,分析如下:

问题根因

  1. 广告实例未销毁uni.createRewardedVideoAd 创建的实例是全局单例模式,如果页面销毁时未调用 destroy(),实例会一直存在于内存中。当从 A 页面跳转到 B 页面时,B 页面创建的新实例会覆盖旧实例,但 A 页面的回调监听可能仍绑定在旧实例上,导致:

    • 广告内容串台(A 页面显示 B 页面的广告)
    • 多个页面的 onClose 回调被同时触发
  2. 广告位 ID 混淆:虽然每个页面使用不同的 adpid,但由于实例未隔离,实际加载的广告可能来自其他页面的广告位。

解决方案

1. 确保每个页面独立创建和销毁广告实例

在每个页面的 onUnloadonHide 生命周期中,必须销毁广告实例:

// 页面 A  
export default {  
  data() {  
    return {  
      rewardedVideoAd: null  
    }  
  },  
  onLoad() {  
    this.initAd()  
  },  
  onUnload() {  
    // 页面销毁时必须销毁广告实例  
    if (this.rewardedVideoAd) {  
      this.rewardedVideoAd.destroy()  
      this.rewardedVideoAd = null  
    }  
  },  
  methods: {  
    initAd() {  
      // 创建广告实例  
      this.rewardedVideoAd = uni.createRewardedVideoAd({  
        adpid: '你的广告位ID_A' // 替换为实际广告位ID  
      })  

      // 监听广告加载  
      this.rewardedVideoAd.onLoad(() => {  
        console.log('广告加载成功')  
      })  

      // 监听广告关闭  
      this.rewardedVideoAd.onClose((res) => {  
        if (res.isEnded) {  
          console.log('用户完整观看了广告')  
          // 发放奖励(必须通过服务器回调验证)  
        } else {  
          console.log('用户中途关闭了广告')  
        }  
      })  

      // 监听广告错误  
      this.rewardedVideoAd.onError((err) => {  
        console.error('广告错误:', err)  
      })  
    },  
    showAd() {  
      if (this.rewardedVideoAd) {  
        this.rewardedVideoAd.show().catch(err => {  
          console.error('广告展示失败:', err)  
        })  
      }  
    }  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

2. 避免全局单例污染

如果多个页面可能同时存在,建议:

  • 不要在全局(如 App.vuemain.js)创建广告实例
  • 每个页面独立管理自己的实例
  • 页面跳转时确保前一个页面的实例已销毁

3. 检查广告位配置

  • 确保每个页面的 adpid 正确且已通过审核(参考广告位管理文档
  • 如果使用自定义基座测试,确保基座包含所有需要的广告 SDK(如优量汇、穿山甲等)

4. 服务器回调验证

根据知识库,客户端回调不可信,必须通过服务器回调发放奖励:

排查步骤

  1. 检查代码:确认每个页面是否在 onUnload 中调用了 destroy()
  2. 日志验证:在 onClose 回调中打印当前页面的 adpid,确认是否串台
  3. 测试流程
    • 访问页面 A,加载广告但不观看
    • 跳转到页面 B,加载广告并观看
    • 观察 A 页面的 onClose 是否被触发

参考文档

如果问题仍未解决,请提供:

  1. 页面跳转逻辑代码
  2. 广告初始化和销毁的完整代码
  3. 控制台日志(重点关注 adpid 和回调触发顺序)
内容为 AI 生成,仅供参考
DCloud_Android_zl

DCloud_Android_zl

Android还是iOS?提供一个测试例

要回复问题请先登录注册