WWDC Quick Look 💓 By SwiftGGTeam
Get started with privacy manifests

Get started with privacy manifests

观看原视频

Highlight

Apple 推出 Privacy Manifests(隐私清单),让第三方 SDK 开发者以标准化方式声明数据收集行为,Xcode 15 可自动生成隐私报告,帮助开发者准确填写 App Store 隐私营养标签,同时 iOS 17 会自动拦截未获用户授权的追踪域名连接。

核心内容

第三方 SDK 的隐私信息困境

你的 App 里有多少第三方 SDK?Analytics、广告、社交分享……每个 SDK 都在收集数据,但你真的清楚它们在收集什么吗?

01:44)开发者反馈说,从第三方 SDK 获取完整的隐私信息非常困难。你需要知道每个 SDK 收集哪些数据类型、是否关联用户、是否用于追踪——这些信息散落在各处,甚至根本找不到。

Apple 的解决方案是 Privacy Manifests。

隐私清单是什么

01:58)Privacy Manifests 是一个名为 PrivacyInfo.xcprivacy 的 plist 文件,第三方 SDK 开发者将其包含在 SDK 中。这个文件声明了:

  • SDK 收集哪些数据类型
  • 每种数据的用途
  • 数据是否关联到用户
  • 数据是否用于追踪

数据类型和用途的定义与 App Store 隐私营养标签完全一致,所以你不需要学习两套体系。

Xcode 15 隐私报告

03:20)当你构建 App 准备提交 App Store 时,Xcode 15 会聚合项目中所有隐私清单,生成一份隐私报告。操作路径:Xcode Organizer → 右键点击 Archive → “Generate Privacy Report”。

这份 PDF 报告的组织方式与隐私营养标签类似,你可以直接参考它来填写 App Store Connect 中的隐私信息。

自动拦截追踪域名

04:23)一个常见场景:第三方 SDK 在用户未授权追踪时,仍然默认连接追踪域名。开发者需要手动调用 SDK 的禁用函数或修改配置,容易遗漏。

Privacy Manifests 中声明的追踪域名会在用户未授权时,被 iOS 17 自动拦截网络连接。你不需要写任何代码,系统帮你消除这些边界情况。

如果某个域名同时用于追踪和非追踪功能,建议将其拆分为不同主机名,例如 tracking.example.comnon-tracking.example.com,只在清单中声明前者。

Required Reason APIs

07:22)有些平台 API 可能被滥用于设备指纹追踪。Apple 将这些 API 归类为 “Required Reason APIs”,开发者必须在隐私清单中声明使用这些 API 的批准理由。

例如 NSFileSystemFreeSize(获取文件系统剩余空间)的批准理由之一是”检查磁盘空间是否充足再写入文件”。完整列表和批准理由在 Apple 开发者文档中维护。

隐私影响型 SDK 和签名要求

10:15)Apple 识别了一些对用户隐私影响特别大的第三方 SDK,称为”隐私影响型 SDK”。从 2023 年秋季开始,App Store 会检查新提交和更新的 App 是否包含这些 SDK 的签名版本和隐私清单。2024 年春季起,这将成为 App Review 的正式要求。

详细内容

创建隐私清单文件

SDK 开发者在 Xcode 中创建 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>
        <string>tracking.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>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                <string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
            </array>
        </dict>
    </array>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

关键点:

  • NSPrivacyTracking:声明 SDK 是否用于追踪用户
  • NSPrivacyTrackingDomains:列出追踪域名,iOS 17 会在未授权时自动拦截
  • NSPrivacyCollectedDataTypes:声明收集的数据类型、是否关联用户、用途
  • NSPrivacyAccessedAPITypes:声明使用的 Required Reason API 及批准理由代码

生成隐私报告

03:40)在 Xcode 15 中生成隐私报告的步骤:

  1. 构建 App 并 Archive
  2. 打开 Xcode Organizer(Window → Organizer)
  3. 选择 Archives 标签
  4. 右键点击目标 Archive
  5. 选择 “Generate Privacy Report”
  6. 保存生成的 PDF 文件

这份报告汇总了 App 及其所有依赖的隐私声明,按数据类型和用途组织,与 App Store 隐私营养标签的填写界面一一对应。

使用 Points of Interest Instrument 检测追踪域名

06:45)Xcode 15 的 Points of Interest Instrument 新增了追踪域名检测功能。在测试过程中,它会标记出可能用于跨 App/网站追踪用户活动的域名连接,帮助你识别需要在隐私清单中声明的追踪域名。

Required Reason API 声明示例

以文件时间戳 API 为例,在 PrivacyInfo.xcprivacy 中声明:

<key>NSPrivacyAccessedAPITypes</key>
<array>
    <dict>
        <key>NSPrivacyAccessedAPIType</key>
        <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
        <key>NSPrivacyAccessedAPITypeReasons</key>
        <array>
            <string>C617.1</string>
        </array>
    </dict>
</array>

关键点:

  • NSPrivacyAccessedAPICategoryFileTimestamp:文件时间戳 API 类别
  • C617.1:批准理由代码,表示”在 App 容器内、App 群组容器内或 App 的共享容器内访问文件时间戳”
  • 完整 API 类别和理由代码列表见 Apple 开发者文档

核心启发

  1. 为现有 App 补全隐私清单

    • 做什么:检查你的 App 使用的所有第三方 SDK,确认它们是否提供了隐私清单
    • 为什么值得做:2024 年春季起,缺少隐私清单的隐私影响型 SDK 将导致 App Review 被拒
    • 怎么开始:在 Xcode Organizer 中生成隐私报告,对照报告检查每个依赖项
  2. 拆分追踪与非追踪域名

    • 做什么:如果你的后端服务域名同时用于追踪和非追踪功能,将其拆分为独立子域名
    • 为什么值得做:iOS 17 会自动拦截未授权的追踪域名连接,拆分后非追踪功能不受影响
    • 怎么开始:在 PrivacyInfo.xcprivacyNSPrivacyTrackingDomains 中只声明追踪子域名
  3. 审计 Required Reason API 使用

    • 做什么:扫描代码中是否使用了文件时间戳、磁盘空间、系统启动时间等敏感 API
    • 为什么值得做:这些 API 必须在隐私清单中声明批准理由,否则将收到 Apple 的警告邮件
    • 怎么开始:对照 Apple 文档 中的 API 列表逐项检查
  4. 为自研 SDK 添加隐私清单

    • 做什么:如果你维护内部或开源 SDK,为其创建 PrivacyInfo.xcprivacy 文件
    • 为什么值得做:帮助使用你 SDK 的开发者准确填写隐私信息,提升 SDK 的可信度
    • 怎么开始:在 Xcode 中新建 Property List 文件,命名为 PrivacyInfo.xcprivacy,按文档填写数据收集声明
  5. 启用 SDK 数字签名

    • 做什么:为第三方 SDK 启用签名验证,确保 SDK 来自可信来源
    • 为什么值得做:隐私影响型 SDK 必须同时包含签名和隐私清单,签名防止 SDK 被篡改
    • 怎么开始:在 Xcode 15 中,SDK 开发者使用 codesign 为 framework 签名,App 开发者 Xcode 会自动验证

关联 Session

评论

GitHub Issues · utterances