真机稳定触发震动仅支持uni.vibrateshort和uni.vibratelong;ios需开启触感反馈且侧边拨片非静音,其short实为约400ms长震;android需manifest声明权限、rom开启振动提醒、关闭省电模式;连续调用须手动节流;双震动反馈ios需用plus.ios原生api。

真机上能稳定触发震动的,只有 uni.vibrateShort 和 uni.vibrateLong 这两个 API;其他写法(比如 navigator.vibrate、plus.device.vibrate 带参数调用、或 uni.vibrate({type:'light'}))在多数真机上会静默失败或报错,不是代码没写对,而是平台根本不认。
iOS 真机 uni.vibrateShort 完全没反应?先看这两个开关
iOS 不是“不支持震动”,而是硬性依赖两个用户侧设置:
- 「设置 → 辅助功能 → 触感反馈」必须开启(无法用代码检测,也不能弹窗请求)
- 设备侧边静音拨片不能处于静音状态(静音时调用直接丢弃,连
fail回调都不会进)
更关键的是:uni.vibrateShort 在 iOS 上实际等效一次约 400ms 的长震,和 uni.vibrateLong 行为接近,根本不是轻量点击感。传 { duration: 10 } 这类参数会被完全忽略。
Android 端震动不生效?三重授权缺一不可
Android 要求同时满足以下三点,少一个就静默失败:
-
manifest.json中的"androidPermissions"必须显式声明"android.permission.VIBRATE"(HBuilderX 里勾选最稳,手写易漏) - 国产 ROM(小米/华为/OPPO/vivo)需手动打开「应用通知权限 → 振动提醒」
- Android 12+ 设备在省电模式下会强制禁用非前台震动,测试前务必关闭省电
注意:plus.device.vibrate(10) 这种写法在 Android 上可用,但 iOS 只接受 true,传数字会静默失败;而 uni.vibrateShort() 是跨端封装,推荐优先使用。
连续点击震动节奏失控?必须自己节流
uni.vibrateShort 和 uni.vibrateLong 都没有完成回调、不返回 Promise、也不支持节拍控制。直接连点会导致:
- iOS 极其敏感:第二次调用可能被系统直接丢弃(连日志都不打)
- Android 可能合并成一次长震,或被限频
- 无法判断上一次是否执行完,容易叠加或延迟
必须手动维护时间戳防抖:
let lastVibrateTime = 0;<br>function safeVibrate() {<br> const now = Date.now();<br> if (now - lastVibrateTime >= 50) {<br> uni.vibrateShort();<br> lastVibrateTime = now;<br> }<br>}
想实现按钮按下+释放双反馈?iOS 必须换原生方案
跨平台 API 层面不支持双震动。iOS 真正可控的触感反馈得绕过 uni.vibrateShort,改用:
plus.ios.importClass('UIImpactFeedbackGenerator')- 配合
impact.prepare()+impact.impactOccurred() - 仅限
#ifdef APP-PLUS下使用,H5 / 小程序环境不可用
Android 端没有等效能力,所谓“强度”只是时长与节奏组合的主观感受;低于 10ms 的震动会被系统截断,且厂商 ROM 可能强制屏蔽后台震动——这些细节,往往比写代码花的时间还多。











