Create your Privacy Nutrition Label
Privacy & Security 进阶 20m

创建你的隐私营养标签

Create your Privacy Nutrition Label

2022年6月6日

在 Apple 官方观看视频

一句话判断

这个 Session 不是在讲什么新技术,而是在教你如何把 App Store 的隐私标签填对——这件事大多数开发者都做错了。

这场 Session 讲了什么

Apple 在 2020 年推出了隐私营养标签(Privacy Nutrition Label),要求所有 App Store 上的应用都要声明自己的数据收集行为。这场 Session 由隐私工程团队的 Ben 主讲,重点讲的是:怎么准确、完整地创建这个标签。

很多开发者填标签的方式是”凭感觉”,但实际上你需要一套系统化的方法。Ben 建议先做数据清单(inventory):列出 App 的所有功能,然后逐一分析每个功能用到了什么数据、数据怎么用、存在哪里。这个过程中要跟多方沟通——营销团队、法务团队、甚至要用 App Privacy Report 或网络代理工具做流量审计。

一个容易忽视的点是:第三方 SDK 的数据收集也要算在你的标签里。你用了某个广告 SDK、分析工具,它们收集的数据就是你的 App 收集的,你得负责声明。

值得深挖的点

“数据收集”的定义比你想象的更广。 Apple 的定义是:只要数据从设备发出并且在服务端留存的时间超过了实时请求的需要,就算”收集”。所以服务器日志、用户画像、分析数据都算。这意味着即便你只是”顺手记了一下”,也得声明。我觉得这个定义很有 Apple 的风格——站在用户角度去思考,而不是站在开发者便利性的角度。

IP 地址的处理方式是个有趣的灰色地带。 Session 明确说了,IP 地址的声明取决于你用它来干什么。用来做地理位置分析?声明为 Location。用来做标识?声明为标识符。这意味着同一个数据点,不同用途下可能需要不同的声明方式,开发者需要根据实际使用场景逐一判断。

代码片段

虽然没有代码示例,但核心流程可以用伪代码表示:

// 隐私标签的填写流程(伪代码)
func createPrivacyLabel() {
    // 1. 盘点所有功能
    let features = app.listAllFeatures()
    
    // 2. 对每个功能分析数据使用
    for feature in features {
        let dataTypes = feature.collectedDataTypes
        let useCases = dataTypes.map { $0.purpose }  // analytics, personalization 等
        let isLinkedToIdentity = dataTypes.map { $0.linkedToUser }
        let isUsedForTracking = dataTypes.map { $0.usedForTracking }
    }
    
    // 3. 别忘了第三方 SDK
    let sdkData = thirdPartySDKs.flatMap { $0.dataCollection }
}

在 App Store Connect 中填写标签的实际路径:App Privacy section -> 声明是否收集数据 -> 选择数据类型 -> 声明用途 -> 是否关联身份 -> 是否用于追踪。

最佳实践

  • 做一个结构化的数据清单文档,不要凭记忆填写标签。
  • 使用 App Privacy Report 检查你的 App 实际的网络请求,看看数据到底发往哪里。
  • 第三方 SDK 的隐私声明文档要逐个查阅,很多 SDK 提供了专门的营养标签指南。
  • 如果你的 App 有追踪行为,除了在标签里声明,还要接入 App Tracking Transparency 框架请求用户授权。
  • 标签可以随时更新,不需要发新版本——但务必保持标签与实际行为一致。

还有什么值得关注

  • 反馈表单和”报告问题”这类功能,如果满足”低频、可选、独立于主要功能”等条件,可以不声明——这是一个合理的豁免。
  • Product Interaction(产品交互)和 Browsing History(浏览历史)是两个不同的类别,前者指 App 内的交互行为,后者特指 App 内浏览器访问的外部网页。
  • 标签一旦发布会立即生效,不依赖于 App 更新——所以填错了一刷就能被用户看到。
WWDC 2022