从 Web 应用发送本地推送
在应用打开时,用 sendlocalpushmsg://push.send?s=… 安排一条在若干秒后显示的通知,并用 sendlocalpushmsg://push.send.cancel 取消所有待发送的通知。它不需要推送服务商,适合简单的召回和提醒。
Google Play 审核被拒
Google 把 USE_EXACT_ALARM 留给闹钟、计时器和日历应用。发送提醒的习惯追踪、商店或预订应用都不在这个名单上;而在 Android 14 上,对于大多数新安装的应用,即使是由用户授予的 SCHEDULE_EXACT_ALARM 也默认处于拒绝状态。大多数提醒并不需要精确到秒。移除您无法说明理由的精确闹钟权限,保留您的提醒功能,并在合适的时机请求通知权限。
每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。
Android 提供两种方式来安排在精确时刻触发的闹钟,即使手机处于空闲状态也不例外。USE_EXACT_ALARM 在安装时授予,用户无法撤销。因此 Google Play 把它限制在核心的面向用户功能依赖精确计时的应用上:闹钟、计时器,以及显示日程通知的日历应用。不属于这些类别的应用,如果清单中带有它,就会被拒。
SCHEDULE_EXACT_ALARM 是其他应用的替代方案:由用户以特殊应用权限(闹钟和提醒)的形式授予,并且可以撤回。从 Android 14 开始,对于大多数新安装的应用,它默认处于拒绝状态;在没有该权限时安排精确闹钟的代码会因安全异常而失败,所以依赖它的应用必须先检查,再准备回退方案。Android 官方的建议是,大多数应用根本不需要精确闹钟:周期性工作应交给 WorkManager,大致时间的提醒可以使用非精确闹钟或时间窗口闹钟,而由服务器事件触发的内容最好以推送形式发送。详情请见Android 精确闹钟页面。
“政策状态”中的记录会提到精确闹钟权限,并说明应用的核心功能不符合 USE_EXACT_ALARM 的条件。它会要求您从提交的 bundle 中移除该权限;如果精确计时确实是面向用户的需求,则改用由用户授予的 SCHEDULE_EXACT_ALARM。对于已上线的应用,同样的问题可能以附有截止日期的警告形式出现。大多数 Web 封装应用并不是有意添加这项权限的,而是某个通知或调度库带进来的。
| 使用场景 | 用户期望的精度 | 最佳工具 |
|---|---|---|
| 闹钟、倒计时器 | 精确到秒 | 精确闹钟;USE_EXACT_ALARM 正是为此而设,这通常是原生应用而非 Web 应用 |
| 带日程通知的日历应用 | 精确到分钟 | 当日历是应用的核心时,可能符合精确闹钟的条件 |
| 习惯、连续打卡或学习提醒 | 大致在选定的时间 | 用 sendlocalpushmsg:// 发送本地推送,或由服务器发送定时推送 |
| 购物车放弃提醒、限时优惠、召回提醒 | 几分钟或几小时之内 | 本地推送,或通过 OneSignal、Firebase 或 Pushwoosh 发送定时消息 |
| 预约或预订提醒 | 前后差几分钟没关系 | 由您的后端在合适时间发送服务器推送 |
| 订单、聊天或状态更新 | 事件发生时 | 服务器推送;完全不需要在设备上调度 |

