|
|
# Xcode 16 兼容性修复说明
|
|
|
|
|
|
## 问题分析
|
|
|
|
|
|
项目在 Xcode 26 中能正常运行,但在 Xcode 16 中无法运行,主要原因是:
|
|
|
|
|
|
### 1. iOS 部署目标不一致
|
|
|
- 项目配置中混合使用了 iOS 26.0 和 15.6 作为部署目标
|
|
|
- Xcode 16 不支持 iOS 26.0 作为部署目标
|
|
|
|
|
|
### 2. Swift 并发特性不兼容
|
|
|
- `SWIFT_APPROACHABLE_CONCURRENCY = YES` - Xcode 16 不支持
|
|
|
- `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` - Xcode 16 不支持
|
|
|
- `SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES` - Xcode 16 不支持
|
|
|
|
|
|
### 3. 资源目录编译问题(Xcode 16 已知问题)
|
|
|
- 模拟器运行时版本与 SDK 版本不匹配
|
|
|
- 错误:`No simulator runtime version from ["21F79", "23A5297i"] available to use with iphonesimulator SDK version 22F76`
|
|
|
|
|
|
## 已修复内容
|
|
|
|
|
|
### 1. 统一部署目标
|
|
|
- 将所有目标的 `IPHONEOS_DEPLOYMENT_TARGET` 设置为 `15.6`
|
|
|
- 包括主应用、测试目标和 UI 测试目标
|
|
|
|
|
|
### 2. 移除不兼容的 Swift 特性
|
|
|
- 移除 `SWIFT_APPROACHABLE_CONCURRENCY`
|
|
|
- 移除 `SWIFT_DEFAULT_ACTOR_ISOLATION`
|
|
|
- 移除 `SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY`
|
|
|
|
|
|
### 3. 优化资源目录配置
|
|
|
- 移除 App Icon 和 Accent Color 的引用
|
|
|
- 禁用字符串目录生成符号
|
|
|
|
|
|
## 修复后的配置
|
|
|
|
|
|
### 主应用目标
|
|
|
```swift
|
|
|
IPHONEOS_DEPLOYMENT_TARGET = 15.6
|
|
|
SWIFT_EMIT_LOC_STRINGS = YES
|
|
|
SWIFT_VERSION = 5.0
|
|
|
ASSETCATALOG_COMPILER_APPICON_NAME = ""
|
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = ""
|
|
|
STRING_CATALOG_GENERATE_SYMBOLS = NO
|
|
|
```
|
|
|
|
|
|
### 测试目标
|
|
|
```swift
|
|
|
IPHONEOS_DEPLOYMENT_TARGET = 15.6
|
|
|
SWIFT_EMIT_LOC_STRINGS = NO
|
|
|
SWIFT_VERSION = 5.0
|
|
|
```
|
|
|
|
|
|
## 当前状态
|
|
|
|
|
|
✅ **已修复**:
|
|
|
- iOS 部署目标统一为 15.6
|
|
|
- Swift 并发特性已移除
|
|
|
- 项目配置已优化
|
|
|
|
|
|
❌ **仍需解决**:
|
|
|
- 资源目录编译问题(Xcode 16 已知问题)
|
|
|
|
|
|
## 解决方案
|
|
|
|
|
|
### 方案 1:使用 Xcode 15.4 或更早版本
|
|
|
- 这是最直接的解决方案
|
|
|
- 避免 Xcode 16 的资源目录编译问题
|
|
|
|
|
|
### 方案 2:等待 Xcode 16 更新
|
|
|
- Apple 可能会在后续版本中修复这个问题
|
|
|
- 关注 Xcode 16 的更新日志
|
|
|
|
|
|
### 方案 3:临时移除资源目录
|
|
|
- 将 `Assets.xcassets` 从项目中移除
|
|
|
- 在代码中直接使用图片资源
|
|
|
- 注意:这会影响应用的视觉效果
|
|
|
|
|
|
### 方案 4:使用真机调试
|
|
|
- 跳过模拟器,直接在真机上运行
|
|
|
- 避免模拟器运行时版本问题
|
|
|
|
|
|
## 验证步骤
|
|
|
|
|
|
1. 在 Xcode 16 中打开项目
|
|
|
2. 清理构建文件夹 (Product → Clean Build Folder)
|
|
|
3. 选择真机作为运行目标
|
|
|
4. 重新构建项目
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
- 项目现在最低支持 iOS 15.6
|
|
|
- 所有 SwiftUI 功能在 iOS 15.6+ 上正常工作
|
|
|
- 如果遇到其他编译错误,可能需要进一步调整代码
|
|
|
- 资源目录问题可能需要等待 Apple 修复
|
|
|
|
|
|
## 依赖包兼容性
|
|
|
|
|
|
- QRCode 包版本 27.11.0 - 兼容 iOS 15.6+
|
|
|
- Facebook iOS SDK 版本 18.0.0 - 兼容 iOS 15.6+
|
|
|
- VasKit 本地包 - 需要确认兼容性
|
|
|
|
|
|
## 后续建议
|
|
|
|
|
|
1. 考虑降级到 Xcode 15.4 进行开发
|
|
|
2. 定期检查 Xcode 16 的更新
|
|
|
3. 在开发新功能时考虑 Xcode 16 的兼容性
|
|
|
4. 使用条件编译来处理不同 iOS 版本的差异
|
|
|
5. 建立 CI/CD 流程,在多个 Xcode 版本上测试
|
|
|
|
|
|
## 技术细节
|
|
|
|
|
|
### 模拟器运行时版本问题
|
|
|
```
|
|
|
Xcode 16 SDK 版本: 22F76
|
|
|
可用模拟器运行时: ["21F79", "23A5297i"]
|
|
|
问题: 版本不匹配导致资源目录编译失败
|
|
|
```
|
|
|
|
|
|
### 已移除的 Swift 特性
|
|
|
- `SWIFT_APPROACHABLE_CONCURRENCY` - iOS 17+ 特性
|
|
|
- `SWIFT_DEFAULT_ACTOR_ISOLATION` - iOS 17+ 特性
|
|
|
- `SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY` - 实验性特性
|
|
|
|
|
|
### 保留的兼容特性
|
|
|
- `@StateObject` - iOS 14+ 支持
|
|
|
- `@MainActor` - iOS 14+ 支持
|
|
|
- `SWIFT_EMIT_LOC_STRINGS` - 本地化支持
|
|
|
- `SWIFT_VERSION = 5.0` - Swift 5.0 语法
|