跳转至正文

iOS 应用的 Privacy Manifest

Capacitor iOS 应用 PrivacyInfo.xcprivacy 2026 合规与排障指南:Required Reason APIs、ITMS-91053 和 ITMS-91061,以及第三方 SDK 清单。

iOS 应用的隐私清单 Capgo 博客插图

Apple 隐私清单是 App Store 上传的强制要求: 每个应用都需要一个 PrivacyInfo.xcprivacy 用于描述应用的数据收集、追踪域名以及任何 Required Reason APIs 你的 code 调用。第三方 SDK 在 Apple 要求的清单上 必须随附自己的清单(若以二进制文件形式分发,还需附带签名)。本指南重点介绍 2026 合规性与故障排除 来实现 Capacitor iOS 应用:声明内容及修复方法 ITMS-91053 以及 ITMS-91061以及提交前如何验证。

隐私清单涵盖的内容

隐私清单是随您的应用或 SDK 一起打包的属性列表。Xcode 会在归档时将所有清单汇总成一份统一的隐私报告。

密钥 用途
NSPrivacyTracking 您的应用或 SDK 是否按 Apple 的定义将数据用于追踪
NSPrivacyTrackingDomains 涉及追踪的域名
NSPrivacyCollectedDataTypes 收集的数据类型及其使用方式
NSPrivacyAccessedAPITypes Required Reason API:您的 自有 code 使用的,并附上已批准的理由代码

Apple 概览: 为您的应用或第三方 SDK 添加隐私清单.

您需要对二进制文件中的所有 code 负责,包括内嵌的 SDK。您的清单应仅描述 您的应用。请勿将其他 SDK 的数据处理实践粘贴到您的文件中。

必需理由 API 类别

自 2024 年 5 月 1 日,当您的 App 使用了所列的 API 但未提供获批理由时,App Store Connect 会拒绝上传 NSPrivacyAccessedAPITypes。Apple 在文档中记录了这些 API 和获批理由 说明必需理由 API 的用途.

截至 Apple 的 TN3183, 类别 值如下:

NSPrivacyAccessedAPIType 值 混合应用中的典型触发场景
NSPrivacyAccessedAPICategoryUserDefaults 设置、插件状态、少量持久化数据
NSPrivacyAccessedAPICategoryFileTimestamp 文件元数据、缓存、更新 bundle
NSPrivacyAccessedAPICategoryDiskSpace 下载前的剩余空间检查
NSPrivacyAccessedAPICategorySystemBootTime 经过时间、计时器或绝对时间戳
NSPrivacyAccessedAPICategoryActiveKeyboards 键盘扩展或输入检测

针对你使用的每个类别,添加一个包含以下内容的字典: NSPrivacyAccessedAPIType 以及 NSPrivacyAccessedAPITypeReasons. 选择 仅 Apple 为该类别列出的原因代码。代码错误会导致审核失败。

代码片段示例(在检查隐私报告后,请根据你的应用调整类别和代码):

<key>NSPrivacyAccessedAPITypes</key>
<array>
  <dict>
    <key>NSPrivacyAccessedAPIType</key>
    <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
    <key>NSPrivacyAccessedAPITypeReasons</key>
    <array>
      <string>CA92.1</string>
    </array>
  </dict>
</array>

Capacitor 本身出现在 Apple 的 第三方 SDK 要求 列表中,因此该 framework 会随附一份 manifest,用于 Capacitor 自身对 API 的使用。你仍需一份应用级 manifest,用于 你的 native 和 JavaScript 层、插件,以及依赖项未覆盖的任何 API。

ITMS-91053: 缺少 API 声明

ITMS-91053 意味着 App Store Connect 在你的构建中检测到了需要声明原因的 API,但合并后的 privacy manifest 中没有匹配条目。

修复方法:

  1. 请查看拒绝邮件或上传日志。其中会指明该 API 类别 (例如 NSPrivacyAccessedAPICategoryDiskSpace).
  2. 在 Xcode 中打开归档隐私报告(在归档文件上产品 > 归档,然后 生成隐私报告 )并查看缺失项是在你的 app target 还是依赖项中。
  3. 如果 API 位于 你的 code 或你自有的插件中,请添加类别和获批理由。 ios/App/PrivacyInfo.xcprivacy.
  4. 如果 API 来自某个 依赖项,将 pod 或 SPM 包升级到包含 manifest 的版本,或者给插件打补丁,只声明你的 fork 实际调用的内容。
  5. 重新归档,并在再次上传前确认该类别已出现在报告中。

不要声明未使用的类别。Apple 的静态分析会关联二进制文件中的符号。

ITMS-91061: 缺少第三方隐私清单

ITMS-91061 意味着 影响隐私的 SDK 在你的 app bundle 中没有清单 PrivacyInfo.xcprivacy。Apple 指出,当你发布新 App 或更新,且该更新 添加了 已列出的 SDK 时,该 SDK 必须包含清单;二进制 SDK 还需要来自 签名 SDK 供应商的有效清单。

修复方法:

  1. 从邮件中复制 framework 路径(例如 Frameworks/FirebaseCore.framework/FirebaseCore).
  2. 识别 CocoaPods、SPM 或 vendored 二进制包。
  3. 升级到捆绑了以下内容的 vendor 版本 PrivacyInfo.xcprivacy 位于 framework 根目录。
  4. 清理、重新构建并验证其中的文件: .xcarchive 在 upload 之前。

