AdMob 的同意(Consent)配置不是隐私政策页脚里的一句法律声明,在 2026 年它是一项变现设置。你的应用能否向欧洲经济区(EEA)、英国和瑞士的用户投放广告、投放什么样的广告,取决于你在 AdMob 后台创建的一条消息,以及一个把用户选择读回广告请求链路的 SDK——也就是 Google User Messaging Platform(UMP)SDK。它驱动的状态决定了每一次广告请求究竟是个性化展示、受限展示,还是根本不发出去。
麻烦的地方在于:同意配置出问题时,表面几乎看不出来。应用照常安装、广告照常渲染、后台照常有展示量,只是单用户收入在那些单价最高的地区悄悄变低了。本文按实际配置顺序给出一份完整清单:账号权限前置条件、消息类型与投放地区、Android 与 iOS 的 UMP SDK 接入、canRequestAds() 这道闸门、隐私选项入口、用调试地区与测试设备做验证、美国各州信号,以及同意模式(Consent Mode)。每一步都对应 Google 官方 AdMob 帮助与移动广告 SDK 文档里写明行为。
一、三层配置,别混为一谈
绝大多数配置错误,源于把其中一层当成了另一层。请把下面三件事分开放:
- 欧洲法规消息(European regulations message):在 AdMob 后台创建的用户可见表单,用于向 EEA、英国和瑞士的用户收集同意,受 Google《欧盟用户同意政策》约束。
- UMP SDK:客户端库,负责请求这条消息、展示它、缓存结果,并告诉你的应用此刻能否请求广告。它是信使,不是政策本身。
- 同意模式与美国各州信号:应用如何把隐私选择(广告存储、个性化、广告用户数据、分析存储)以及美国各州信号传给 Google 的广告系统。这是消息下方的管线,而不是消息本身。
如果德国用户从来没看到表单,问题在消息配置或投放地区,而不在你的广告代码;如果用户看到了表单,但你的应用在 SDK 还没拿到答案时就发了广告请求,问题在你的请求流程。层次不同,修法不同。
二、第 1 步:确认你有权限配置
- 在 AdMob 中配置 EU Consent and GDPR、US State regulations 与 User Messaging Platform,账号需要 Account Management 权限。如果「Privacy & messaging」相关页面是只读的,通常说明当前登录者并非账号所有者。
- 规模化运营时要在上线前确认这件事,而不是在上线当天。把同意配置的权限只留给一个绑着个人手机的账号所有者,等于让整个账号下所有应用的合规配置都挂在一个单点上。
三、第 2 步:创建欧洲法规消息
- 在 AdMob 打开 Privacy & messaging,创建新消息(该应用是第一条消息则按钮为 Create,否则为 Manage)。
- 选择这条消息要在哪些应用中展示。UMP SDK 是依据你项目里配置的 AdMob Application ID 去解析消息的,所以没被选中的应用,等于没有表单可展示。
- 选择语言。当设备语言无法判断时会回落到默认语言,因此每一种加入的语言都要在发布前逐条读一遍。
- 在 Targeting 里选择 Countries subject to GDPR (EEA, UK, and Switzerland) 或 Everywhere。多数应用应选前者:让表单只覆盖政策适用的用户。
- 填写 隐私政策 URL(这是消息的必填部分),复核后发布。保存草稿不等于发布,而未发布的消息永远不会出现。
Google 在 AdMob 后台还提供了针对同意实现的 Error reports,表单行为异常时,这是第一顺位的排查入口。
四、第 3 步:Android 接入
UMP SDK 与广告 SDK 是两个独立库,要求 Android API level 21 及以上。
// app/build.gradle
dependencies {
implementation("com.google.android.ump:user-messaging-platform:4.0.0")
}
<!-- AndroidManifest.xml -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
- 应用 ID 必须是 AdMob 后台里的真实 app ID——SDK 就是用它去查找该展示哪条消息。
- 通过
UserMessagingPlatform.getConsentInformation(context)获取ConsentInformation实例。 - 先同步 Gradle、确认依赖能解析,再去调别的东西:缺库和缺消息的现象一模一样。
五、第 4 步:iOS 接入
# Podfile
pod 'GoogleUserMessagingPlatform'
<!-- Info.plist -->
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>
- CocoaPods 是文档默认方式,SDK 同时提供 Swift Package 与手动下载框架两种形式。
- iOS 侧的单例是
UMPConsentInformation.sharedInstance,展示表单的方法是loadAndPresentIfRequired(from:)。 - 同一账号同时发 iOS 与 Android 时,务必分清两个应用 ID。把 Android 的 app ID 填进 iOS 工程,编译一样通过,然后静默展示错误的消息——或者什么都不展示。
六、第 5 步:每次启动都请求同意信息
这一步的典型问题是「只实现了第一次」。
- 在每次应用启动、任何广告请求之前调用
requestConsentInfoUpdate()(iOS 为requestConsentInfoUpdate(with:completionHandler:))。 - 这一次调用回答两件事:是否需要征得同意(首次运行,或此前决定已过期),以及是否需要隐私选项入口。
- 更新成功后调用
loadAndShowConsentFormIfRequired()/loadAndPresentIfRequired(from:)展示真正需要的表单;如果不需要,回调会立即返回,所以放在每次启动路径上是安全的。 - Google 明确不建议用应用内缓存或此前保存的同意字符串来判断同意状态:这些数据可能已经过期,而过期的「同意」是政策问题,不是性能问题。
七、第 6 步:用 canRequestAds() 卡住广告请求
- 请求广告前检查
consentInformation.canRequestAds(),仅在返回 true 时才请求广告。 canRequestAds()在调用过requestConsentInfoUpdate()之前始终返回 false。冷启动就加载横幅、还没走同意流程的应用,本质上就是在没有答案的情况下发广告请求。- Google 列出三个检查时点:本轮会话中 SDK 收集完同意之后、
requestConsentInfoUpdate()返回后立即检查,以及 SDK 可能保留了上一次会话的同意结果时。 - 如果同意收集过程中出错,请显式决定应用的行为,而不是默认「继续加载广告」。
八、第 7 步:隐私选项入口
- 读取
consentInformation.privacyOptionsRequirementStatus。当其为 REQUIRED 时,应用必须给用户一个明显且随时可达的入口,用于修改隐私选择。 - 把该入口接到
UserMessagingPlatform.showPrivacyOptionsForm(),让表单可以被随时重新打开。 - 当状态不是 REQUIRED 时,隐藏并禁用该入口——一个点了没反应的设置项,只会制造客服工单。
- 撤回必须和同意一样简单。《欧盟用户同意政策》要求提供清晰的撤回指引,把开关藏在三层设置里并不满足这一条。
九、第 8 步:用调试地区与测试设备验证
- 构造
ConsentDebugSettings,用addTestDeviceHashedId("…")注册测试设备。该哈希 ID 会打印在首次requestConsentInfoUpdate()的日志里,复制即可。 - 用
setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA)强制地区,不必出国就能走一遍 EEA 表单;英国与瑞士同样适用。 - 从 UMP SDK 2.2.0 起,模拟器默认即被视为测试设备,无需再登记设备 ID。
- 用
consentInformation.reset()模拟全新安装、重看首次体验。它是测试工具,不要在生产代码中调用。 - 发布前务必移除调试设备 ID 与强制地区设置。强制地区等于对用户真实所在地硬编码一句假话,它只属于开发构建。
十、第 9 步:美国各州——RDP 或 IAB GPP,二选一
- 受限数据处理(RDP):Google Mobile Ads SDK(Legacy)支持 RDP 参数;把
gad_rdp键以值1写入 SharedPreferences,即通知 SDK 在向你提供的服务中限制某些标识符与数据的处理。 - IAB Global Privacy Platform:如果你用同意管理平台或自有消息收集选择,SDK 会遵循写入本地存储、适用于相应美国各州的 GPP 信号。
- 上线前就决定 RDP 如何配合你的合规方案,并在每次广告请求上保持一致:在请求之间反复横跳的信号,比一个明确的选择更糟。
- 想确认实际发出的是什么,可以用网络抓包或代理工具检查广告请求中的
&rdp=参数。
十一、第 10 步:同意模式(Consent Mode)映射
- UMP 可为 Google 同意模式解释 GDPR 选择,涉及四个用途:ad storage、ad personalization、ad user data、analytics storage。
- 前置条件:在 AdMob 后台开启同意模式;UMP SDK 版本 3.2.0 或更高;在 UMP SDK 之前初始化 Firebase。
- 设置默认同意状态,用于欧盟法规不覆盖的用户。
- 明确选择高级模式还是基础模式:Google 默认高级模式,基础模式需要额外步骤。
十二、用户拒绝之后会发生什么
- Google UMP SDK 已通过 IAB 认证,各版本均支持 TCF v2.3,广告伙伴读取的正是它给出的信号。
- 如果没有取得 IAB TCF Purpose 1 的同意,将按 Google《欧盟用户同意政策》按受限模式投放广告。这正是「拒绝」会降低收入、而不是让应用报错的原因。
- TCF 实现错误有独立的上报入口:AdMob 后台的 Error reports。
- 你需要留存用户给出的同意记录,并让撤回入口始终可达——这两点连同「明确列出可能收集或使用用户个人数据的每一方」,都是《欧盟用户同意政策》的明文义务。
十三、故障清单:八种静默失效
- 消息只保存了草稿,从未发布。
- 消息里没有勾选该应用,对应 Application ID 自然没有表单可展示。
- 清单或 Info.plist 里填了错误的 AdMob 应用 ID。
- 投放地区误设为 Everywhere(或反之),与真实受众不符。
- 缺隐私政策 URL,导致消息无法发布。
- 冷启动即在
requestConsentInfoUpdate()之前发广告请求,canRequestAds()根本不可能为 true。 - 应用自行缓存同意结论,不再每次启动询问 SDK。
- 把调试设备 ID、强制地区或
reset()带进了正式包。
上面每一条都能在发布前查清,且都属于构建与配置缺陷,不需要任何政策辩论。
十四、KappS 的协助范围
同意配置与开发者账号、付款资料、税务信息位于同一条链上:任何一环悄悄卡住,都会在不停机的情况下拖住收入。KappS 帮开发者在这条链上准备并提交合规材料,其中就包括 AdMob 这一侧——消息是否已发布、应用 ID 是否登记正确、广告请求是否真的被同意状态卡住,这些差别最终都体现在 EEA 地区的收入上。
我们不做的事,是制造同意。一个从不展示的表单,或一个声称用户从未给出答案的信号,都属于违反政策,会把账号与收款一起置于风险之中,也不是我们提供的服务。上面的配置就是全部诀窍:展示真实的表单、保留真实的答案,并在广告请求处尊重它。
资料来源(Google 官方文档):AdMob Help — European regulations message(support.google.com/admob/answer/10113207);Mobile Ads SDK — Set up UMP SDK(Android / iOS,developers.google.com/admob);US states privacy laws(RDP 与 IAB GPP);Interpret consent mode values;Google《欧盟用户同意政策》。