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

215 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 广告展示问题修复说明
## 问题描述
**症状:**
- 后台日志显示 `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
**影响范围:** 广告展示逻辑
**向后兼容:** ✅ 完全兼容