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

214 lines
6.6 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.

# iOS 12/13 兼容性修复总结
## 修复时间
2025-01-01
## 问题描述
应用在 iOS 12/13 系统上启动时崩溃,原因:
1. 使用了 `Task { await ... }` 等 Swift Concurrency API需要 iOS 15+
2. 无条件导入 `AppTrackingTransparency` 框架(仅 iOS 14+ 可用)
## 已修复的文件
### 1. PlayBTopOn/AppDelegate.swift
**修改内容:**
- ❌ 移除:`Task { await BbbAdManager.shared.initAd() }`
- ✅ 替换为:`DispatchQueue.global(qos: .userInitiated).async { BbbAdManager.shared.initAd() }`
**影响:** 兼容 iOS 12+,使用传统的 GCD 异步方式
### 2. PlayBTopOn/playB/YL_PlayVC.swift
**修改内容:**
- ❌ 移除:`Task { await BbbAdManager.shared.waitForSDKInitialization() ... }`
- ✅ 替换为:`BbbAdManager.shared.waitForSDKInitialization { BbbAdManager.shared.loadAd(view: self) }`
**影响:** 使用回调方式等待 SDK 初始化完成
### 3. PlayBTopOn/playB/bbbAdManager.swift
**修改内容:**
- ✅ 新增:`initAd(completion:)` - 基于回调的初始化方法(兼容所有版本)
- ✅ 新增:`waitForSDKInitialization(completion:)` - 基于回调的等待方法
- ✅ 重命名:原 `initAd() async``initAdAsync()` 并标记 `@available(iOS 15.0, *)`
- ✅ 重命名:原 `waitForSDKInitialization() async``waitForSDKInitializationAsync()` 并标记 `@available(iOS 15.0, *)`
- 🔴 **关键修复:** 移除 `CheckedContinuation` 类型,改用普通闭包数组
-`private var initializationContinuations: [CheckedContinuation<Void, Never>] = []`
-`private var initializationCallbacks: [() -> Void] = []`
**影响:** 提供双版本 API默认使用回调方式移除了导致 iOS 12 崩溃的 Swift Concurrency 类型
### 4. PlayBTopOn/playB/idfa.swift
**修改内容:**
- ❌ 移除:顶部的 `import AppTrackingTransparency`
- ✅ 添加:`#if canImport(AppTrackingTransparency) import AppTrackingTransparency #endif`
- ✅ 添加:所有 ATT 相关代码都用 `#if canImport(AppTrackingTransparency)` 包裹
- ✅ 修改:`checkATT()` 方法使用条件编译,低版本自动降级到旧 API
**影响:** 编译时只在支持的平台引入 ATT运行时自动选择合适的 IDFA 获取方式
### 5. PlayBTopOn/playB/YL_NetWorkManager.swift
**修改内容:**
- ❌ 移除:顶部的 `import AppTrackingTransparency`
- ✅ 添加:`#if canImport(AppTrackingTransparency) import AppTrackingTransparency #endif`
- ✅ 修改:`getAdvertisingTrackingStatus()` 使用条件编译
- ✅ 修改:`isAdvertisingTrackingEnabled()` 使用条件编译
**影响:** ATT API 调用被条件编译保护,低版本使用 `ASIdentifierManager` 旧 API
## 新增文件
### 1. iOS12_COMPATIBILITY_GUIDE.md
详细的配置指南,包括:
- 问题说明
- Xcode 配置步骤
- 测试验证方法
- 常见问题解答
### 2. check_ios12_compatibility.sh
自动化检查脚本,检测:
- Task/async/await 未保护的使用
- AppTrackingTransparency 导入保护
- Podfile 和项目配置
- 其他潜在问题
### 3. CHANGES_SUMMARY.md
本文件,记录所有修改内容
## 验证结果
**所有代码检查通过!**
```
======================================
iOS 12/13 兼容性检查
======================================
✓ 未发现 Task 调用
✓ 所有 async 函数都已保护
✓ AppTrackingTransparency 导入已正确保护
✓ Podfile 最低版本: iOS 12.0
✓ 找到 Info.plist
错误: 0
警告: 3
```
## 🔴 关键崩溃修复
**问题:** 应用在打印 `"XS- 开始创建 BbbAdManager.shared 单例"` 后崩溃
**原因:** `CheckedContinuation` 类型在 iOS 12 上不存在
**解决:** 已替换为普通闭包数组
详细信息请查看:[CRITICAL_FIX.md](./CRITICAL_FIX.md)
## 仍需手动操作的事项
### ⚠️ 重要:在 Xcode 中配置弱链接
1. **打开 Xcode 项目**
```
open PlayBTopOn.xcworkspace
```
2. **配置 AppTrackingTransparency 为 Optional**
- 选择项目 → TARGETS → PlayBTopOn
- Build Phases → Link Binary With Libraries
- 找到或添加 `AppTrackingTransparency.framework`
- 将 Status 改为 **Optional** (不是 Required)
3. **验证 Deployment Target**
- General → Deployment Info
- iOS Deployment Target 设置为 **12.0**
### 可选:添加 ATT 权限说明
如果需要在 iOS 14+ 上请求追踪权限,在 `Info.plist` 中添加:
```xml
<key>NSUserTrackingUsageDescription</key>
<string>我们需要获取您的广告标识符以提供个性化广告体验</string>
```
## 兼容性矩阵
| iOS 版本 | 支持状态 | IDFA 获取方式 | 异步调用方式 |
|---------|---------|-------------|------------|
| iOS 12.x | ✅ 完全支持 | ASIdentifierManager | DispatchQueue + 回调 |
| iOS 13.x | ✅ 完全支持 | ASIdentifierManager | DispatchQueue + 回调 |
| iOS 14.x | ✅ 完全支持 | ATTrackingManager | DispatchQueue + 回调 |
| iOS 15+ | ✅ 完全支持 | ATTrackingManager | async/await 或 回调 |
## 测试建议
### 1. 编译测试
```bash
# 清理构建
xcodebuild clean
# 构建项目
xcodebuild build -workspace PlayBTopOn.xcworkspace \
-scheme PlayBTopOn \
-destination 'platform=iOS Simulator,name=iPhone 8,OS=12.4'
```
### 2. 模拟器测试
- iOS 12.4 (iPhone 8)
- iOS 13.7 (iPhone 11)
- iOS 14.8 (iPhone 12)
- iOS 15.0+ (任意设备)
### 3. 真机测试
在实际设备上测试,特别是:
- 旧设备运行 iOS 12/13
- 新设备运行 iOS 14+
## 回滚方法
如果需要回滚这些更改:
```bash
git log --oneline # 查看提交历史
git revert <commit-hash> # 回滚指定提交
```
或者从备份恢复:
```bash
cp -r PlayBTopOn.backup/* PlayBTopOn/
```
## 技术要点总结
### Swift Concurrency 兼容性
- `Task` / `async` / `await` 需要 iOS 15+
- 使用 `@available(iOS 15.0, *)` 标记
- 提供基于 `DispatchQueue` 和回调的替代方案
### 弱链接 (Weak Linking)
- 框架在 Build Phases 中设置为 Optional
- 运行时动态加载,不存在也不崩溃
- 代码中用 `#if canImport()` 条件编译
### 版本检查
- `@available(iOS 14, *)` - 运行时检查
- `#if canImport()` - 编译时检查
- 两者结合使用最安全
## 相关文档
- [iOS12_COMPATIBILITY_GUIDE.md](./iOS12_COMPATIBILITY_GUIDE.md) - 详细配置指南
- [check_ios12_compatibility.sh](./check_ios12_compatibility.sh) - 自动检查脚本
## 联系支持
如遇问题,请:
1. 运行 `./check_ios12_compatibility.sh` 检查配置
2. 查看 Xcode 控制台的崩溃日志
3. 确认 AppTrackingTransparency 已设置为 Optional
---
**修复完成 ✅**
**最低支持版本iOS 12.0**
**测试状态:代码验证通过,待真机测试**