uni-app App端无法直接设置系统闹钟,Android需通过Intent跳转至系统闹钟界面并预填参数,iOS则完全不可行,仅能引导用户手动设置,且无法读取、修改或取消已有闹钟。

uni-app App端调用系统闹钟必须走原生跳转,不能直接设置
uni-app 本身没有提供跨平台的 setAlarm API,App 端(Android/iOS)调用系统闹钟,本质是启动系统自带的闹钟 App 并预填参数,不是“后台静默设置”。这意味着:用户一定会看到系统闹钟界面,且最终是否保存、是否开启重复、是否振动,完全由用户操作决定。
常见错误是试图用 plus.android.importClass('android.provider.AlarmClock') 后直接调用 setAlarm 方法——这会失败,因为 Android 的 AlarmClock.ACTION_SET_ALARM 是一个 Intent Action,必须通过 startActivity 触发 UI 跳转,不能后台执行。
- Android 端唯一可靠方式是构造
Intent并调用main.startActivity(intent) - iOS 端无公开系统闹钟 Intent,
UIApplication.shared.openURL无法跳转到 Clock App 设置页(iOS 限制),只能引导用户手动进入 - 所谓“设置成功”只是跳转成功,不代表闹钟已生效;用户取消操作或未点击保存,闹钟不会建立
Android 调用 AlarmClock.ACTION_SET_ALARM 的完整参数写法
Android 原生闹钟跳转依赖 android.provider.AlarmClock 提供的标准 Intent,关键参数必须用对应常量名传入,拼错或类型不对会导致跳转失败或参数丢失。
示例中容易踩坑的点:
-
AlarmClock.EXTRA_HOUR和AlarmClock.EXTRA_MINUTES必须是整数(int),传字符串或浮点数会静默忽略 -
AlarmClock.EXTRA_MESSAGE支持中文,但长度过长可能被截断(实测超过 64 字符部分丢失) -
AlarmClock.EXTRA_DAYS是ArrayList<integer></integer>,必须传[this.Calendar.MONDAY, this.Calendar.WEDNESDAY]这类形式,不能传字符串数组或数字数组 -
AlarmClock.EXTRA_VIBRATE接收布尔值,但某些厂商 ROM(如 MIUI)会无视该参数 -
AlarmClock.EXTRA_SKIP_UI设为true可跳过设置页直接保存(仅限部分 Android 版本 & 厂商支持,Android 12+ 已逐步废弃)
正确写法片段(需在 #ifdef APP-PLUS && #ifdef ANDROID 条件编译块内):
const Intent = plus.android.importClass('android.content.Intent')
const AlarmClock = plus.android.importClass('android.provider.AlarmClock')
const Calendar = plus.android.importClass('java.util.Calendar')
const intent = new Intent(AlarmClock.ACTION_SET_ALARM)
intent.putExtra(AlarmClock.EXTRA_HOUR, 8)
intent.putExtra(AlarmClock.EXTRA_MINUTES, 30)
intent.putExtra(AlarmClock.EXTRA_MESSAGE, '起床啦')
// 注意:以下需先获取 Calendar 实例再调用常量
const cal = Calendar.getInstance()
intent.putIntegerArrayListExtra(AlarmClock.EXTRA_DAYS, [cal.MONDAY, cal.FRIDAY])
intent.putExtra(AlarmClock.EXTRA_VIBRATE, true)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
const main = plus.android.runtimeMainActivity()
main.startActivity(intent)
iOS 端没有等效接口,只能引导用户手动设置
iOS 自 iOS 10 起移除了所有第三方应用调用 Clock App 设置闹钟的公开 Scheme 或 API。Apple 明确禁止应用绕过用户交互直接写入系统闹钟数据,这是隐私和安全强制要求。
你无法通过任何方式(包括 UIApplication.shared.openURL、openURL、deep link)跳转到 Clock App 的添加闹钟页。目前唯一可行路径是:
- 调用
uni.showModal提示用户“请前往时钟 App → 闹钟 → + 添加” - 若用户已安装快捷指令(Shortcuts),可尝试生成并分享一个预设闹钟的快捷指令(需用户提前授权并运行),但这不属于“调用系统闹钟”,而是依赖用户侧配置
- 不要尝试伪造 URL Scheme(如
clock://),iOS 15+ 会直接拦截并报错Invalid URL scheme
注意:即使使用原生插件桥接 Objective-C,也无法突破系统级限制。任何声称“iOS 可设闹钟”的方案,要么是旧版 iOS 兼容(已失效),要么是混淆了“本地通知”与“系统闹钟”。
取消闹钟、修改闹钟、查询已有闹钟均不可行
无论是 Android 还是 iOS,uni-app App 端都**无法读取、删除或修改用户已设置的系统闹钟**。原因很直接:系统闹钟数据库受严格沙盒保护,第三方应用无读写权限。
这意味着:
- 你不能实现“一键清除所有闹钟”功能
- 不能判断某个闹钟是否已存在,避免重复设置
- 不能根据 ID 修改某条闹钟的时间或备注
- 所谓“取消闹钟”只能引导用户去系统闹钟界面手动删除
如果业务强依赖闹钟生命周期管理(如定时任务调度),应放弃系统闹钟,改用 plus.push.createLocalNotification + 后台保活(需配置 "requiredBackgroundModes": ["audio"])模拟,但要注意 iOS 后台限制极严,实际唤醒成功率低。
真正能稳定控制的,只有你自己 App 内部的定时逻辑(如 AlarmManager 配合 Service),但它不等于系统闹钟——它不会在锁屏/重启后持续生效,也不出现在系统闹钟列表里。


















