# iOS 12/13 兼容性配置指南
## 问题说明
在 iOS 12/13 系统上,如果应用使用了 `AppTrackingTransparency` 框架(iOS 14+ 才有),即使代码中有 `@available(iOS 14, *)` 检查,应用启动时也会因为找不到该框架而直接崩溃。
## 已完成的代码修复
✅ 移除了所有 `Task { await ... }` 代码,改用 `DispatchQueue` 和回调
✅ 使用 `#if canImport(AppTrackingTransparency)` 条件编译
✅ 所有 async/await 代码都标记了 `@available(iOS 15.0, *)`
## 需要在 Xcode 中手动配置的步骤
### ⚠️ 重要:将 AppTrackingTransparency 设置为弱链接
1. **打开 Xcode 项目**
- 打开 `PlayBTopOn.xcworkspace`
2. **进入项目设置**
- 在左侧项目导航栏中,点击项目根节点 `PlayBTopOn`
- 选择 `TARGETS` -> `PlayBTopOn`
3. **配置弱链接**
- 选择 `Build Phases` 标签
- 展开 `Link Binary With Libraries`
- 找到或添加 `AppTrackingTransparency.framework`
- 将右侧的 `Status` 列从 `Required` 改为 `Optional`
**如果列表中没有 AppTrackingTransparency.framework:**
- 点击 `+` 按钮
- 搜索 `AppTrackingTransparency.framework`
- 添加后,将其状态设置为 `Optional`
4. **验证设置**
- 确保 `AppTrackingTransparency.framework` 的状态显示为 `Optional`
- 这样在 iOS 12/13 上,即使框架不存在,应用也不会崩溃
### 检查部署目标
1. **设置最低支持版本**
- 在 `TARGETS` -> `PlayBTopOn` -> `General` 标签
- 找到 `Deployment Info` 部分
- 将 `iOS Deployment Target` 设置为 `iOS 12.0`
2. **检查 Podfile**
- 打开项目根目录的 `Podfile`
- 确保第一行包含:`platform :ios, '12.0'`
- 如果修改了,运行 `pod install`
### 可选:添加 NSUserTrackingUsageDescription(如果需要在 iOS 14+ 上请求 IDFA)
如果你计划在 iOS 14+ 上请求用户授权追踪,需要在 `Info.plist` 中添加说明:
```xml
NSUserTrackingUsageDescription
我们需要获取您的广告标识符以提供个性化广告体验
```
## 测试验证
### 在 iOS 12/13 设备或模拟器上测试
1. 选择 iOS 12 或 iOS 13 的模拟器
2. 清理项目:`Product` -> `Clean Build Folder` (Cmd+Shift+K)
3. 编译运行:`Product` -> `Run` (Cmd+R)
4. 检查控制台日志,确保没有崩溃
### 在 iOS 14+ 设备上测试
1. 选择 iOS 14+ 的模拟器或真机
2. 运行应用,ATT 功能应该正常工作
3. 检查是否能正常请求广告追踪权限
## 代码修改总结
### 1. AppDelegate.swift
- ❌ 移除:`Task { await BbbAdManager.shared.initAd() }`
- ✅ 替换:`DispatchQueue.global(qos: .userInitiated).async { BbbAdManager.shared.initAd() }`
### 2. YL_PlayVC.swift
- ❌ 移除:`Task { await BbbAdManager.shared.waitForSDKInitialization() ... }`
- ✅ 替换:`BbbAdManager.shared.waitForSDKInitialization { ... }`
### 3. bbbAdManager.swift
- ✅ 添加:基于回调的 `initAd(completion:)` 方法
- ✅ 添加:基于回调的 `waitForSDKInitialization(completion:)` 方法
- ✅ 保留:async/await 版本(标记 `@available(iOS 15.0, *)`)
### 4. idfa.swift
- ✅ 使用:`#if canImport(AppTrackingTransparency)` 条件编译
- ✅ 移除:文件顶部的无条件 `import AppTrackingTransparency`
### 5. YL_NetWorkManager.swift
- ✅ 使用:`#if canImport(AppTrackingTransparency)` 条件编译
- ✅ 保护:所有使用 `ATTrackingManager` 的代码
## 兼容性保证
| iOS 版本 | 支持状态 | 说明 |
|---------|---------|------|
| iOS 12.x | ✅ 完全支持 | 使用旧版 IDFA API |
| iOS 13.x | ✅ 完全支持 | 使用旧版 IDFA API |
| iOS 14.x | ✅ 完全支持 | 使用 ATT 框架 |
| iOS 15+ | ✅ 完全支持 | 支持 async/await + ATT |
## 常见问题
### Q: 为什么需要设置为 Optional?
A: 因为 AppTrackingTransparency.framework 在 iOS 14 才引入,iOS 12/13 系统中不存在这个框架。设置为 Optional 后,系统会在运行时动态加载,如果不存在也不会崩溃。
### Q: 代码中的 `#if canImport()` 是什么?
A: 这是编译时检查,确保只在可以导入该框架的环境下才编译相关代码。
### Q: 如果忘记设置 Optional 会怎样?
A: 应用会在 iOS 12/13 启动时立即崩溃,错误信息类似于 "dyld: Library not loaded: /System/Library/Frameworks/AppTrackingTransparency.framework"
## 编译和发布
编译通过后,可以正常打包发布:
- Archive: `Product` -> `Archive`
- 导出 IPA 进行分发测试
- 确保在不同 iOS 版本上都进行了测试
---
**修复完成时间**: 2025-01-01
**最低支持版本**: iOS 12.0
**推荐测试版本**: iOS 12.5, iOS 13.7, iOS 14.8, iOS 15.0+