uni.vibrateshort在ios上无反应是因为需同时开启“触感反馈”且侧边静音拨片未启用,其实际等效400ms长震;android需manifest声明、动态权限及厂商振动提醒三重授权;连续调用须加时间戳防抖。

App端能稳定触发震动的,只有 uni.vibrateShort 和 uni.vibrateLong 这两个 API,其他写法(比如 navigator.vibrate、plus.device.vibrate 直接调用)在多数真机上会静默失败或报错。
为什么 uni.vibrateShort 在 iOS 真机上完全没反应
iOS 不是“不支持”,而是依赖两个硬性开关:「设置 → 辅助功能 → 触感反馈」必须开启,且侧边静音拨片不能处于静音状态。这两个条件缺一,uni.vibrateShort 就彻底丢弃调用——连 fail 回调都不会触发。更关键的是,它在 iOS 上实际等效于一次约 400ms 的长震(即和 uni.vibrateLong 行为接近),根本不是轻量点击感。
- 不要指望代码里加个
fail就能捕获问题,iOS 下它根本不会进这个分支 - 用户首次使用前,得用弹窗+图文引导手动打开「触感反馈」,不能只靠权限申请
-
uni.vibrateShort({ duration: 10 })这类带参数的写法在 iOS 上会被忽略,传了也白传
Android 端震动不生效的三个常见卡点
Android 要求三重授权:manifest.json 中声明 "android.permission.VIBRATE"、运行时动态请求权限、国产 ROM(小米/华为/OPPO)还需单独打开「应用通知权限 → 振动提醒」。三者缺一,就静默失败。
- manifest.json 的 Android 权限勾选必须在 HBuilderX 里操作,手写 JSON 容易漏掉或格式错误
- 动态权限请求不能只调
uni.getProvider,得用uni.authorize({scope: 'scope.writeContacts'})类似逻辑(实际需适配震动专用 scope,但 uni-app 未暴露,所以得依赖 manifest + 厂商后台开关) - 部分 Android 12+ 设备在省电模式下会强制禁用非前台震动,测试时务必关闭省电模式
连续点击场景下震动节奏失控怎么办
uni.vibrateShort 和 uni.vibrateLong 都没有完成回调、不返回 Promise、也不支持节拍控制。直接连点会触发系统限频或合并震动,iOS 尤其敏感——第二次调用可能被直接丢弃。
- 必须自己维护上次触发时间戳:
lastVibrateTime,每次调用前判断Date.now() - lastVibrateTime >= 50 - 避免用
setTimeout拼“滴滴-滴”节奏,Android 可能合并成一次长震,iOS 直接跳过后续调用 - 想实现按钮按下+释放双反馈?iOS 必须换原生方案:
plus.ios.importClass('UIImpactFeedbackGenerator'),但仅限 App 端,且要配合prepare()+impactOccurred()
H5 和小程序环境千万别误用
uni.vibrateShort 在 H5 中调用即丢弃,不报错也不震动;微信小程序虽支持,但必须用条件编译 #ifdef MP-WEIXIN 包裹,否则在 App 或 H5 下会报错或静默。
- H5 端请彻底放弃震动,改用
uni.showToast({ icon: 'success', duration: 80 })或 CSS 缩放动画模拟点击反馈 - 微信小程序里别混用
uni.vibrateShort和wx.vibrateShort,后者才是官方推荐,前者在某些基础库版本下不可靠 - 支付宝/百度小程序对震动支持不一致,实测发现部分机型仅支持
my.vibrate,uni-app 封装层未覆盖
真正跨平台稳定的震动,从来不是靠一个 API 写到底,而是按平台拆解、逐个填坑。最容易被忽略的是 iOS 的「触感反馈」开关和 Android 厂商 ROM 的二次授权——这两处没搞定,代码再对也没用。











