uni-app 中 navigator.vibrate 报错因该 API 在多数平台不可用,应按平台分别调用:App 用 plus.device.vibrate,小程序用 wx.vibrateShort,H5 降级提示;需注意权限、系统设置及调用时机。

uni-app 调用 navigator.vibrate 报错“not a function”
uni-app 本身不提供原生震动 API,navigator.vibrate 是 Web 标准接口,但仅在部分 Android 浏览器(如 Chrome)中可用,iOS Safari 完全禁用,且在 uni-app 的 WebView(尤其是微信小程序、App 端)里基本不可用。直接调用会报 TypeError: navigator.vibrate is not a function。
真正能稳定触发震动的,只有原生层:App 端走 plus.device.vibrate,小程序端需用各自平台 API(如微信的 wx.vibrateShort),H5 则基本放弃或降级为视觉/声音反馈。
- App(Android/iOS)必须使用
plus.device.vibrate,且需在onReady或onLoad后确保plus环境已就绪(if (typeof plus !== 'undefined')) - 微信小程序需条件编译:
#ifdef MP-WEIXIN下用wx.vibrateShort()或wx.vibrateLong() - H5 端不要尝试
navigator.vibrate,多数情况静默失败;可 fallback 到uni.showToast({ icon: 'success', duration: 80 })模拟短反馈
App 端震动不生效?检查 plus.device.vibrate 的参数和权限
Android 上 plus.device.vibrate 接收毫秒数(如 10),iOS 上只接受布尔值 true 表示触发系统默认短震(无法自定义时长)。传错类型(比如 iOS 传数字)会导致静默失败。
另外,Android 12+ 要求应用声明 VIBRATE 权限,并在 manifest.json → "androidPermissions" 中显式添加:
"androidPermissions": [ "android.permission.VIBRATE" ]
否则真机调试时无任何报错,但就是不震。
- 推荐写法:
plus.device.vibrate(plus.os.name === 'iOS' ? true : 10) - 避免传
0或负数 —— Android 会忽略,iOS 会报错 - 连续多次调用需间隔 ≥ 100ms,否则被系统合并或丢弃
微信小程序震动提示“vibrateShort is not a function”
这个错误通常是因为基础库版本太低(2.10.4 才正式支持 wx.vibrateShort),或当前环境不满足触发条件:必须是用户手势触发(如 button 的 bindtap),不能在 setTimeout 或异步回调里直接调用。
- 按钮必须用
<button open-type="default"></button>,不能用<view></view>—— 小程序要求明确的用户交互上下文 - API 必须在点击回调第一层调用,不要包在 Promise.then 或 async/await 里
- 真机测试时注意:iPhone 需在「设置 → 声音与触感 → 触感」开启,且「振动模式」未关闭
如何统一封装一个跨平台震动函数?
别硬写 if-else 堆砌,用 uni-app 条件编译 + 函数封装更可靠。重点不是“一次写完所有平台”,而是“让每个平台走自己最稳的路径,其他平台安静降级”。
示例封装:
function vibrate() {
// App
#ifdef APP-PLUS
if (typeof plus !== 'undefined' && plus.device) {
const duration = plus.os.name === 'iOS' ? true : 15;
plus.device.vibrate(duration);
}
#endif
// 微信小程序
#ifdef MP-WEIXIN
if (wx.vibrateShort) {
wx.vibrateShort(); // 不要 await,不返回 Promise
}
#endif
// H5:不做任何事,或加个轻微 CSS 动画
#ifdef H5
// 可选:uni.showToast({ icon: 'success', mask: false, duration: 60 })
#endif
}
调用时直接 vibrate() 即可。复杂点在于 iOS App 和微信小程序虽然都震,但机制完全不同(前者依赖 plus,后者依赖 wx),不能共用同一套判断逻辑;最容易被忽略的是 Android 权限声明和 iOS 触感系统设置 —— 这两个地方一漏,真机上就完全没反应,连日志都没有。


















