跳到正文
AppFoyer
免费开始

指南 商店表单与 SDK

如何填写 Google Play 的 Data safety 表单和 Apple 的 App Privacy 详情

每份问卷问什么,你的 SDK 如何改变答案,人们最常答错的三个问题,以及每个供应商在哪里公布你需要的答案。

列出构建中的每个 SDK,打开每个供应商自己的披露页面或隐私清单,再加上你自己收集的数据,例如账号。然后根据这一份清单回答两份问卷。Play 问的是收集了什么、共享了什么以及原因。Apple 问的也是这些,另外还问每种数据类型是否与用户关联、是否用于跟踪。

几分钟就能搞定

AppFoyer 托管本指南所讲的页面——隐私政策、服务条款、支持、账号删除和 app-ads.txt——放在它们自己的子域名上,你无需自己的域名或服务器。一个应用免费,而且商店要求的任何内容都绝不放在付费墙后面。

核查于 2026年9月25日。 商店政策会变,有时不会事先通知。下文所有内容都链接到官方文档,以那个页面为准,而不是本页。如果两者不一致,以商店为准。 本指南译自英文;引用的商店文档保留英文原文。

把你的 App 发送出设备的所有数据(包括 SDK 发送的)列成一份清单,并根据它回答两份问卷。 Google Play 的 Data safety 表单和 Apple 的 App Privacy 详情用不同的措辞询问同样的事实。如果你的答案来自两份各自独立的记忆,它们就会逐渐偏离。

Google Play 上的每个 App 都必须填写 Data safety 表单,包括什么都不收集的 App。只有仅在内部测试轨道上线的 App 可以豁免(Google Play 的 Data safety 帮助)。Apple 要求 App Store 上的每个 App 都提供 App Privacy 详情(Apple 的 App Privacy 详情)。

表单在哪里

  • Google Play: Play Console → 你的 App → App content → Data safety。
  • App Store: App Store Connect → 你的 App → App Privacy。

第 1 步:建立清单

  1. 每一个第三方 SDK。 阅读你的依赖文件:build.gradle / libs.versions.toml、Podfile / Package.swift、pubspec.yaml、package.json。两个商店都把 SDK 收集的数据算作你收集的。Apple 要求你对 App 中的所有代码负责,包括不是你写的代码。
  2. 每个 SDK 发送什么。 以供应商自己的页面为准。有些供应商直接用 Play 的术语公布答案,包括 RevenueCat、Unity Ads 和 OneSignal。Google 为 AdMob 和每个 Firebase 产品发布了对照表。在 iOS 上,大多数现行 SDK 都附带隐私清单(PrivacyInfo.xcprivacy)。在 Xcode 中打开 Organizer,右键点击一个归档并选择 Generate Privacy Report,即可在一页上看到构建中的所有清单(Apple 的隐私清单文档)。
  3. 你自己收集的数据。 账号(电子邮件、用户 ID)、你的后端存储的任何内容、你自己的代码读取的位置、你的服务器保存的购买记录。

有些供应商什么都不公布。AppLovin 没有为任何一个商店提供数据类型清单,还有几个分析 SDK 没有 Play 的对应说明。对于这些,请阅读 SDK 自己关于它传输什么数据的文档,并把缺口记录下来。不要猜。

第 2 步:Google Play 的问题

对于每种数据类型,Play 会问:

  • 收集、共享,还是两者都有? “收集”指发送出设备。“共享”指发送给第三方。代表你处理数据的服务提供商不算共享,完全匿名化的数据也不算。这就是为什么 Firebase Analytics 通常是”收集,未共享”,而广告 SDK 通常是”收集并共享”。
  • 是否临时处理? 只有当数据仅在内存中保留到足以完成那一次请求的时间时才算,例如为获取天气而发送、且不被存储的位置。
  • 必需还是可选? 可选指用户可以选择是否收集。
  • 为什么? Play 的用途包括:App functionality、Analytics、Developer communications、Advertising or marketing、Fraud prevention, security, and compliance、Personalization、Account management。收集和共享各自有自己的用途。

接着是两个安全问题。所有用户数据在传输中是否都经过加密? 只有你能核实这一点。只要有一个普通的 http:// 端点,答案就是”否”。用户能否申请删除? 如果你提供了申请删除的途径,或者会在 90 天内自动删除数据,就可以回答”是”。

如果你的 App 允许用户创建账号,同一表单中的 Data deletion 问题还会要求提供一个网页链接,供用户申请删除账号(Google Play 的账号删除要求)。请参阅账号删除 URL 指南。

在 Google Play 自己的结算界面中输入的付款信息,只要你的 App 从不访问,就无需声明。但你的 App 或某个 SDK 收到的购买记录仍需由你声明。

第 3 步:Apple 的问题

对于每种数据类型,Apple 会问用途以及两个是/否问题:

  • 是否与用户关联? 除非数据在收集之前就已去标识化,否则都算作关联。一个账号、一个用户 ID 或一个设备 ID 就足以构成关联。
  • 是否用于跟踪? 跟踪指将你的 App 中关于某个用户或设备的数据与其他公司的数据结合,用于定向广告或广告效果衡量,或者将其共享给数据经纪商。即使你从未使用某个 SDK 的这项功能,它也可能在这样做。如果有任何数据用于跟踪,App 必须先通过 App Tracking Transparency 请求许可(Apple 的用户隐私和数据使用)。

Apple 的用途包括:Third-Party Advertising、Developer’s Advertising or Marketing、Analytics、Product Personalization、App Functionality、Other Purposes。

