uni.vibrate仅在ios/android原生打包后生效,需分别配置系统权限与设置:ios开启“辅助功能→触感反馈”,android在manifest.json勾选震动权限;推荐使用uni.vibrate({type:'light'})兼容双端,避免毫秒数传参;连续调用须间隔≥50ms并加节流,自定义节奏需原生插件支持。

uni-app App端调用navigator.vibrate没反应?先确认平台和权限
App端震动必须走原生能力,uni.vibrate 在 H5 和小程序里根本无效,只在 iOS/Android 原生打包后才可能生效。但即使打包了,iOS 默认禁止后台震动、Android 8.0+ 需要 VIBRATE 权限且得用户手动开启——很多开发者卡在这一步就以为 API 坏了。
- iOS 真机需开启「设置 → 辅助功能 → 触感反馈」,否则静音或关闭状态下
uni.vibrate完全不触发 - Android 必须在
manifest.json的“Android 设置”里勾选「震动权限」,否则运行时直接静默失败,连错误都不抛 - uni-app 3.99+ 才真正支持
uni.vibrate({ type: 'light' })这类细粒度参数;老版本只能传毫秒数,比如uni.vibrate(15),且仅支持 10–500ms 范围
为什么uni.vibrate(10)在安卓上震一下就停,iOS 却没反应?
因为 iOS 的震动不是“持续震动”,而是调用系统预设的触感样式(如light、medium、heavy),传数字毫秒会被忽略。Android 则严格按毫秒执行,但太短(500ms)都会被截断或拒绝。
- 推荐写法:
uni.vibrate({ type: 'light' })—— 兼容双端,iOS 用 Taptic Engine,Android 自动降级为短震 - 避免写
uni.vibrate(0)或uni.vibrate(-1),部分 Android 厂商 ROM 会 crash 或卡 UI 线程 - 连续调用需间隔 ≥ 50ms,否则 iOS 直接丢弃后续请求,Android 可能合并成一次长震
自定义震动模式(比如“滴滴-滴”)在 uni-app 里能实现吗?
不能直接用uni.vibrate实现。它只支持单次触发,没有「序列震动」API。想模拟节奏,得靠setTimeout手动调度,但风险极高:
- Android 多次调用
uni.vibrate可能被系统限频,实际效果断续或消失 - iOS 完全不支持连续触感,
type参数只认单次,重复调用无响应 - 更稳妥的做法是:改用原生插件(如
uni-plugin-vibrate),它封装了 Android 的Vibrator.vibrate(long[], int)和 iOS 的UIFeedbackGenerator,但需自己发版、测兼容性
点击按钮后震动,但用户快速连点导致震动错乱怎么办?
震动是异步操作,但没回调也没 Promise,无法判断是否执行完。连点时旧震动还没结束,新请求又进来,结果就是延迟、重叠、甚至卡顿。
- 必须加节流:用
lastVibrateTime变量记录上次调用时间,间隔 - 别在
@click里裸写uni.vibrate,包一层if (Date.now() - lastVibrateTime > 50) { ...; lastVibrateTime = Date.now(); } - 震动本身不阻塞 JS,但频繁触发会影响 UI 帧率,尤其低端 Android 机,建议只在关键操作(如提交成功、删除确认)中启用
震动不是“加个 API 就行”的功能,它横跨系统权限、原生能力封装、用户设备设置三层。最容易被忽略的是:你以为在调 API,其实是在跟 iOS 辅助功能开关、Android 厂商 ROM 行为、uni-app 编译版本三者同时打交道。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










