旧版Firebase与Angular适配Apple隐私清单要求的问题求助
解决方案建议
一、方案选择优先级
针对你deadline紧张的情况,优先选择手动创建隐私清单的临时方案,理由如下:
- 升级Angular 12→16、AngularFire 6→16、Firebase 8→10涉及大量破坏性变更:Angular从12到16移除了大量旧API(如ViewChild的旧语法、HttpClient的部分配置),AngularFire也重构了不少模块的使用方式,重新测试整个应用的成本极高,完全赶不上当前的上架截止时间。
- 可以复用Firebase 10.22.0的隐私清单内容,但需要针对性裁剪:只保留你当前使用的Firebase模块(Messaging、DynamicLinks、Core等)对应的声明,不需要的模块(如Analytics、Storage)的声明可以剔除,同时补充Capacitor、Cordova等其他SDK的隐私声明。
二、手动创建隐私清单后报错(ITMS-91061)的解决步骤
你遇到的问题大概率是清单格式错误、目标未正确关联,或者遗漏了部分SDK的API声明,按以下步骤排查:
1. 验证文件关联与格式
- 打开Xcode,选中
PrivacyInfo.xcprivacy文件,检查右侧Target Membership是否勾选了主应用目标(不要只勾选extension或其他子target)。 - 核对XML结构是否严格符合Apple要求:确保每个
NSPrivacyAccessedAPITypes条目包含正确的NSPrivacyAccessedAPIType(API类型)和NSPrivacyAccessedAPITypeReasons(理由代码),没有语法错误(比如标签未闭合、键名拼写错误)。
2. 补充所有SDK的隐私声明
App Store列出的所有SDK都需要覆盖对应的隐私API,以下是针对你用到的SDK的核心声明示例(可直接复用,根据实际功能调整理由代码):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSPrivacyAccessedAPITypes</key> <array> <!-- Capacitor/Cordova 基础功能 --> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeFileTimestamp</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>C617.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeUserDefaults</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>CA92.1</string> </array> </dict> <!-- Firebase Core/Installations --> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeDeviceIdentifier</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>35F9.1</string> </array> </dict> <!-- Firebase Messaging --> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypePushNotifications</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>EA4.1</string> </array> </dict> <!-- Firebase Dynamic Links --> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeFileTimestamp</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>C617.1</string> </array> </dict> <!-- GoogleDataTransport/GoogleUtilities/FBLPromises --> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeUserDefaults</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>CA92.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPITypeFileTimestamp</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>C617.1</string> </array> </dict> </array> </dict> </plist>
3. 清理缓存并重新归档
- 执行
Cmd+Shift+K清理构建文件夹,再执行Cmd+Option+Shift+K清理派生数据,避免旧缓存干扰。 - 重新归档应用,导出后检查
AppName.app目录下是否存在PrivacyInfo.xcprivacy,且内容与你编写的一致。
4. 核对理由代码的准确性
确保每个API对应的理由代码符合Apple的官方规范:比如C617.1对应“文件时间戳用于应用功能”,CA92.1对应“用户默认设置用于存储应用状态”,不要随意填写错误代码。
三、后续长期方案
上架成功后,建议分阶段升级依赖:
- 先升级Angular到14(过渡版本,破坏性变更较少),适配后再升级到16。
- 同步升级AngularFire到对应版本,最后升级Firebase到最新稳定版,逐步替换旧API,降低测试成本。
内容的提问来源于stack exchange,提问作者MadMac
相关产品推荐
相关产品推荐

