更新记录

1.1.1(2026-10-31)

支持蒸汽模式


平台兼容性

uni-app(5.26)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× √ × × √ × - - ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.26)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × - - × ×

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

UTS 震动触感反馈(自定义节奏、强度、滑动刻度)

Android / iOS 原生触感插件,用于按钮点击、操作结果、滑动选值和节奏提醒。业务代码使用同一套 API,具体能力通过返回字段判断。

能力 使用场景
常见触感预设 点击、成功、警告、错误、轻重反馈
自定义时长与节奏 连续两下、不同级别提醒,自定义强度与锐度
滑动刻度 音量、价格、时间等选择器,跨刻度反馈,同刻度去重、连续触发限频
全局设置 接入 App 的触感开关和整体强度
有限循环与停止 Android 循环提醒,到时自动停止,也可主动取消

HBuilderX 5.26+;版本 1.1.1;插件 ID:austin-haptic-x。

项目 Android iOS 演示文件
uni-app x · Vapor 6.0+ 15.0+ index.uvue
uni-app x · VDOM 5.0+ 13.0+ index.uvue
uni-app · Vue3 5.0+ 13.0+ index.vue

不支持 Web、小程序、鸿蒙和 nvue。iOS 需要具备触感硬件的设备;iPad、模拟器等设备可能返回不支持。模拟器可验证页面、参数和返回结果,无法验证真实震感。

第 1 步:放入插件

完整目录放到 你的项目/uni_modules/austin-haptic-x/。uni_modules 与项目的 manifest.json、pages.json 同级。

项目 manifest.json 无需为本插件额外配置权限或模块。

  • Android:打包时自动合并插件内的 android.permission.VIBRATE 普通权限,不需要运行时申请授权。
  • iOS:无需额外权限或用途说明。插件不依赖第三方 SDK。

保留插件内的 utssdk 等全部文件,无需将插件的 AndroidManifest.xml 复制到项目根目录。

第 2 步:注册演示页

在项目 pages.json 的 pages 数组中追加:

{
  "path": "uni_modules/austin-haptic-x/index",
  "style": { "navigationBarTitleText": "震动触感反馈", "disableScroll": true }
}

在已有页面点击按钮时打开:

uni.navigateTo({ url: '/uni_modules/austin-haptic-x/index' })

uni-app x 自动使用 index.uvue,普通 uni-app Vue3 使用 index.vue。要把演示改成业务页面,可复制相应文件到 pages/haptics/index.uvue 或 pages/haptics/index.vue,注册新路径并保留插件目录;页面中的根目录导入路径无需修改。

第 3 步:制作并运行自定义基座

  1. HBuilderX 选中项目,进入 发行 → 原生 App 云打包,选择 Android 或 iOS,勾选 制作自定义调试基座。
  2. Android 填写应用包名与签名信息;iOS 真机填写与 Bundle ID 匹配的 P12、密码和 .mobileprovision,调试描述文件需包含测试设备的 UDID。
  3. 完成打包后安装新基座,在 运行 菜单选择 自定义基座,再运行项目。

首次导入、更新原生代码后需要重新制作基座;只改页面、参数或文档不需要。使用 HBuilderX 支持的本地模拟器运行方式时,可直接编译到模拟器,无需为模拟器申请真机签名。

第 4 步:打开页面体验

  1. 点 按钮点击 / 操作成功 / 警告提醒 / 操作失败,更多预设在“更多触感”中展开。
  2. 调整 整体强度,再点反馈按钮;关闭触感开关后不再提交播放。
  3. 拖动 滑动刻度,每跨过 10 个数值反馈一次。
  4. 选择 连续两下 / 告警节奏,点 播放节奏;也可修改毫秒数组或按时长播放。
  5. Android 可选择 循环提醒,本页最多循环 3 秒;点 停止 可提前结束。

页面底部显示本次结果、跳过原因或错误码。离页会停止播放,清理演示刻度状态,并恢复进入前的全局设置。iOS 模拟器显示“不支持”属于预期结果,不代表真机播放失败。

业务代码怎么调用

统一从插件根目录 @/uni_modules/austin-haptic-x 导入。 @/ 表示项目源码目录,对应的实际目录为 你的项目/uni_modules/austin-haptic-x/,不直接导入 utssdk/app-ios 或 utssdk/app-android。

uni-app x 的 <script setup lang="uts">:

import { onShow, onHide, onUnload } from '@dcloudio/uni-app'
import {
  vibrate, cancelVibration, configureHaptics,
  selectionChanged, resetSelectionHaptics,
  VibrateOptions, SelectionHapticsOptions,
} from '@/uni_modules/austin-haptic-x'

