uni.vibrateShort在iOS上静默失败,因依赖“辅助功能→触感反馈”开启且非静音模式,实际等效长震;Android需运行时权限+厂商通知振动授权,建议节流调用或改用uni.vibrateLong。

uni.vibrateShort 在 App 端真机上没反应?不是 API 写错了,而是它根本依赖系统级开关和平台行为——iOS 和 Android 完全不是一回事。
uni.vibrateShort() 为什么在 iOS 上静默失败
iOS 设备根本不执行 uni.vibrateShort() 的“短震动”逻辑。它底层没有调用 Taptic Engine,而是退化成系统震动服务(AudioServicesPlaySystemSound(1104)),但该服务在 iOS 10+ 后被大幅限制:只有开启「设置 → 辅助功能 → 触感反馈」且设备未处于静音模式时,才可能触发一个微弱、不可控的反馈;否则直接丢弃。更关键的是,uni.vibrateShort() 在 iOS 上实际表现为约 400ms 的长震(即等效于 uni.vibrateLong()),完全违背“短反馈”预期。
- 检查路径:「设置 → 辅助功能 → 触感反馈」必须开启
- 静音开关(侧边拨片)必须处于非静音状态
- 即使满足以上,
uni.vibrateShort()仍不会产生轻量点击感,这是 uni-app 框架层对 iOS 的能力封装缺陷
Android 端调用 uni.vibrateShort() 的权限与厂商坑
Android 要求运行时权限 + 厂商 ROM 显式放行,缺一不可。仅在 manifest.json 中声明 "android.permission.VIBRATE" 不够,很多机型默认屏蔽应用振动。
- 权限声明必须完整:
"permissions": { "android": ["android.permission.VIBRATE"] } - 小米/华为/OPPO/vivo 用户需手动开启:「设置 → 应用管理 → [你的App] → 通知管理 → 振动提醒」
- Android 12+ 省电策略会延迟或丢弃高频震动请求,连续点击务必加节流
- 部分低端机马达不支持 uni.vibrateShort() 可能被截断为无感脉冲
别用 uni.vibrate({ type: 'light' }) —— App 端根本不认识这个参数
这个写法只在 H5 和小程序生效,App 端调用后静默失败,控制台零报错,是典型的跨端陷阱。uni-app 3.99+ 才开始在 App 端解析 type 参数,但目前仍不支持 'light',只认 uni.vibrateShort() 和 uni.vibrateLong() 两个裸函数。
- 错误写法:
uni.vibrate({ type: 'light' })→ App 端无效 - 正确分支写法:
if (uni.getSystemInfoSync().platform === 'ios') { // iOS:建议 fallback 到 plus.iosAPI 或直接跳过 } else { uni.vibrateShort(); } - 不要传毫秒数:
uni.vibrate(15)是旧版写法,App 端已废弃,仅 H5 支持
如何写出真正可用的点击震动逻辑
不能裸写 @click="uni.vibrateShort()"。必须做平台判断 + 节流 + 失败兜底,否则用户点十次没一次震,体验直接崩坏。
- 节流阈值设为 ≥50ms:
if (Date.now() - lastVibrateTime > 50) { lastVibrateTime = Date.now(); uni.vibrateShort(); } - 失败回调里加提示:
fail: () => uni.showToast({ title: '请开启系统振动', icon: 'none' }) - iOS 用户建议放弃
uni.vibrateShort(),改用原生插件调用UIImpactFeedbackGenerator(需发版、测兼容性) - 如果项目不需要极致触感,统一用
uni.vibrateLong()反而更稳定(iOS/Android 均有响应)
最麻烦的从来不是写那行代码,而是要同时跟 iOS 设置、Android 权限、厂商 ROM、uni-app 版本、用户静音状态打交道——少一个环节,震动就消失。


















