uni-app APP端 getBackgroundAudioManager 中 onWaiting 无法被监听,导致无法设置loading,严重降低用户使用体验
uni-app APP端 getBackgroundAudioManager 中 onWaiting 无法被监听,导致无法设置loading,严重降低用户使用体验
测试过的手机
realme ui 4.0, ios16.6
示例代码:
const bgAudioManager = uni.getBackgroundAudioManager();
bgAudioManager.title = '致爱丽丝';
bgAudioManager.singer = '暂无';
bgAudioManager.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';
bgAudioManager.src = 'https://96.f.1ting.com/local_to_cube_202004121813/96kmp3/jn/12.jlhg/8.zhg/2.mp3';
bgAudioManager.onWaiting(() => {
console.log('加载');
});
操作步骤:
- 根据以上原始代码,APP中的 getBackgroundAudioManager 的 onWaiting 无法打印 ‘加载’,无任何反应
预期结果:
- APP中的 getBackgroundAudioManager 的 onWaiting 事件可以被监听,在资源稍卡时,加快加载速度,体验与小程序、H5一致即可
实际结果:
- APP中的 getBackgroundAudioManager 的 onWaiting 事件不能被监听,无任何反馈
bug描述:
- H5和小程序都没问题,唯独APP端
- getBackgroundAudioManager 中 onWaiting 无法被监听
- 音频加载速度明显慢于H5和小程序。在资源不卡能够快速获取时,影响不大。在同一时间,如果服务器稍微卡,APP加载播放音频超过20秒才能播放,小程序或H5只需要2秒左右。
| 开发环境 | 版本号 | 项目创建方式 |
|----------|--------|--------------|
| Windows | 7 | HBuilderX |
| PC | | |
| 手机系统 | | 全部 |
| 页面类型 | | vue |
| vue版本 | | vue2 |
| 打包方式 | | 云端 |
7 回复
在用户端网络卡的时候,无法检测waiting,无法给出loading,导致用户认为app死机了
请确认bug…
刚测试了你的代码。在hbx 3.96上
我这是可以进到onWaiting的
realme 系列手机通病,已测试小米手机没问题
realme 系列手机通病,已测试小米手机没问题
2024-09-05还未修复这个bug
在 uni-app
中使用 getBackgroundAudioManager
时,onWaiting
事件无法被监听,确实会影响用户体验,尤其是在网络较慢或音频加载时间较长的情况下,无法显示加载状态(如 loading 动画)会让用户感到困惑。
问题分析
onWaiting
事件是用于监听音频缓冲事件的,当音频数据不足以播放时触发。如果 onWaiting
无法被监听,可能是以下原因之一:
- 平台兼容性问题:不同平台(如 iOS 和 Android)对
getBackgroundAudioManager
的支持可能存在差异。 - 事件绑定问题:事件绑定可能未正确执行。
- API 实现问题:
uni-app
的getBackgroundAudioManager
在某些平台上可能存在实现问题。
解决方案
1. 检查事件绑定
确保 onWaiting
事件已正确绑定。以下是一个示例代码:
const backgroundAudioManager = uni.getBackgroundAudioManager();
backgroundAudioManager.onWaiting(() => {
console.log('音频正在缓冲,显示 loading');
// 在这里显示 loading 动画
});
backgroundAudioManager.onCanplay(() => {
console.log('音频可以播放,隐藏 loading');
// 在这里隐藏 loading 动画
});
2. 使用其他事件作为替代
如果 onWaiting
无法正常工作,可以尝试使用其他事件来间接实现类似的功能。例如:
onCanplay
:当音频可以播放时触发,可以在这里隐藏 loading。onError
:当音频加载失败时触发,可以在这里处理错误并隐藏 loading。
backgroundAudioManager.onCanplay(() => {
console.log('音频可以播放,隐藏 loading');
// 隐藏 loading 动画
});
backgroundAudioManager.onError((err) => {
console.error('音频加载失败', err);
// 隐藏 loading 动画并提示用户
});
3. 手动实现缓冲检测
如果 onWaiting
事件无法正常工作,可以手动检测音频的缓冲状态。例如,通过定时器检查 buffered
属性:
let isBuffering = false;
setInterval(() => {
if (backgroundAudioManager.buffered < backgroundAudioManager.duration) {
if (!isBuffering) {
console.log('音频正在缓冲,显示 loading');
isBuffering = true;
// 显示 loading 动画
}
} else {
if (isBuffering) {
console.log('音频缓冲完成,隐藏 loading');
isBuffering = false;
// 隐藏 loading 动画
}
}
}, 1000);
4. 检查平台差异
如果问题仅出现在特定平台(如 iOS 或 Android),可以针对不同平台编写不同的代码逻辑。例如:
if (uni.getSystemInfoSync().platform === 'ios') {
// iOS 平台的特殊处理
} else {
// Android 平台的特殊处理
}