苹果2025年的新审核规则:苹果现在要求常见的第三方 SDK(比如 AFNetworking、MBProgressHUD、SDWebImage 这种老牌库)必须提供一个 Privacy Manifest(隐私清单文件),否则会报 ITMS-91061 错误。
TMS-91061: Missing privacy manifest- Your app includes “Frameworks/AFNetworking.framework/AFNetworking”, which includes AFNetworking, an SDK that was identified in the documentation as a commonly used third-party SDK. If a new app includes a commonly used third-party SDK, or an app update adds a new commonly used third-party SDK, the SDK must include a privacy manifest file. Please contact the provider of the SDK that includes this file to get an updated SDK version with a privacy manifest. For more details about this policy, including a list of SDKs that are required to include signatures and manifests, visit: https://developer.apple.com/support/third-party-SDK-requirements.
SDK需要隐私清单文件:
有些SDK在最新版本中新增了隐私清单,需要升级最新的SDK。
有些SDK官方停更,没有隐私清单,需要手动添加。
创建隐私清单文件
方案1: Xcode内创建隐私清单文件
在Xcode中在合适的位置,右击选择“New File from Template…”。

找到“App Privacy”类型,点击“Next”开始创建隐私清单文件。

隐私清单文件名称为:PrivacyInfo.xcprivacy

创建完成后,显示App Privacy隐私图标的文件。

点击PrivacyInfo.xcprivacy文件,点击App Privacy Configuration右侧的加号。

新增所有枚举选项。

方案2: 手动创建隐私清单文件
在Xcode项目文件夹中中新建一个PrivacyInfo.xcprivacy文件:
路径随意,比如YourApp/PrivacyInfo.xcprivacy。
推荐使用终端运行touch命令,创建该文件:
touch /Users/fangjunyu.com/Documents/Apple开发/iOS应用-存钱猪猪/存钱猪猪/piglet/PrivacyInfo.xcprivacy
创建完成,在访达中找到该文件,右击“打开方式”-“文本编辑”,文件内容(最小化,不收集任何数据):
<?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>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
</dict>
</plist>
这个文件意思是:不进行跨 app 跟踪 (NSPrivacyTracking = false),没有收集数据类型,没有访问敏感 API。
将该文件拖进Xcode项目中,选择“Reference files in place”选项。

这样打包Xcode项目时,就会将PrivacyInfo.xcprivacy文件打包进去,从而绕过苹果的隐私清单文件审核。

隐私清单文件要求
1、SDK的隐私清单文件
苹果规则:每一个Framework(SDK)目录下都要有自己的PrivacyInfo.xcprivacy 文件。
因为审核的时候,苹果是逐个检查二进制包里 Frameworks/xxx.framework/ 下有没有清单。
只是 App 自己的代码,没有第三方 Framework,可以在 App 工程里放一个清单文件,统一声明。
如果引入了 AFNetworking.framework、MBProgressHUD.framework、SDWebImage.framework 这样的独立 framework,苹果会要求每个 framework 目录里都要有清单文件。
例如:
SDWebImage,新版本自带隐私清单,升级即可,不用手动创建。
AFNetworking & MBProgressHUD,已停更,没有清单,必须手动创建。
因此,在多个Framework(SDK)场景下,必须为每个Framework 创建一个隐私清单文件,不能只用一个隐私清单文件统一声明。
2、隐私清单文件字段
创建隐私清单文件,如果没有特殊要求,建议使用方案2。
因为方案1生成的隐私清单,会增加很多键,内容存在“空值”或者“空字符串”。
苹果在审核时不会要求填写大量字段,它只关心:
1、有没有这个文件;
2、文件里的字段是否有效、合理。
如果填了一个 NSPrivacyCollectedDataTypes,但里面 NSPrivacyCollectedDataType 是空字符串,严格来说这是无效值,可能会被苹果质疑。
最安全、最简洁的做法:如果 SDK 根本不收集数据、不访问隐私 API,直接声明空数组,不需要写一个带空值的 dict。
<?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>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
</dict>
</plist>
3、隐私清单文件字段解析
这个文件本质上是一个 plist,字段意思如下:
NSPrivacyTracking:布尔值,表示 SDK 是否用于「跨应用跟踪用户」。比如广告 SDK 要设为 true。一般普通库(SDWebImage、AFNetworking)都设为 false。
<key>NSPrivacyTracking</key>
<false/>
NSPrivacyTrackingDomains:如果 NSPrivacyTracking 是 true,就要列出所有跟踪相关的域名。否则就是空数组。
<key>NSPrivacyTrackingDomains</key>
<array/>
NSPrivacyCollectedDataTypes:列出 SDK 收集了哪些用户数据。比如「位置信息」「联系人」「广告 ID」。如果没有收集,就设为空数组。
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string></string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string></string>
</array>
</dict>
</array>
NSPrivacyAccessedAPITypes:列出 SDK 访问了哪些可能影响隐私的 API(例如文件系统、剪贴板、相册)。如果 SDK 只是做 UI/网络请求,就不用写,设为空数组。
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict/>
</array>
如果存在一些隐私权限或者收集用户隐私数据字段,可以在Xcode中选择字段。

也可以参考隐私清单文件的示例文件,进行字段的填写:
<?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>NSPrivacyTracking</key>
<true />
<key>NSPrivacyTrackingDomains</key>
<array>
<string>example.com</string>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeName</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true />
<key>NSPrivacyCollectedDataTypeTracking</key>
<false />
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
总结
PrivacyInfo.xcprivacy是 2023 WWDC 引入的新东西,从 2024 年 11 月 12 日 开始强制执行。它是「隐私清单」,主要针对第三方 SDK,苹果要统一管理「SDK 收集了哪些数据、访问了哪些 API」。
苹果现在要求第三方SDK必须带有PrivacyInfo.xcprivacy 文件(隐私清单),否则在提交 App 时会报 ITMS-91061。
很多老的 SDK(比如 Firebase 在 Xamarin 绑定里的库、AFNetworking、MBProgressHUD 这种)都没有附带这个文件,因为它们要么已经停更,要么旧版本里没包含,就需要手动创建PrivacyInfo.xcprivacy文件。
新的SDK可能在最新版本中新增PrivacyInfo.xcprivacy文件,需要升级SDK以获取PrivacyInfo.xcprivacy文件。
参考资料
1、How to Make Your Flutter Package Privacy Manifest Compatible:https://www.freecodecamp.org/news/how-to-make-your-flutter-package-privacy-manifest-compatible/
2、What the iOS Privacy Manifest Means for Developers:https://www.freecodecamp.org/news/what-the-ios-privacy-manifest-means-for-developers/
3、Enforcement of Apple Privacy Manifest starting from May 1, 2024:https://bitrise.io/blog/post/enforcement-of-apple-privacy-manifest-starting-from-may-1-2024
4、参考PrivacyInfo.xcprivacy文件:https://drive.google.com/file/d/1LRrX0bwRO2_DXisG-xwJPUVaJbmBRKhj/view?pli=1
5、Privacy manifest files(Apple文档):https://developer.apple.com/documentation/bundleresources/privacy-manifest-files