uni-app IOS 长按触发震动失效,因录音方法异步导致震动无法执行
uni-app IOS 长按触发震动失效,因录音方法异步导致震动无法执行
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Windows10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
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 或其他平台,使用短震动 } }
更多关于uni-app IOS 长按触发震动失效,因录音方法异步导致震动无法执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
由于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 或其他平台,使用短震动
}
}
更多关于uni-app IOS 长按触发震动失效,因录音方法异步导致震动无法执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的异步执行时序问题。在iOS平台上,recorderManager.start()方法会立即执行并可能阻塞后续代码,导致triggerVibration()中的震动反馈无法及时触发。
解决方案是调整代码执行顺序,确保震动在录音开始前完成:
function startSpeek() {
// #ifdef APP-PLUS
// 先触发震动再初始化录音
triggerVibration();
if (!recorderManager) {
initRecorder();
}
voiceTextValue.value = '';
openTimer.value = Date.now();
// 清除之前的超时定时器
if (timeoutTimer) {
clearTimeout(timeoutTimer);
timeoutTimer = null;
}
// 设置超时定时器
timeoutTimer = setTimeout(() => {
console.log('录音时长达到3分钟,自动停止录音');
endSpeek();
timeoutListeners.forEach((listener) => {
try {
listener();
} catch (error) {
console.error('超时回调执行失败', error);
}
});
timeoutTimer = null;
}, MAX_RECORDING_DURATION);
// 延迟执行录音开始,确保震动已完成
setTimeout(() => {
recorderManager.start({
duration: MAX_RECORDING_DURATION,
sampleRate: 16000,
format: 'pcm',
numberOfChannels: 1
});
}, 100);
// #endif
}
关键改动:
- 将震动调用移至最前面
- 使用
setTimeout延迟录音开始,给震动执行留出时间 - 延迟时间100ms足够震动触发,又不会影响用户体验
另外,建议优化震动代码,移除不必要的iOS类操作,直接使用uni-app提供的API:
export function triggerVibration() {
uni.vibrateShort();
}