只有当四个条件全部满足时,Apple 才允许你不申报某种数据类型。它不得用于跟踪或广告。它必须只是偶尔收集、不属于 App 的主要功能、且由用户自愿选择。并且用户每次都必须在知情的情况下提供它。大多数 SDK 数据在第一个条件上就不符合。

人们最常答错的三个答案

  1. “我们什么都不收集。” 崩溃上报和分析工具会发送设备标识符和诊断数据,即使你自己的代码什么都不发送。
  2. 广告 SDK 选”未共享”。 广告网络会接收标识符和交互数据,用于它们自己的广告目的。这就是共享。
  3. 表单与隐私政策不一致。 商店会把两者放在一起看,所以仅仅不一致本身就足以构成问题。请根据同一份清单编写两者。请参阅两者不一致时。

保持最新

答案的时效取决于你的 SDK 清单。添加 SDK 时,请在同一次改动中更新两份表单和你的隐私政策。供应商也会随着新的 SDK 版本修订他们的披露内容。

让 AI 助手找出 SDK

最慢的是第 1 步,而在你 App 的代码仓库中打开的编码代理可以替你完成:Claude Code、Cursor、Codex 之类。下面的提示词要求它只读取你的构建文件,列出每个 SDK 和数据事实,并注明其来源文件。它不会问每个 SDK 收集什么。模型对某个供应商披露内容的记忆只是猜测,这部分应当来自供应商本身。

它会以 AppFoyer 控制面板可读取的小型 JSON 格式回复。即使不用 AppFoyer,它在第 2 步中给你看的清单仍然是你填写两份表单的依据。

You are helping me fill in Google Play's Data safety form and Apple's App Privacy details for my mobile app. AppFoyer turns your answer into draft answers for both forms, using each SDK vendor's own published disclosure. Your job is only to find what is in the build — not to say what any SDK collects.

## About the app

- App name: [app name]
- Platforms: [Android, iOS or both]

## Step 1 — read the build files

Read only the app's build, manifest and store-metadata files — for example `build.gradle(.kts)`, `gradle/libs.versions.toml`, `AndroidManifest.xml`, `Podfile.lock`, `Package.swift`, `Package.resolved`, `Info.plist`, `*.entitlements`, `PrivacyInfo.xcprivacy`, `pubspec.yaml`, `package.json`, `app.json`. Do not open `.env` files, keystores, credentials or any other secrets, and do not change any file. If you cannot read the code, ask me which SDKs the app uses instead.

Find:

1. Every third-party SDK in the build. Match it to one of these ids where it fits:

- `admob` — Google Mobile Ads (AdMob)
- `applovin-max` — AppLovin MAX
- `unity-ads` — Unity Ads
- `firebase-analytics` — Google Analytics for Firebase
- `mixpanel` — Mixpanel
- `amplitude` — Amplitude
- `meta-app-events` — Meta SDK — App Events
- `firebase-crashlytics` — Firebase Crashlytics
- `sentry` — Sentry
- `firebase-auth` — Firebase Authentication
- `google-sign-in` — Google Sign-In
- `meta-login` — Meta SDK — Facebook Login
- `revenuecat` — RevenueCat
- `firebase-messaging` — Firebase Cloud Messaging
- `onesignal` — OneSignal

   An SDK that fits none of them goes under `otherSdks` with its package name. Never force a match.

2. Which of these facts are true, from the dependencies, permissions and usage-description keys:

- `account` — users sign in or create accounts
- `analytics` — usage analytics
- `ads` — advertising
- `crash` — crash reporting or diagnostics
- `location` — the app reads the device location
- `purchases` — in-app purchases or subscriptions

   If none is true, the facts are `["none"]`.

Keep the file, and the line where you can, for every SDK and every fact. A README sentence is not evidence.

## Step 2 — confirm with me

Show me the list, grouped as SDKs, other SDKs and facts, each with its file. Ask me to confirm or correct it, and to add anything the build files cannot show — for example an SDK loaded at runtime. Wait for my answer.

## Step 3 — reply in AppFoyer's format

Reply with one ```json code block and nothing after it, exactly in this shape:

```json
{
  "format": "appfoyer-store-forms/1",
  "platform": "android | ios | both",
  "sdks": [{ "id": "admob", "file": "app/build.gradle.kts", "line": 42 }],
  "otherSdks": [{ "name": "com.example:tracker", "file": "app/build.gradle.kts", "line": 57 }],
  "facts": [{ "fact": "ads", "file": "app/src/main/AndroidManifest.xml", "line": 12 }]
}
```

- `id` is one of the ids above, spelled exactly. `fact` is one of the facts above, or `none`.
- `line` is a number, or leave it out when you do not know it.
- Empty lists are `[]`. No comments inside the JSON.
- Do not describe what an SDK collects, and do not add fields.

使用 AppFoyer

控制面板中的每个 App 都有一个 Store forms 标签页。勾选你的构建中包含的 SDK,它就会根据这些 SDK 和你的 App 设置起草 Data safety 和 App Privacy 的答案。每个答案都注明来源:供应商自己的答案、它的隐私清单,或者我们对其数据清单的解读。这个标签页会标出你的隐私政策中未提及的 SDK,并提供可直接粘贴的账号删除链接。Claude Code 插件会根据你的构建文件填写 SDK 清单。使用其他助手时,从标签页复制提示词,运行它,再把回复粘贴回来:在保存任何内容之前,标签页会先显示由此得出的答案。你仍需在各个控制台中输入答案并在那里核对。它们是草稿,不是法律建议。这个标签页在所有方案中都免费。