215 lines
5.8 KiB
Markdown
215 lines
5.8 KiB
Markdown
# 广告展示问题修复说明
|
||
|
||
## 问题描述
|
||
|
||
**症状:**
|
||
- 后台日志显示 `uploadAD_Load` 有记录(广告加载成功)
|
||
- 广告的 ecpm 满足条件(>= adbrush_ecpm)
|
||
- 但是 `uploadAD_Show` 日志缺失(广告没有展示)
|
||
|
||
## 可能的原因
|
||
|
||
1. **广告未准备好**:`isAdReady()` 返回 false
|
||
2. **展示失败但未捕获**:SDK 调用了 `didFailToDisplayAd` 但未实现该回调
|
||
3. **状态问题**:`isshow` 标志阻止了展示
|
||
4. **视图问题**:view 为 nil 或无效
|
||
|
||
## ✅ 已修复的问题
|
||
|
||
### 1. 添加了展示失败回调
|
||
|
||
**文件:** `IronSourceinterstitialAd.swift`
|
||
|
||
```swift
|
||
// 新增方法
|
||
func didFailToDisplayAd(with adInfo: LPMAdInfo, error: Error) {
|
||
NSLog("XS- ✗✗✗ didFailToDisplayAd 回调被触发")
|
||
NSLog("XS- 广告展示失败!错误: \(error.localizedDescription)")
|
||
|
||
// 改变状态为展示失败
|
||
changeStatus(st: 6)
|
||
|
||
// 触发关闭回调,让外部可以重试
|
||
self.onAdClosed()
|
||
}
|
||
```
|
||
|
||
### 2. 增强了详细日志
|
||
|
||
#### bbbAdManager.swift - showAd 方法
|
||
|
||
```swift
|
||
✓ 显示当前 isshow 状态
|
||
✓ 显示遍历的广告总数
|
||
✓ 每个广告的详细信息(ID, ecpm, status)
|
||
✓ 判断条件的详细说明
|
||
✓ show() 返回值的记录
|
||
✓ 最终结果的总结
|
||
```
|
||
|
||
#### IronSourceinterstitialAd.swift - show 方法
|
||
|
||
```swift
|
||
✓ 显示 isAdReady() 状态
|
||
✓ 显示 showAd() 调用过程
|
||
✓ 区分广告未准备好和其他失败
|
||
```
|
||
|
||
#### IronSourceinterstitialAd.swift - didDisplayAd 方法
|
||
|
||
```swift
|
||
✓ 明确标记展示成功
|
||
✓ 显示上报 Show 日志的过程
|
||
✓ 显示广告信息(ecpm, network, country)
|
||
```
|
||
|
||
### 3. 修复了 view 为 nil 的崩溃
|
||
|
||
**文件:** `bbbAdManager.swift`
|
||
|
||
```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
|
||
**影响范围:** 广告展示逻辑
|
||
**向后兼容:** ✅ 完全兼容
|