App端消息震动必须用uni.vibrateShort或uni.vibrateLong;iOS依赖触感开关和静音状态,Android需声明权限、适配厂商设置及系统省电策略;消息到达用short,重要提醒用long;后台/息屏震动需原生API。

App端消息震动必须用 uni.vibrateShort 或 uni.vibrateLong,其他写法在真机上基本无效。 你写的 uni.vibrate({type:'light'}) 在 App 端不会报错,也不会震动——它直接被忽略。iOS 和 Android 对震动的底层实现完全不同,uni-app 的跨平台封装只对这两个函数做了真实适配。
为什么 uni.vibrateShort 在 iOS 上没反应?
iOS 不是“不支持震动”,而是依赖系统级触感开关和静音状态。即使代码完全正确,只要用户关了「设置 → 辅助功能 → 触感反馈」,或者手机处于静音模式(侧边开关拨下),uni.vibrateShort 就彻底静默,连 fail 回调都不会触发。
- 必须提醒用户手动开启「触感反馈」,不能只靠权限弹窗
- 不要在
fail里埋错误日志就完事——iOS 下它根本不会进fail - 测试时务必用真机,模拟器永远不震
Android 端震动失败的三大隐形原因
Android 表面看更“直给”,但实际更难搞准。常见失效不是代码问题,而是权限链断裂:
-
manifest.json中未声明"android.permission.VIBRATE":打包后静默失败,无提示 - 国产 ROM(小米、华为、OPPO)默认关闭应用振动权限:路径通常是「设置 → 应用管理 → [你的App] → 通知管理 → 振动提醒」
- Android 12+ 省电策略会丢弃或延迟
uni.vibrateShort:尤其在后台或息屏时,别把它当关键反馈依赖
消息类震动该选 short 还是 long?
别凭感觉选。消息震动有明确语义分层:
- 新消息到达、列表滑动到未读项 → 用
uni.vibrateShort(约 40ms,轻量确认) - 重要提醒(如紧急通知、支付成功)→ 用
uni.vibrateLong(约 400ms,强制注意力) - 绝对不要连续快速调用:两次
uni.vibrateShort间隔必须 ≥50ms,否则 Android 会吞掉后一次,iOS 则可能完全无响应
节流逻辑必须自己加,比如用 lastVibrateTime 变量判断时间差,不能指望 uni-app 自动处理。
想支持后台/息屏震动?绕过 uni.vibrate 是唯一出路
uni.vibrateShort 和 uni.vibrateLong 均不支持后台或息屏震动。如果业务强依赖(比如闹钟、安防告警),必须切换到原生 API:
- iOS:用
plus.device.vibrate()(需 HBuilderX 3.9+,且仅限 App 端) - Android:用
plus.android.importClass('android.os.Vibrator')配合VIBRATOR_SERVICE,注意 Android 8.0+ 要指定AudioAttributes - 两者都需要在
manifest.json中额外配置后台权限,且部分厂商仍会拦截
这类方案无法跨平台,每次调用前必须用 #ifdef APP-PLUS 包裹,且要接受更高的兼容性维护成本——多数消息类场景其实不需要走到这一步。


















