第一个页面就弹出位置提示
您的首页在加载时调用地理定位 API,于是用户什么都还没看到,Android 就请求位置权限了。没有任何地方解释原因。这是教科书式的违规。
Google Play 审核被拒
Google 希望用户在任何权限提示出现之前,就能在应用内了解您收集哪些数据以及原因。如果位置、通讯录或相机提示在没有这种说明的情况下弹出,或者您的说明只存在于隐私政策中,这次发布就会被拒。解决办法是在您的 Web 应用中加一个简短的对话框,在原生提示出现之前展示。
每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。
Google 的用户数据政策针对用户未必能预料到的数据使用,有一条专门的规则。当您的应用访问、收集、使用或分享个人数据或敏感数据的方式,可能超出用户对眼前这项功能的合理预期时,您必须先展示应用内披露,再征求用户同意。
披露必须位于应用内并属于正常使用流程的一部分,而不是藏在设置菜单、商店说明或隐私政策中。它必须说明涉及哪些数据、这些数据如何使用和分享,而且不能淹没在无关的文字(例如您的条款)之中。同意需要用户主动操作,例如点按一个标注清楚的按钮;点按外部区域、按返回键,或者一条自动消失的消息,都不算数。如果涉及运行时权限,披露必须出现在系统提示之前。Google 的显著披露最佳实践补充了实用细节:先说明原因,列出数据,用语平实,提供拒绝的途径,并且不要模仿 Android 系统对话框。
披露并不能取代您的隐私政策或数据安全表单。三者必须描述同样的事实。
“政策状态”中的记录会点名用户数据政策及其显著披露要求,并且常常写明审核人员注意到的数据类型:位置、通讯录、图片、已安装的应用或某个设备标识符。开发者常见的标题包括 Prominent disclosure not found(未找到显著披露)和 Missing information in prominent disclosure(显著披露中缺少信息)。前者表示审核人员看到了一个权限提示或一条数据流,之前却没有任何说明。后者表示说明存在但缺少内容:通常是缺少“位置”一词、后台访问所需的后台相关措辞,或者数据会如何处理。截图往往显示应用的第一个页面上就弹出了系统权限对话框。
您的首页在加载时调用地理定位 API,于是用户什么都还没看到,Android 就请求位置权限了。没有任何地方解释原因。这是教科书式的违规。
WebViewGold 默认在首次运行时请求通知权限(requirePush)。这本身不是个人数据问题,但在没有任何上下文的情况下堆叠一串提示,恰恰是审核人员会截图的场景。请把每个提示都移到相应的使用场景中。
通讯录 API(先调用 requestcontactpermission://,再调用 readcontacts://)会把通讯录交给您的 Web 应用。为了“查找好友”而上传通讯录,需要一份点明通讯录和上传行为的披露。
用户通过文件输入框主动发起的上传在预期之内。在后台上传图片,或把图片用于可见功能以外的任何用途,则不在预期之内,需要披露。
会话回放、设备指纹、聊天组件和分析标签都在 WebView 中运行,算作您应用的数据收集。如果某个脚本会记录输入内容或建立设备画像,要么进行披露,要么不要在应用中加载它。

只要有一个优化良好的Web应用版本,几分钟内您就能拥有一个出色的移动应用。除此之外,客户服务非常友好且乐于助人!我只能说:推荐WebViewGold :-)
| 数据 | 何时展示披露 | 必须说明的内容 |
|---|---|---|
| 应用打开时的位置 | 在功能页面上,紧挨着地理定位调用之前 | 应用会收集位置、用于哪项功能,以及位置是否会发送到您的服务器或被分享 |
| 后台位置 | 在位置提示之前,在需要它的功能内部 | “位置”一词、诸如“在应用关闭或未使用时”之类的表述、每一项使用它的功能,以及它是否用于广告;参见后台位置指南 |
| 通讯录 | 在 requestcontactpermission:// 之前 | 上传哪些字段(姓名、号码、电子邮件)、原因、保留多久,以及还有谁会收到 |
| 照片、相机、麦克风 | 在首次拍摄或上传之前,只要用途不明显就需要 | 拍摄或上传了什么,以及它会去往哪里 |
| 脚本收集的数据 | 在脚本启动之前,通常是首次启动时 | 收集什么(例如屏幕录制或设备数据)、由谁收集、为什么收集,并提供真正可以拒绝的选项 |
主要是 Web 应用中的工作;只有修改 Config.java 时才需要重新构建原生应用。
全新安装测试构建版本,记下每个系统提示及其出现的页面,并列出您的 Web 应用发送到后端或第三方的内容。把这份清单与您的数据安全回答进行比对。
从页面加载中移除地理定位调用,改为由功能页面上的按钮触发。对于推送,在 Config.java 中把 requirePush 设为 false,之后再用 registerpush:// 请求权限,具体见Android 推送文档。
在 Web 应用中弹出一个模态框,包含简明的标题、数据、原因以及数据的去向,再加两个按钮:“同意”和“以后再说”。使用您自己的设计;不要模仿 Android 权限对话框。
然后再调用地理定位 API、requestcontactpermission:// 或 registerpush://。随后出现的系统提示是第二步,也是官方的那一步。
功能应当以简化形式继续可用,例如用手动输入地址代替定位。如果用户之后想用这项功能,而权限已被永久拒绝,就用 settingsapp:// 打开系统设置页面(打开应用设置 API)。
更新隐私政策和数据安全表单,使其保持一致。如果只改了 Web 应用,现有构建版本已经能体现修复;如果 Play Console 需要新版本,就提高版本代码并上传新的 bundle。在回复中描述到达披露的路径。
适用于任何运行在 WebViewGold 中的 Web 应用的模式。把 showModal 替换为您自己的对话框组件,并根据应用的实际行为调整文案。
// 每一项:要告诉用户的内容,以及用户点按“同意”后运行的原生步骤。
const DISCLOSURES = {
location: {
title: "要显示您附近的门店吗?",
body: "为了列出离您最近的自提点,本应用会在您使用门店查找功能时收集您的精确位置。位置信息只会发送到我们的服务器用于计算距离,绝不会分享给广告商。",
run: () => navigator.geolocation.getCurrentPosition(showNearby, showManualSearch)
},
contacts: {
title: "要从通讯录中查找好友吗?",
body: "本应用会把您通讯录中的姓名和电话号码上传到我们的服务器,以显示哪些好友已经在使用。我们绝不会给您的联系人发消息,未匹配的号码会在 24 小时内删除。",
// 授权后,导航到 readcontacts:// 以填充 contacts 变量。
run: () => { window.location.href = "requestcontactpermission://"; }
},
notifications: {
title: "要接收订单动态吗?",
body: "订单发货和送达时,我们会给您发送通知。您可以随时关闭。",
run: () => { window.location.href = "registerpush://"; }
}
};
function askWithDisclosure(kind) {
const d = DISCLOSURES[kind];
showModal({
title: d.title,
body: d.body,
primary: { label: "同意", onClick: d.run },
secondary: { label: "以后再说", onClick: () => {} } // 不授权时功能照常可用
});
}
// 由功能页面上的用户操作触发,绝不在页面加载时触发。
document.querySelector("#find-stores").addEventListener("click", () => askWithDisclosure("location"));代理会找出每一条数据流,添加对话框,并为隐私政策和数据安全表单写好对应的句子。
我的 Web 应用运行在一个用 WebViewGold 构建的 Android 应用中。Google Play 以缺少显著披露为由拒绝了它。 找出应用中所有以下位置:(a) 调用 navigator.geolocation,(b) 导航到 requestcontactpermission://、readcontacts:// 或 registerpush://,(c) 把通讯录、照片或位置上传到我们的后端或第三方,(d) 加载分析、会话回放或聊天脚本。 对每一项: - 移除所有在页面加载时运行的调用;改为由功能页面上的用户操作触发。 - 在调用之前,用我们设计系统中的模态框显示简短的标题、收集哪些数据、为什么收集、发送到哪里,以及两个按钮:“同意”和“以后再说”。 - 只有在用户点按“同意”后才执行调用。点按“以后再说”时,让功能以简化形式继续可用。 - 不要把模态框做成 Android 系统对话框的样式。 然后写一张表格,列出每种数据类型、披露它的页面以及所用的确切句子,方便我复制到隐私政策和数据安全表单中。
不够。系统对话框请求的是权限,但它不会说明您如何处理这些数据。只要用途可能不明显,Google 就要求您在它之前给出自己的说明;后台位置则一律需要。
可以。由 Web 应用在 WebView 中渲染的对话框就是应用内界面。关键在于它出现在正常使用过程中、紧挨着访问数据之前,而不是只放在设置页或法律页面上。
如果 Android 权限提示紧接着出现,Google 的后台位置指南会把这个提示视为同意步骤。对于没有系统提示保护的数据,您需要自己征得用户的主动同意。在这两种情况下,清晰的“同意”和“以后再说”按钮组合都是最稳妥的设计,也符合 Google 的最佳实践。
在每种数据类型首次请求之前显示,用户拒绝后再次使用该功能时再显示一次。请尊重用户的拒绝;反复弹出提示,用户和审核人员都会反感。
因为政策要求披露出现在应用内、在访问数据之前。隐私政策和商店详情是额外的要求,而不是替代品。
Apple 的处理方式不同,它依靠系统提示中的用途说明字符串和自己的隐私规则。同样的场景内对话框在两个平台上都很好用,App Store 方面的内容见准则 5.1.1 指南。
结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 7×24 小时人工支持。
$109 每个平台,一次性付费
WebViewGold 许可证:一个现成的 Xcode 或 Android Studio 项目。粘贴您的 URL,设置名称和图标,开启所需功能,构建并提交。永久免费更新。
在主页查看方案$349 每个许可证,一次性附加购买
无需 Mac、Xcode 或 Android Studio:在浏览器中完成配置,我们在云端构建两个应用,并将其交付到 App Store Connect 和 Play Console。
Cloud Builder 如何运作 试用免费演示$698 每个平台 $798
把您的 URL 和图标发给我们。我们的团队在 72 小时内完成配置、构建并交付您的应用,白标,附源码项目。两个平台共 $1,158。
Full Service 详情 服务提供方:冬季特惠价格有效期至 2026年12月31日。
App Store & Google Play 审核通过保证 – 否则 14 天内退款
想直接交给我们?Full Service:我们在 72 小时内完成配置、构建并交付,每个平台 $698 起。有疑问?通过 7×24 小时在线聊天联系我们。
退款依据我们 FAQ 中列出的条件:应用因非内容原因被 Apple 和/或 Google 拒审,并在购买后 14 天内提出申请。