1***@qq.com
1***@qq.com
  • 发布:2025-11-19 19:19
  • 更新:2025-11-19 19:27
  • 阅读:18

【报Bug】uni-app IOS 长按触发震动失效,因录音方法异步导致震动无法执行

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows10

HBuilderX类型: 正式

HBuilderX版本号: 4.86

手机系统: iOS

手机系统版本号: iOS 26

手机厂商: 苹果

手机机型: ipad

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

/**

  • 开始录音
    */
    function startSpeek() {
    // #ifdef APP-PLUS
    // 触发震动
    triggerVibration();

    if (!recorderManager) {
    initRecorder();
    }
    voiceTextValue.value = '';
    openTimer.value = Date.now();

    // 清除之前的超时定时器
    if (timeoutTimer) {
    clearTimeout(timeoutTimer);
    timeoutTimer = null;
    }

    // 设置超时定时器,3分钟后自动停止录音
    timeoutTimer = setTimeout(() => {
    console.log('录音时长达到3分钟,自动停止录音');
    // 自动停止录音
    endSpeek();
    // 触发超时回调
    timeoutListeners.forEach((listener) => {
    try {
    listener();
    } catch (error) {
    console.error('超时回调执行失败', error);
    }
    });
    // 清除定时器
    timeoutTimer = null;
    }, MAX_RECORDING_DURATION);

    recorderManager.start({
    duration: MAX_RECORDING_DURATION,
    sampleRate: 16000,
    format: 'pcm',
    numberOfChannels: 1
    });
    // #endif
    }

/**

  • 震动反馈
  • @param {number} intensity 震动强度 (仅适用于 iOS)
    */
    export function triggerVibration(intensity = 1) {
    if (plus.os.name === "iOS") {
    try {
    var UIImpactFeedbackGenerator = plus.ios.importClass("UIImpactFeedbackGenerator");
    var impact = new UIImpactFeedbackGenerator();
    impact.prepare();
    impact.init(intensity); // 设置震动强度
    impact.impactOccurred(); // 触发震动
    } catch (error) {
    console.error("iOS 震动反馈初始化失败:", error);
    }
    } else {
    uni.vibrateShort(); // 对于 Android 或其他平台,使用短震动
    }
    }

操作步骤:

1、在长按事件中触发震动。
2、在同一事件中调用 uni.getRecorderManager() 启动录音。
3、观察震动未能成功触发,但录音正常开始。

预期结果:

长按触发震动时,震动功能应该能正常执行,即使同时启动了录音。

实际结果:

长按触发震动失效,录音方法异步执行后震动未被触发。

bug描述:

现象:在长按触发震动的同时调用 uni.getRecorderManager() 启动录音时,震动功能失效。可能是因为录音方法的异步特性导致震动方法未能执行。

复现步骤:
在长按事件中触发震动。
在同一事件中调用 uni.getRecorderManager() 开始录音。
观察震动未能成功触发。

预期结果:长按触发震动功能正常,且不会因录音方法的异步执行导致震动失效。

实际结果:长按触发震动失效,录音功能正常执行。

2025-11-19 19:19 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com (作者) - dddd

由于IOS 无法短震动所以我自己写了一个短震动方法
/**

  • 震动反馈
  • @param {number} intensity 震动强度 (仅适用于 iOS)
    */
    export function triggerVibration(intensity = 1) {
    if (plus.os.name === "iOS") {
    try {
    var UIImpactFeedbackGenerator = plus.ios.importClass("UIImpactFeedbackGenerator");
    var impact = new UIImpactFeedbackGenerator();
    impact.prepare();
    impact.init(intensity); // 设置震动强度
    impact.impactOccurred(); // 触发震动
    } catch (error) {
    console.error("iOS 震动反馈初始化失败:", error);
    }
    } else {
    uni.vibrateShort(); // 对于 Android 或其他平台,使用短震动
    }
    }

要回复问题请先登录注册