5.8 KiB
5.8 KiB
广告展示问题修复说明
问题描述
症状:
- 后台日志显示
uploadAD_Load有记录(广告加载成功) - 广告的 ecpm 满足条件(>= adbrush_ecpm)
- 但是
uploadAD_Show日志缺失(广告没有展示)
可能的原因
- 广告未准备好:
isAdReady()返回 false - 展示失败但未捕获:SDK 调用了
didFailToDisplayAd但未实现该回调 - 状态问题:
isshow标志阻止了展示 - 视图问题: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
🔍 调试步骤
-
查看完整日志,从
XS- showAd 被调用开始 -
定位问题类型:
- 没有 "✓ 找到合适的广告" → ecpm 或 status 问题
- 有 "找到" 但 show() 返回 false → 广告未准备好
- show() 返回 true 但无 didDisplayAd → 查看是否有 didFailToDisplayAd
-
根据场景排查:
- 使用上面的场景分析
- 查看具体的错误信息
-
验证修复:
- 看到 "✓✓✓ didDisplayAd" 和 "uploadAD_Show 调用完成"
📝 状态说明
| Status | 含义 | 说明 |
|---|---|---|
| 0 | 初始 | 刚创建,未开始加载 |
| 1 | 加载中 | 正在请求广告 |
| 2 | 加载完成 | 广告已加载,可以展示 |
| 3 | 展示中 | 广告正在展示 |
| 4 | 关闭 | 广告已关闭 |
| 5 | 加载失败 | 广告加载失败 |
| 6 | 展示失败 | 广告展示失败(新增) |
🎯 关键检查点
运行应用后,如果出现 Load 有但 Show 没有的情况,检查日志中:
- ✅
isAdReady是 true 还是 false? - ✅
show()返回 true 还是 false? - ✅ 是否有
didFailToDisplayAd回调? - ✅ 错误信息是什么?
- ✅
isshow状态是否正确?
把这些信息发给我,我可以精确定位问题!
修复时间: 2025-01-01
影响范围: 广告展示逻辑
向后兼容: ✅ 完全兼容