function onButtonTap(): void {
  const options: VibrateOptions = { type: 'light' }
  const result = vibrate(options)
  console.log(result.ok, result.skipped, result.errCode, result.errMsg)
}

function onPatternTap(): void {
  const options: VibrateOptions = {
    pattern: [0, 120, 80, 120], intensity: 0.7, sharpness: 0.5,
  }
  vibrate(options)
}

// 先用实际起始值记录选择器,滑动时再传最新值。
let priceValue = 50
const priceOptions: SelectionHapticsOptions = { key: 'price', step: 10 }
onShow(() => { selectionChanged(priceValue, priceOptions) })
function onPriceChange(value: number): void {
  priceValue = value
  selectionChanged(value, priceOptions)
}

function updatePreference(enabled: boolean, intensity: number): void {
  const settings = configureHaptics({ enabled: enabled, intensity: intensity, minIntervalMs: 40 })
  if (!settings.ok) console.log(settings.errCode, settings.errMsg)
}

function cleanup(): void {
  resetSelectionHaptics('price')
  cancelVibration()
}
onHide(() => { cleanup() })
onUnload(() => { cleanup() })

按钮点击时调用 onButtonTap() 或 onPatternTap();滑动时将当前数值传给 onPriceChange(value);偏好设置变更时调用 updatePreference(enabled, intensity)。普通 uni-app Vue3 使用相同函数调用,去掉类型标注和类型导入即可。

全局设置仅保存在当前进程,不会自动写入磁盘。需要记住用户偏好时,由业务保存并在下次启动时调用 configureHaptics()。同一进程共用设置;业务页面临时调整后,应恢复原设置。

API

方法 参数 返回 说明
vibrate(options?) VibrateOptions 或 null VibrateResult 播放预设、时长或单次节奏;默认短反馈
cancelVibration() 无 boolean 请求停止正在播放的触感;系统瞬时预设可能已经结束
isVibrationSupported() 无 boolean 当前设备是否具备可用震动硬件
getHapticsCapabilities() 无 HapticsCapabilities 查询平台、模拟器和各项能力
configureHaptics(options?) HapticsConfigOptions 或 null HapticsSettings 更新全局偏好;不传或 null 只读取;无效参数返回 ok=false、32003 与说明,原设置不变
getHapticsSettings() 无 HapticsSettings 读取当前全局偏好
selectionChanged(value, options?) 有限数字、SelectionHapticsOptions 或 null VibrateResult 记录刻度并按变化触发选择反馈
resetSelectionHaptics(key?) 字符串,默认 default void 清除指定选择器的起点与限频记录
prepareHaptics() 无 boolean 提前准备原生引擎,适合交互开始时调用;不会播放震动

ok=true 表示本次调用被接受;是否实际提交播放还需检查 skipped。系统、马达和设备设置仍会影响最终震感。

可选字段省略或传 null 时使用默认值(配置更新时保留原值);pattern 数组中的每一项仍须为有效数字。

VibrateOptions

所有字段可选。

字段 类型 默认值 说明
type string short 支持 short、long、light、medium、heavy、soft、rigid、success、warning、error、selection
duration number 不设置 自定义时长,1~10000 的整数毫秒;不能与 pattern 同时设置
pattern number[] 不设置 2~64 项,依次为等待、震动、等待、震动毫秒数;每项为 0~10000 的整数,总时长不超过 10000,至少一段震动大于 0
repeatIndex number -1 -1 单次;循环时填 pattern 中的有效索引,索引之后必须还有有效震动段;仅支持 Android,iOS 返回 32007
intensity number 1 0~1 的有限数字,乘以全局强度得到请求强度;0 时跳过播放
sharpness number 0.5 0~1 的有限数字;iOS 自定义触感锐度,越大越清脆;Android 忽略非默认值并通过 degraded/note 说明
maxDurationMs number 10000 循环播放的停止上限,1~60000 的整数毫秒;到时自动停止,避免遗留无限循环

设置 duration 或 pattern 后使用自定义播放,type 仅作默认预设,不会叠加播放。部分 iOS 系统预设无法独立调节强度或锐度;Android 无振幅控制的设备使用系统强度。请检查能力及 degraded/note,不要假定不同手机震感一致。

Android 循环示例:

vibrate({ pattern: [0, 120, 80, 120], repeatIndex: 0, maxDurationMs: 3000 })

VibrateResult

