跳到正文
返回博客
·约 1 分钟读完

ITMS-91061 第三方 SDK 缺少隐私清单:怎么修

ITMS-91061 表示你的应用包含 Apple 名单上的某个涉及隐私的第三方 SDK,而这个 SDK 没有隐私清单。升级 SDK,再到构建出的 App 里确认文件在不在。

遇到 ITMS-91061,就把邮件里点名的 SDK 升级到自带 PrivacyInfo.xcprivacy 的版本,确认这个文件确实在构建出的 App 里,然后上传新构建。不要把 SDK 的隐私信息抄进你自己 App 的隐私清单:Apple 明确说,你的清单只描述你的 App。

报错原文

Apple 的 DTS 工程师在 Apple Developer Forums 的 ITMS-91061 说明帖里引用了这段报错:

ITMS-91061: Missing privacy manifest - Your app includes "<path/to/SDK>", which
includes <SDK>, an SDK that was identified in the documentation as a privacy-impacting
third-party SDK. Starting February 12, 2025, if a new app includes a privacy-impacting
SDK, or an app update adds a new privacy-impacting 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.

邮件里会写出路径和 SDK 名,所以你能准确知道是哪个依赖。Apple 没有公开 ITMS 代码列表,措辞以后可能会变。

为什么会出现

Apple 在 Third-party SDK requirements 页面上列了一批常用 SDK,其中包括 Alamofire、Kingfisher、Lottie、SDWebImage、SnapKit、RealmSwift、多个 Firebase 和 Facebook SDK、Flutter 以及不少 Flutter 插件。对这些 SDK,页面写明:

  • 提交包含名单上 SDK 的新应用,或者提交新加入了名单上 SDK 的更新时,必须带上该 SDK 的隐私清单。
  • 名单上的 SDK 作为二进制依赖使用时,还需要签名。
  • 名单上 SDK 的任何版本,以及重新打包了名单上 SDK 的其他 SDK,都在要求范围内。

Apple 文档 Adding a privacy manifest to your app or third-party SDK 给出的起始日期是 2025 年 2 月 12 日。最常见的原因,是项目里锁定了一个旧版 SDK,那时它的开发者还没加隐私清单。

怎么修

以下步骤按 DTS 那篇帖子整理:

  1. 从邮件里拿到 SDK 名称。
  2. 升级到带有效隐私清单的版本。 如果还没有这样的版本,联系 SDK 提供方。在 Swift Package Manager、CocoaPods 或其他引入方式里提高版本号,看看发布说明里有没有提到隐私清单。
  3. 确认清单放在了预期位置(见下表)。
  4. 你自己的清单只写你的 App。 DTS 帖子原话:"Do not add the privacy practices of the SDK to your app's privacy manifest."(不要把 SDK 的隐私做法加进你 App 的隐私清单。)
  5. 邮件里列了几个 SDK,就逐个处理,然后重新归档、上传新构建。

Apple 期望的文件位置:

产品位置
iOS、iPadOS、tvOS、visionOS 或 watchOS 框架SampleFramework.framework/PrivacyInfo.xcprivacy
macOS 或 Mac Catalyst 框架SampleFramework.framework/Versions/A/Resources/PrivacyInfo.xcprivacy
Swift package放在 target 的资源里,并在 package manifest 里显式声明为资源(Xcode 默认不把它当资源)
静态库(.a)不能带资源;Apple 建议改成静态 framework,再把清单加进去

如果 SDK 是你自己维护的,同一页文档讲了怎么添加;隐私清单生成器可以按你的选择生成一个有效的 PrivacyInfo.xcprivacy。

上传前怎么查

先归档,再列出构建出的 App 里所有隐私清单:

find "MyApp.app" -name PrivacyInfo.xcprivacy

我们在一个用了 Firebase 和 Flutter 的 iOS 归档上跑过,找到 21 个清单,有的在框架根目录(Frameworks/Flutter.framework/PrivacyInfo.xcprivacy),有的在资源 bundle 里(Firebase_FirebaseCore.bundle/PrivacyInfo.xcprivacy)。想看哪些框架没有清单:

cd "MyApp.app"
for f in Frameworks/*.framework; do
  [ -n "$(find "$f" -name PrivacyInfo.xcprivacy)" ] && echo "has manifest: $f" || echo "NO manifest:  $f"
done

把 NO manifest 那几行和 Apple 的名单对一下。不是每个框架都需要清单,和这个报错相关的是名单上的 SDK 以及重新打包了它们的 SDK。有些 SDK 把清单放在单独的资源 bundle 里而不是框架里面,下结论之前先按 SDK 名搜一遍。对找到的每个文件跑 plutil -lint,可以确认它是能正常读取的属性列表;我们测试的 21 个都返回 OK。

你自己的清单是另一项检查。Required Reason API 扫描器会在你的源码里找需要声明理由的 API,相应的报错见 ITMS-91053 和 ITMS-91055 指南。邮件里有好几个代码的话,粘进 ITMS 报错查询。

常见问题

把 SDK 的信息写进我 App 的 PrivacyInfo.xcprivacy,能解决 ITMS-91061 吗?

不能。Apple 的 DTS 帖子说,你 App 的清单只应描述你 App 自己的隐私做法,SDK 必须自带清单。

哪些 SDK 需要隐私清单?

Apple Third-party SDK requirements 页面上列出的 SDK、它们的任何版本,以及重新打包了它们的 SDK。Apple 文档还说,其他 SDK 如果用了需要声明理由的 API、收集数据或连接跟踪域名,也应当带清单。

已上架的应用每次更新都会遇到这个报错吗?

报错里的规则针对的是包含名单 SDK 的新应用,或者新加入名单 SDK 的更新。对一直沿用某个 SDK 的更新会怎样,我们没看到 Apple 的说法,所以旧版 SDK 仍然算风险,还是升级为好。

SDK 提供方一直没出带清单的版本,怎么办?

Apple 的帖子建议联系提供方要更新版本,并且不要改为把 SDK 的隐私做法写进你 App 的清单。我们在 Apple 文档里没找到其他办法,所以如果等不到新版本,剩下的选择就是移除或替换这个依赖。

ITMS-91061 和 ITMS-91053 是一回事吗?

不是。ITMS-91061 是名单上的 SDK 缺少清单;ITMS-91053 是某个需要声明理由的 API 没写理由,来源可以是你的代码,也可以是 SDK 的代码。

参考资料

作者

独立开发者,在 Obelisk Club 做本地优先的 Mac 与 iOS 效率应用。 关于作者 →