docs:依赖管理改为纯 SPM + Vendor,移除 CocoaPods(ADR-006)

调研发现 Qiniu SDK 已官方支持 SPM(https://github.com/qiniu/objc-sdk
v8.9.x),AMap 仍仅支持 CocoaPods 或手动 XCFramework;CocoaPods 1.15.2
不兼容 Xcode 26 的 PBXFileSystemSynchronizedRootGroup,需绕道 Bundler
才能升到 1.16+。综合性价比决定不引入 CocoaPods 工具链,所有闭源 SDK
(含 AMap)统一走 Vendor .xcframework 手动接入。

- Design §14.1 三层策略改写为两层(SPM + Vendor),新增 Vendor 接入
  标准流程 6 步法
- Design §14.2 AMap 接入方式从 CocoaPods 改为 Vendor,Qiniu 标注 SPM
  URL 与版本
- Plan §2.3 / §5 Phase 5.1 / §6.1 / §8 同步 AMap Vendor 化
- Plan 新增 ADR-006 完整决策记录
- CLAUDE.md 新增「依赖管理约定」节,禁止引入 CocoaPods
This commit is contained in:
joywayer
2026-06-21 21:46:19 +08:00
parent 2a3d985dd7
commit 17a8b96cf8
3 changed files with 74 additions and 21 deletions
+32 -8
View File
@@ -62,7 +62,7 @@ Contract Design Plan(本文档)
| 微信 AppID`wx586a9b321e56efb7`+ Universal Links 配置 | 微信回调 | Phase 4 | 项目方 |
| QQ OpenSDK `.framework` + AppID | QQ 分享 | Phase 4 | 项目方 |
| 后台 `/wechat/login` 中转接口 | secret 不入 IPA 的前提 | Phase 4 | 后台团队 |
| 高德地图 `APIKey` + SDK Pod | 定位 | Phase 5 | 已有 key `b0d4a8e3fcbbcc0dd96283b7df6a4494`,但需新建 Bundle ID 注册 |
| 高德地图 `APIKey` + SDK XCFramework | 定位 | Phase 5 | 已有 key `b0d4a8e3fcbbcc0dd96283b7df6a4494`(但绑死 msext Bundle ID,需用新 Bundle ID 重新申请);SDK 走 Vendor 手动接入(ADR-006),下载页 https://lbs.amap.com/api/ios-location-sdk/download |
| 七牛上传 token 颁发接口 | 录音上传 | Phase 3 | 后台团队 |
| ~~极光 AppKey~~ | ~~用户统计~~ | **已决策暂不集成(ADR-005),未来启用时再协调** | — |
| Sentry DSN | 崩溃监控 | Phase 9 | 项目方(需开通账号) |
@@ -464,11 +464,11 @@ Contract Design Plan(本文档)
#### 前置
- Phase 1 完成
- ⏳ 高德 SDKCocoaPods 接入,APIKey 已有但 Bundle ID 重新注册)
- ⏳ 高德 SDK XCFrameworkVendor 手动,ADR-006+ 新 Bundle ID 重新申请 APIKey
#### 任务清单
- [ ] **5.1** 加 Podfile + 引入 `AMapLocation` 9.x
- [ ] **5.1** 从 [高德官方下载页](https://lbs.amap.com/api/ios-location-sdk/download) 拉取最新 `AMapLocationKit.xcframework` + `AMapFoundationKit.xcframework`,放 `Vendor/AMap/`Target → General → Embed Frameworks 加入;按 Design §14.1 Vendor 接入标准流程操作;`Vendor/AMap/README.md` 记录版本号 / 下载日期
- [ ] **5.2** Info.plist 加 `NSLocationWhenInUseUsageDescription = "{gamehallname}需要访问您的位置以提供本地化服务"`
- [ ] **5.3** `Source/SDK/AMap/AMapWrapper.swift`:启动期 `updatePrivacyShow` + `updatePrivacyAgree` + `apiKey` 设置
- [ ] **5.4** `Source/Location/LocationService.swift`actor
@@ -680,10 +680,10 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
| 集成方式 | SDK | 集成 Phase |
|---------|-----|----------|
| **SPM 优先** | ZIPFoundation / Sentry / 七牛 v8+ | Phase 1 / 9 / 3 |
| **CocoaPods** | 高德 AMap | Phase 5 |
| **Vendor `.framework`** | 微信 / QQ;闲聊 / Agora / **JAnalytics** 均暂不集成(Noop 占位) | Phase 4 |
| **SPM 优先** | ZIPFoundation / Sentry / 七牛 v8.9.x`https://github.com/qiniu/objc-sdk` | Phase 1 / 9 / 3 |
| **Vendor `.xcframework`** | 微信 / QQ / **高德 AMap**ADR-006);闲聊 / Agora / JAnalytics 均暂不集成(Noop 占位) | Phase 4 / 5 |
| **Vendor `.a`** | opencore-amr | Phase 3 |
| ~~CocoaPods~~ | **不引入**ADR-006,纯 SPM + Vendor 两层管理) | — |
每集成一个 SDK 立即提交一个独立 commitCLAUDE.md "及时提交" 规则)。
@@ -792,7 +792,7 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
- [ ] 4.12 远程图片分享
### Phase 5 定位
- [ ] 5.1 AMap Pod
- [ ] 5.1 AMap Vendor 接入(XCFramework
- [ ] 5.2 定位权限文案
- [ ] 5.3 AMapWrapper 启动注册
- [ ] 5.4 LocationService
@@ -895,7 +895,31 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
5. Info.plist 加 AppKey + 隐私授权文案
- **复盘节点**:上线 3 个月后业务方根据数据需求决定是否启用
### ADR-006:纯 SPM + Vendor `.xcframework` 两层依赖管理,不引入 CocoaPods2026-06-21
- **背景**Design 原方案是"SPM 优先 + CocoaPods 兜底 + Vendor 手动"三层策略,CocoaPods 仅服务于高德 AMap 定位 SDK 一个依赖
- **触发事件**:尝试 `pod init` 时,CocoaPods 1.15.2Homebrew 上的最新版)自带的 `xcodeproj` gem 1.24.0 不识别 Xcode 26.5 默认的 `PBXFileSystemSynchronizedRootGroup`pod init 直接抛 `unknown ISA` 异常
- **调研结论**
- 七牛 SDK 已官方支持 SPM`https://github.com/qiniu/objc-sdk`v8.9.x),原计划的"七牛走 CocoaPods"完全无必要
- 高德 AMap 定位 SDK 官方未提供 SPM(截至 2026-06),但提供 XCFramework 直接下载
- CocoaPods 1.16+ 才支持新 ISA,但 Homebrew 未跟进;需绕道 Bundler + Gemfile / brew --HEAD / rbenv 自管 Ruby,均增加工具链复杂度
- **决策**:依赖管理简化为**两层 — SPM 优先 + Vendor `.xcframework` 手动****完全不引入 CocoaPods**
- SPMZIPFoundation / Sentry / Qiniu / WVJB JS(资源文件)
- Vendor:微信 / QQ / **高德 AMap** / opencore-amr;闲聊 / Agora / JAnalytics 暂不集成(Noop 占位)
- **理由**
- 项目实际只有高德 AMap 1 个 SDK 让 CocoaPods 必要;为 1 个依赖引入整套 Ruby + Bundler + CocoaPods + workspace 工具链 + Xcode 26 兼容性维护,性价比低
- 闭源 SDK 本就是 Vendor 性质(微信 / QQ / 闲聊 / JAnalytics / opencore-amr),AMap 走同款流程不增加心智负担
- 生态趋势:Google 已宣布 2026 Q2 后 iOS SDK 全部停止 CocoaPods 支持;CocoaPods 维护活跃度下降
- 工程入口仍是 `.xcodeproj`(不需要 `.xcworkspace`),团队 / CI 配置不需要切换
- **接入标准流程**Vendor,写入 Design §14.1):
1. 二进制放 `Vendor/<SDKName>/<SDKName>.xcframework`
2. Target → General → Frameworks → `+`,动态库选 "Embed & Sign",静态库 "Do Not Embed"
3. Library / Header Search Paths 用 `$(PROJECT_DIR)/Vendor/<SDKName>` 相对路径
4. `Vendor/<SDKName>/README.md` 记录版本号 / 下载日期 / 官方更新页 URL
5. 二进制入 git(项目规模可控,暂不强制 git-lfs)
- **回滚条件**:未来某天出现 ≥ 3 个仅有 podspec 而无 SPM / XCFramework 的 SDK 必接需求时,重新评估是否引入 CocoaPods
- **维护责任**:AMap 升级(年度级)→ 下载新 XCFramework 覆盖 `Vendor/AMap/` + 更新 README + 跑契约测试
---
文档完成日期:2026-06-21
最后更新:2026-06-21ADR-005 极光降级 + Resources/ 目录记录)
最后更新:2026-06-21ADR-006 纯 SPM + Vendor 策略 + ADR-005 极光降级 + Resources/ 目录记录)