字段 类型 说明
ok boolean 调用被接受;跳过时也可能为 true
supported boolean 设备是否具备可用硬件,与本次播放结果分开判断
platform string android、ios 或 other
degraded boolean 是否按设备能力调整、忽略部分参数或使用近似效果
usedType string 实际请求类型;自定义返回 duration 或 pattern
skipped boolean 是否未向原生端提交播放
skipReason string disabled 全局关闭、zero-intensity 强度为 0、initial 首次记录起点、unchanged 同一刻度、throttled 触发过快;未跳过时为空
engine string 当前平台引擎标识,作为诊断信息
effectiveIntensity number 单次强度乘全局强度后的请求值,范围 0~1;不代表设备实际振幅
errCode number 0 无调用错误,其他值见错误码
errMsg string 错误说明,无错误时为空
note string 本次播放或能力调整说明

HapticsConfigOptions / HapticsSettings

配置参数均可选;enabled 不传或传 null 时保留当前开关。读取与配置结果均包含下列设置值和状态字段。

字段 类型 初始值 说明
enabled boolean(配置可传 null) true 全局开关;关闭时停止当前播放,后续请求返回 skipped=true
intensity number 1 后续请求的全局强度,0~1 的有限数字;设为 0 会停止当前播放
minIntervalMs number 40 两次已提交播放之间的最小间隔,0~1000 的整数毫秒;限制 vibrate() 与选择器的实际播放频率
结果字段 类型 说明
ok boolean 读取或更新成功为 true;无效配置为 false
errCode number 成功为 0,无效配置为 32003
errMsg string 无效配置的具体说明,成功时为空

configureHaptics() 只更新传入字段,先完整校验;无效配置返回原设置值与错误状态,不会部分生效。getHapticsSettings() 读取时返回 ok=true、errCode=0、errMsg=''。

SelectionHapticsOptions

字段 类型 默认值 说明
key string default 选择器标识,去除首尾空白后 1~64 个字符;不同控件使用不同 key
step number 1 大于 0、不超过 1000000000 的有限数字;按 Math.floor(value / step) 划分刻度
minIntervalMs number 40 此选择器两次播放的最小间隔,0~1000 的整数毫秒;同时受全局间隔限制
intensity number 1 此选择器强度,0~1 的有限数字,再乘以全局强度

value 必须为有限数字,除以 step 后的刻度需在安全整数范围内。首次调用仅建立起点;同刻度不重复播放,快速跨多个刻度也只尝试当前反馈,不补播历史刻度。进程内最多保存 32 路选择器,超出时移除最早建立的一路;离页调用 resetSelectionHaptics(key) 清理自己使用的 key。

HapticsCapabilities

字段 类型 说明
supported boolean 是否存在可用震动硬件
platform string android、ios 或 other
supportsPreset boolean 是否支持预设反馈
supportsDuration boolean 是否支持自定义时长
supportsPattern boolean 是否支持单次自定义节奏
supportsRepeat boolean 是否支持循环节奏;iOS 为 false
supportsCancel boolean 是否可请求停止正在播放的触感
supportsIntensity boolean 是否具备强度调节能力;个别系统预设仍有独立限制
supportsSharpness boolean 是否支持自定义锐度;Android 为 false
isSimulator boolean 是否为模拟器环境
engine string 平台引擎标识
notes string 设备能力与使用说明

错误码与使用边界

错误码 说明 处理
0 无调用错误 同时检查 skipped 与 degraded
10001 当前平台不支持 使用 Android / iOS App
32001 原生上下文不可用 在前台页面调用,检查参数与基座版本
32002 无可用触感硬件 检查设备能力;iOS 模拟器会返回此状态
32003 参数校验失败 按字段范围修正参数,检查返回的 ok 与 errMsg
32004 原生播放失败 查看 errMsg,停止后重试
32006 App 不在前台 回到前台,由用户交互触发
32007 当前平台不支持循环 iOS 改用单次 pattern,或先检查 supportsRepeat

仅用于前台交互反馈。业务页面应在 onHide / onUnload 调用 cancelVibration();演示页已接好。iOS 系统中断或切后台会停止当前触感,Android 循环会在设定时限自动停止。新播放会替换此前播放,同一进程不同时播放多组节奏。

iPhone 无震感时,检查 设置 → 辅助功能 → 触控 → 振动 与 设置 → 声音与触感 → 系统触感;Android 检查系统震动设置及设备是否有震动马达。播放返回成功表示已向系统提交,不是对物理马达状态的检测。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 自动合并 android.permission.VIBRATE 普通权限,无运行时授权弹窗;iOS 无额外权限或用途声明。项目 manifest.json 无需为本插件重复配置。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅调用本机震动与触感能力,不采集、保存或上传用户数据,不内置服务器;全局开关和强度仅保存在当前运行进程内。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。