我的iOS WebView应用终于通过审核了。谢谢!!
在应用打开时,用 sendlocalpushmsg://push.send?s=… 安排一条在若干秒后显示的通知,并用 sendlocalpushmsg://push.send.cancel 取消所有待发送的通知。它不需要推送服务商,适合简单的召回和提醒。
OneSignal(PUSH_ENABLED)、Firebase(FIREBASE_PUSH_ENABLED)或 Pushwoosh(PUSHWOOSH_ENABLED)会在您的服务器发送时即时投递消息,应用中不需要任何闹钟权限。可以在推送服务商对比中比较它们。
Android 13 及更高版本需要 POST_NOTIFICATIONS 运行时权限。WebViewGold 默认在首次启动时请求(requirePush 为 true)。把它设为 false,并在用户开启提醒时调用 registerpush://;这至少需要启用一项推送服务。
checkNativePushPermissions:// 会把 nativePushEnabled 注入页面。只有当系统通知设置和运行时权限都已授予时,它才为 true。
如果用户已永久拒绝,请提供一个按钮,用 settingsapp:// 打开系统的“应用信息”页面,用户可以在那里重新开启通知。
通常只需修改一次清单、对 Web 应用做一点小改动,再重新构建一次。
查看 App Bundle 浏览器中的权限列表,再查看 Android Studio 中的 Merged Manifest 标签页,它会写明是哪个库或清单添加了 USE_EXACT_ALARM 或 SCHEDULE_EXACT_ALARM。
从清单中删除它,或用下面的规则去掉它。对于 Web 封装应用,这几乎总是正确答案。
如果它来自您不使用的库,也一并移除。如果 Merged Manifest 显示它来自 WebViewGold 项目本身,请在移除之前询问 WebViewGold 支持团队,您所用模板版本的本地通知是否依赖它,因为没有该权限时,精确闹钟调用会失败。
凡是必须在特定时刻送达、并依赖您数据的内容(预订提醒、订单更新),由后端发送推送会更可靠。本地推送留给简单的提醒。Android 推送文档介绍了全部三家服务商。
把 requirePush 设为 false,并在用户开启提醒的页面触发 registerpush://,如下面的代码所示。拒绝授权的审核人员也必须仍能使用应用。
从内部测试轨道全新安装:开启提醒,安排一条几分钟后的本地推送,锁屏并等待。在“设置 → 应用 → 特殊应用权限 → 闹钟和提醒”中,确认应用不再请求精确闹钟。然后以更高的版本代码上传,并替换所有轨道上的 bundle。
去掉依赖项添加的内容。只有在确认构建中没有任何东西需要精确闹钟之后,才保留第二条规则。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 不是闹钟、计时器或日历应用:不需要 USE_EXACT_ALARM -->
<uses-permission android:name="android.permission.USE_EXACT_ALARM" tools:node="remove" />
<!-- 仅在确认没有任何功能依赖精确闹钟之后 -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" tools:node="remove" />
</manifest>提醒页面的 Web 应用代码。showModal 和 showSettingsHint 代表您自己的界面;URL Scheme 都是 WebViewGold 文档中的标准写法。
// 1. 用户开启提醒:先说明,再向 Android 请求
function enableReminders() {
showModal({
title: "要开启每日提醒吗?",
body: "我们每天会在您选择的时间发送一条提醒。您可以随时在这里关闭。",
primary: { label: "开启", onClick: () => { window.location.href = "registerpush://"; } },
secondary: { label: "以后再说", onClick: () => {} }
});
}
// 2. 之后:检查是否允许通知
function checkReminderStatus() {
window.location.href = "checkNativePushPermissions://";
setTimeout(() => {
if (typeof nativePushEnabled !== "undefined" && nativePushEnabled) {
scheduleNudge();
} else {
showSettingsHint(); // 例如一个 href="settingsapp://" 的按钮
}
}, 500);
}
// 3. 一条简单的本地提醒,两小时后显示
function scheduleNudge() {
var title = "您的连续打卡正在等您";
var message = "今天花两分钟,就能保持连续打卡。";
var seconds = 2 * 60 * 60;
var url = "https://app.example.com/today";
window.location.href = "sendlocalpushmsg://push.send?s=" + seconds + "=msg!" + message + "&!#" + title + "&!#" + url;
}requirePush 为 false,权限提示在用户开启提醒之后才出现。settingsapp:// 供用户日后修改。能。没有精确闹钟时,Android 可能会在手机空闲时把提醒与其他工作合并处理,比预定时间稍晚一点送达。对于连续打卡、召回提醒和大多数预订提醒来说,这无关紧要;当时机取决于您的数据时,请使用服务器推送。
不是。它是 Android 13 及更高版本上的普通运行时权限。它仍然必须在运行时请求,而且当用户或审核人员拒绝时,应用必须仍能正常运行。
可以,这也是 WebViewGold 的默认设置;但在用户有理由说“好”之后再弹出提示,转化率更高,在审核人员看来也更好。把 requirePush 设为 false,并在提醒页面或新手引导页面上使用 registerpush://。
可能不符合。Google 把它限定于核心功能是闹钟、计时器或带日程通知的日历的应用。带有日程页面的预订服务,更适合由后端推送提醒。
通常是某个通知、调度或 SDK 依赖项在其自己的清单中声明了它,并在构建时合并到了您的清单中。Merged Manifest 标签页会写明来源,tools:node="remove" 可以去掉它。
结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 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 天内提出申请。