uni.vibrateshort没反应主因是平台限制或调用时机错误:仅微信小程序(基础库≥2.10.4)和支付宝小程序支持,app/h5端静默忽略;必须由用户手势触发,且需权限配置、真机测试及错误降级处理。

uni-app 调用 vibrateShort 为什么没反应?
绝大多数情况是平台限制或调用时机不对。vibrateShort 在 iOS 和 Android 行为差异大,且微信小程序、App、H5 完全不支持——它只在「微信小程序(基础库 2.10.4+)」和「支付宝小程序」中可用,uni-app 编译到 App 或 H5 时会静默忽略,不报错也不震动。
实操建议:
- 先用
uni.getSystemInfoSync().platform判断当前是否为mp-weixin或mp-alipay,否则直接跳过调用 - 不能在页面 onLoad/onReady 等初始化钩子中提前调用,必须由用户真实手势触发(如
button的@click),否则 iOS 微信会拦截 - 微信小程序要求基础库版本 ≥ 2.10.4,可在项目
manifest.json的「微信小程序设置」里勾选「启用新版编译」并确保真机调试时微信已更新
如何安全调用 uni.vibrateShort 并降级处理?
别裸奔调用,必须包裹条件判断和错误捕获。微信小程序中即使满足条件,也可能因系统设置关闭振动而失败,此时应提供视觉反馈兜底。
示例代码(Vue 文件中):
methods: {
handleClick() {
const platform = uni.getSystemInfoSync().platform;
if (platform === 'mp-weixin') {
uni.vibrateShort({
success: () => console.log('震动成功'),
fail: (err) => {
console.warn('震动失败', err);
// 降级:闪一下按钮背景色或加个 class 动画
this.$refs.btn.classList.add('vibrate-fallback');
setTimeout(() => {
this.$refs.btn.classList.remove('vibrate-fallback');
}, 150);
}
});
} else {
// 非微信小程序,直接走视觉反馈
this.triggerFallback();
}
}
}
vibrateShort 和 vibrateLong 的关键区别
二者都仅限小程序平台,但行为和权限要求不同:
-
vibrateShort:持续约 40ms,无需用户授权,适合按钮点击等轻量反馈 -
vibrateLong:持续约 400ms,iOS 微信要求用户已开启「系统设置 > 微信 > 通知 > 触感反馈」,否则静默失败 - 两者都不受
uni.setEnableDebug影响,真机调试时也需连接真机运行才能测试 - 频繁连续调用(如 100ms 内多次)会被系统节流,实际只生效第一次
App 端想实现类似震动效果怎么办?
uni-app 的 App 端(iOS/Android)不支持 vibrateShort,但可通过原生插件或条件编译调用原生 API:
- 使用 DCloud 官方插件
uni-hold-vibration(需在nativePlugins中配置),支持 Android/iOS 原生震动控制 - 或手动写条件编译:
#ifdef APP-PLUS下调用plus.device.vibrate()(Android)或plus.ios.invoke(plus.ios.import("UIDevice").currentDevice(), "playInputClick")(iOS 模拟点击声,非物理震动) - 注意:Android 需在
androidManifest.xml中添加<uses-permission android:name="android.permission.VIBRATE"></uses-permission>权限
真正容易被忽略的是:iOS 物理震动在 App 端几乎不可用(Apple 限制第三方 App 调用马达),所谓“震动反馈”在 iOS App 上基本只能靠声音或动效模拟。