切勿 将 SDK 的 collection 或 API 声明移至你的 app manifest。Apple 明确警告 app manifest 必须仅描述 app 本身。如果 SDK 已停止维护,请替换它,或 vendor 一个合规的 build。

列出的 SDK 包括常见的移动端技术栈(Firebase、Flutter、 Capacitor, shared_preferences_ios以及其他)。每次发布前请前往 Apple 官网查看当前列表。

第三方 SDK manifest 和签名

当你更新依赖项时,Xcode 会验证二进制 framework 是否由与之前版本相同的开发者签名。这能在 manifest 变化时保护供应链。

实际工作流:

  • 在 pod install 或解析 SPM 时,搜索 ios/ 来实现 PrivacyInfo.xcprivacy 文件。
  • 归档并使用 生成隐私报告 以查看整体情况。
  • 将报告与你在 App Store 隐私问卷中的回答进行对比。

对于 live update 工具,请声明 updater 实际使用的 required reason API(例如磁盘空间、文件时间戳或 user defaults)。网络访问不属于 required reason API 类别。如果 updater 会收集个人数据,请在 App Store 隐私标签和问卷回答中披露这些数据;仅通过 HTTPS 获取更新本身并不会产生新的披露类别。请保持 Capgo live update 合规性 在记录 OTA 行为时需注意。

添加 PrivacyInfo.xcprivacy 在 Capacitor iOS 项目中

  1. 同步原生项目: bunx cap sync ios.
  2. 打开位于以下路径的 Xcode workspace ios/App.
  3. 文件 > 新建 > 文件,选择 App 隐私 (或添加一个空的 PrivacyInfo.xcprivacy plist)。
  4. 将文件保存至 ios/App (与……位于同一文件夹 AppDelegate 即可)。
  5. 在 target 中 Build Phases > Copy Bundle Resources,确认 PrivacyInfo.xcprivacy 已列出。
  6. 根据你的 App 和插件,填写跟踪、收集的数据类型以及所需的 reason API。
  7. 先执行 Archive、生成隐私报告并修复缺失的类别,然后再上传到 App Store Connect。

如果你在磁盘上以 XML 格式编辑 plist,请重新打开 Xcode,以确保 target membership 保持正确。

每个 App 或 SDK target 都保留自己的 PrivacyInfo.xcprivacy。执行 Archive 时,Xcode 会将这些 manifest 汇总成一份隐私报告。你无需手动把依赖项的 plist 合并到 App 文件中。

对于 自定义 Capacitor plugin 作为独立的 iOS framework 发布,添加 PrivacyInfo.xcprivacy 在该插件的 ios/Plugin/ 文件夹(或同等目录)中,并将其列入插件 target 的 复制 Bundle Resources,而不仅仅是在 app target 中。

当 NSPrivacyTracking 如果情况属实,或者你嵌入了广告或分析 SDK,请确保 manifest 与 App Store 隐私标签保持一致,并在 iOS 要求时显示 App Tracking Transparency prompt。 @capgo/capacitor-app-tracking-transparency 涵盖了 Capacitor 应用的 ATT 流程。

提交前的验证清单

  • App target 包括 PrivacyInfo.xcprivacy 中的 复制 Bundle Resources.
  • 拒绝或报告中每个必需原因类别都有已批准的原因代码。
  • 构建中列出的每个第三方 SDK 都在预期路径下包含自己的 manifest。
  • 隐私报告与你对数据分析、广告和身份验证 SDK 的理解一致。
  • App Store 隐私标签与合并后的报告一致。

常见问题

Capacitor 插件需要自带隐私清单吗?

如果插件以源码形式分发在你的仓库中,其 API 使用情况就是 App 二进制文件的一部分。请在 应用 manifest 中声明插件调用的 API;如果它以独立 framework 形式发布,请在插件 target 内贡献 manifest。二进制 Pod 必须遵守 Apple 的第三方 SDK 规则。

我能否只改 App 的 PrivacyInfo.xcprivacy 就修复 ITMS-91061?

不。SDK 必须随附 manifest。你的文件只应记录你 App 的做法。

Apple 的政策日期在哪里有文档说明?

必需理由 API:自 2024 年 5 月 1 日。所列 SDK 的第三方隐私清单和签名规则详见 第三方 SDK 要求.

继续阅读:iOS App 隐私清单

如果你正在使用 iOS 应用的 Privacy Manifest 来规划安全与合规,请结合 加密 了解 Encryption 的实现细节, 合规性 了解合规部分的实现细节, Capgo 安全扫描器 了解 Capgo Security Scanner 的产品工作流, Capgo 安全 用于 Capgo 安全的产品工作流,以及 Capgo 信任中心 用于 Capgo 信任中心的产品工作流。

为 Capacitor 应用提供 Live Updates

当 Web 层出现线上 Bug 时,通过 Capgo 发布修复,而不用等 App Store 审核好几天。用户会在后台收到更新,原生变更则仍走正常审核流程。

博客最新动态

Capgo 为你提供打造真正专业的移动应用所需的最有价值的洞察。