build-ipa/ironSource/PlayBTopOn/AD_DISPLAY_FIX.md
2026-01-05 10:40:05 +08:00

5.8 KiB
Raw Blame History

广告展示问题修复说明

问题描述

症状:

  • 后台日志显示 uploadAD_Load 有记录(广告加载成功)
  • 广告的 ecpm 满足条件(>= adbrush_ecpm
  • 但是 uploadAD_Show 日志缺失(广告没有展示)

可能的原因

  1. 广告未准备好isAdReady() 返回 false
  2. 展示失败但未捕获SDK 调用了 didFailToDisplayAd 但未实现该回调
  3. 状态问题isshow 标志阻止了展示
  4. 视图问题view 为 nil 或无效

已修复的问题

1. 添加了展示失败回调

文件: IronSourceinterstitialAd.swift

// 新增方法
func didFailToDisplayAd(with adInfo: LPMAdInfo, error: Error) {
    NSLog("XS- ✗✗✗ didFailToDisplayAd 回调被触发")
    NSLog("XS- 广告展示失败!错误: \(error.localizedDescription)")
    
    // 改变状态为展示失败
    changeStatus(st: 6)
    
    // 触发关闭回调,让外部可以重试
    self.onAdClosed()
}

2. 增强了详细日志

bbbAdManager.swift - showAd 方法

 显示当前 isshow 状态
 显示遍历的广告总数
 每个广告的详细信息(ID, ecpm, status
 判断条件的详细说明
 show() 返回值的记录
 最终结果的总结

IronSourceinterstitialAd.swift - show 方法

 显示 isAdReady() 状态
 显示 showAd() 调用过程
 区分广告未准备好和其他失败

IronSourceinterstitialAd.swift - didDisplayAd 方法

 明确标记展示成功
 显示上报 Show 日志的过程
 显示广告信息(ecpm, network, country

3. 修复了 view 为 nil 的崩溃

文件: bbbAdManager.swift

// 安全地检查 view
if self.isshow == false, let viewController = self.view {
    self.showAd(v: viewController)
} else if self.view == nil {
    NSLog("XS- 警告: view 为 nil无法展示广告")
}

4. 改进了展示逻辑

  • 当一个广告 show() 返回 false 时,继续尝试下一个
  • 只有成功调用 show() 才设置 isshow = true
  • 展示失败时自动重置状态,允许重试

📊 日志分析指南

正常流程的日志

XS- showAd 被调用,当前 isshow: false
XS- 开始遍历广告位,总数: 3
XS- 检查广告 [0]: ID=xxx, ecpm=0.05, status=2, 要求ecpm>=0.0005
XS- ✓ 找到合适的广告,准备展示: xxx
XS- IronSourceinterstitialAd.show 被调用: xxx
XS- 广告准备状态 isAdReady: true, adID: xxx
XS- ✓ 调用 showAd准备展示广告: xxx
XS- showAd 调用完成,等待 didDisplayAd 回调
XS- ✓ 广告 show() 返回 true标记 isshow=true
XS- ✓✓✓ didDisplayAd 回调被触发: xxx
XS- 广告展示成功,准备上报 Show 日志
XS- 开始上报 uploadAD_Show: xxx
XS- uploadAD_Show 调用完成

场景 1: 广告未准备好

XS- 广告准备状态 isAdReady: false, adID: xxx
XS- ✗ 广告未准备好,无法展示: xxx
XS- ✗ 广告 show() 返回 false可能未准备好尝试下一个

原因: 虽然 status=2加载完成但 SDK 的 isAdReady() 返回 false

解决:

  • 检查是否过早调用 show
  • 检查广告是否已过期
  • 查看 SDK 文档的广告有效期

场景 2: 展示失败SDK 错误)

XS- ✓ 调用 showAd准备展示广告: xxx
XS- showAd 调用完成,等待 didDisplayAd 回调
XS- ✗✗✗ didFailToDisplayAd 回调被触发: xxx
XS- 广告展示失败!错误: Ad expired

原因: SDK 尝试展示但失败(广告过期、网络问题等)

解决:

  • 广告过期:缩短 load 到 show 的时间
  • 网络问题:检查网络连接
  • 其他错误:根据错误信息排查

场景 3: ecpm 不足

XS- 检查广告 [0]: ID=xxx, ecpm=0.0003, status=2, 要求ecpm>=0.0005
XS- ✗ 广告 ecpm 不足: xxx, ecpm=0.0003 < 0.0005

原因: 广告 ecpm 太低,不满足展示条件

解决:

  • 调整 adbrush_ecpm 阈值
  • 等待更高 ecpm 的广告

场景 4: isshow 阻塞

XS- showAd 被调用,当前 isshow: true
XS- ✗ isshow=true已有广告在展示中跳过

原因: 已经有广告在展示,防止重复展示

解决: 正常情况,等待当前广告关闭

场景 5: view 为 nil

XS- 警告: view 为 nil无法展示广告

原因: loadAd() 还未被调用,或 start() 在 loadAd() 之前触发

解决: 已在代码中修复,确保 loadAd 后才调用 start

🔍 调试步骤

  1. 查看完整日志,从 XS- showAd 被调用 开始

  2. 定位问题类型

    • 没有 "✓ 找到合适的广告" → ecpm 或 status 问题
    • 有 "找到" 但 show() 返回 false → 广告未准备好
    • show() 返回 true 但无 didDisplayAd → 查看是否有 didFailToDisplayAd
  3. 根据场景排查

    • 使用上面的场景分析
    • 查看具体的错误信息
  4. 验证修复

    • 看到 "✓✓✓ didDisplayAd" 和 "uploadAD_Show 调用完成"

📝 状态说明

Status 含义 说明
0 初始 刚创建,未开始加载
1 加载中 正在请求广告
2 加载完成 广告已加载,可以展示
3 展示中 广告正在展示
4 关闭 广告已关闭
5 加载失败 广告加载失败
6 展示失败 广告展示失败(新增)

🎯 关键检查点

运行应用后,如果出现 Load 有但 Show 没有的情况,检查日志中:

  1. isAdReady 是 true 还是 false
  2. show() 返回 true 还是 false
  3. 是否有 didFailToDisplayAd 回调?
  4. 错误信息是什么?
  5. isshow 状态是否正确?

把这些信息发给我,我可以精确定位问题!


修复时间: 2025-01-01
影响范围: 广告展示逻辑
向后兼容: 完全兼容