uni.vibrateShort仅在微信小程序(基础库≥2.10.4)和支付宝小程序中有效;App端iOS/Android依赖系统开关、权限及用户手势触发,H5完全无效;需平台判断、节流与视觉兜底。

直接给按钮加 uni.vibrateShort() 大概率没反应——不是代码写错了,而是平台限制、系统设置或调用时机根本没满足。
uni.vibrateShort 在哪些平台真正有效
它只在「微信小程序(基础库 ≥ 2.10.4)」和「支付宝小程序」中能触发真实震动;App 端(iOS/Android)和 H5 完全静默忽略,不报错、不警告、也不震动。
- 微信小程序:需真机调试,且基础库版本达标(manifest.json 中勾选「启用新版编译」)
- 支付宝小程序:支持,但部分低版本可能无反馈,建议加
fail回调兜底 - App 端:iOS 实际等效 400ms 长震(非轻量点击感),Android 是约 15ms 物理短震,但都依赖系统开关和权限
- H5:调用即丢弃,
navigator.vibrate在 uni-app WebView 里基本不可用,别试
App 端 iOS 震动没反应的硬性条件
iOS 不是“不支持震动”,而是有两道物理级开关卡着:缺一不可。
- 「设置 → 辅助功能 → 触感反馈」必须开启(注意不是「声音响应震动」)
- 侧边静音拨片不能处于静音状态(哪怕 App 在前台,静音时也彻底禁用)
- 震动必须由用户真实手势触发(如
@click),且必须在 500ms 内执行,不能放在异步回调后 -
uni.vibrateShort({ duration: 10 })这类带参数的写法会被 iOS 忽略,传了白传
Android 端震动失败的三个关键卡点
不是代码问题,是权限链断了。
- manifest.json 的「Android 设置」里必须勾选「震动权限」(HBuilderX 图形界面操作,手写 JSON 易漏)
- 运行时需用户手动授权「通知权限 → 振动提醒」,小米/华为/OPPO 等 ROM 必须单独打开,系统弹窗不会自动触发
- 省电模式或后台运行时,Android 12+ 设备会强制禁用非前台震动,测试务必关闭省电
安全调用 + 跨平台降级的实操写法
别裸奔调用,所有震动必须包裹平台判断、节流和视觉兜底。
- 先用
uni.getSystemInfoSync().platform判断当前环境,只对mp-weixin、mp-alipay、app-plus做处理 - 维护
lastVibrateTime变量,两次调用间隔至少50ms,避免 iOS 丢弃、Android 合并 - iOS App 端想获得真实点击感,必须放弃
uni.vibrateShort,改用plus.ios.importClass('UIImpactFeedbackGenerator')+prepare()+impactOccurred() - 所有其他场景(H5、不支持平台、失败时)统一走视觉反馈,比如加个
vibrate-fallbackclass 动画
最易被忽略的是:iOS 上震动失败时,fail 回调根本不会触发——它连进都不进,所以不能靠 catch 或 fail 去感知,只能靠前置条件检查 + 用户引导。


















