真机不震是因系统开关、权限或调用时机问题,非代码错误;iOS需开启触感反馈且静音开关未拨下,Android需声明VIBRATE权限并手动开启振动提醒,模拟器不支持。

直接用 uni.vibrateShort + uni.createAnimation 就能实现,但真机不震?大概率卡在系统开关、权限配置或调用时机上,不是代码写错了。
为什么图片点击没震动:iOS 和 Android 完全两套逻辑
iOS 上 uni.vibrateShort 不是“短震”,而是触发系统触感样式(Taptic Engine),但前提是:「设置 → 辅助功能 → 触感反馈」已开启,且侧边静音开关没拨下;Android 则依赖 android.permission.VIBRATE 权限,国产 ROM 还要手动进「应用通知权限 → 振动提醒」打开开关。模拟器一律不支持,别测。
-
uni.vibrateShort在 iOS 真机静默失败,不是 bug,是系统限制 —— 关了触感反馈或处于静音状态,连fail回调都不会触发 - Android 12+ 必须在
manifest.json的"androidPermissions"数组里显式声明"android.permission.VIBRATE" - H5 和小程序环境调用
uni.vibrateShort直接丢弃,毫无提示,别在这俩端写震动逻辑
图片缩放 + 震动必须用 animation API,别写 CSS 动画类
直接给 <image> 加 class="bounce" 并配 CSS animation,在 uni-app 多端渲染中极易失效或卡顿,尤其连续点击时动画堆积。正确做法是用 uni.createAnimation 控制缩放节奏,并与震动同步触发。
- 在
onLoad或mounted中初始化 animation 实例:this.animation = uni.createAnimation({ duration: 200, timingFunction: 'ease-out' }) - 点击事件里先调
uni.vibrateShort(),再执行动画:this.animation.scale(1.15).step().scale(1).step(); this.setData({ animationData: this.animation.export() }) - WXML 中绑定到
<view>或<image>,不要绑在<button>上 —— button 组件内部封闭,不支持 animation
连点场景下震动错乱?必须加节流,且不能靠 setTimeout 拼节奏
uni.vibrateShort 是纯异步、无回调、无 Promise 的黑盒操作。用户快速连点时,多次调用会冲突:iOS 直接丢弃后续请求,Android 可能合并成一次长震或被系统限频。想模拟“按下-释放”双反馈?iOS 原生不支持,uni.vibrateShort 无法满足。
- 用时间戳节流:定义
lastVibrateTime = 0,每次点击前判断Date.now() - lastVibrateTime > 50,否则 return - 别写
setTimeout(() => uni.vibrateShort(), 100)模拟节奏 —— iOS 会直接忽略第二次以后的调用 - 禁用态必须同步关闭震动和动画:点击后设
isDisabled = true,并在点击函数开头加if (this.isDisabled) return
安卓能震、iOS 不震?检查 info.plist 和 plus 环境是否误用
有人把 plus.device.vibrate 和 uni.vibrateShort 混用,结果 iOS 打包后完全失效。前者是旧版原生接口,参数格式与平台强耦合(iOS 只认 true,Android 认毫秒数),且需确保 plus 已就绪;后者是 uni-app 3.99+ 推荐的统一封装,但只在 App 端生效。
- 确认没在
#ifdef MP-WEIXIN或#ifdef H5下误调uni.vibrateShort - iOS 打包需检查
ios/Info.plist是否含UIBackgroundModes(实际不需要),真正关键的是系统级触感开关 - 如果用了
plus.device.vibrate,iOS 必须传true,传数字如10会静默失败;Android 可传10,但建议用uni.vibrateShort替代
最常被忽略的点:震动不是“代码写了就能响”,它横跨框架层、系统权限、用户设置三层。哪怕 animation 缩放正常,只要 iOS 触感反馈关着,或者 Android 权限没在 manifest.json 里声明,就永远没反应 —— 这和代码本身无关。


















