uni-app uni.createInnerAudioContext()打包到ios无法正常播放声音

uni-app uni.createInnerAudioContext()打包到ios无法正常播放声音

开发环境 版本号 项目创建方式
Windows win11 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:4.08

手机系统:iOS

手机系统版本号:iOS 16

手机厂商:苹果

手机机型:iPhone 13

页面类型:vue

vue版本:vue2

打包方式:云端

示例代码:

//输入框密码长度变化
ischange(e) {  
    this.initialisePassword()  
    this.passwordContexts['ber'].play()  
    this.passwordContexts['ber'].onPlay(() => {  
        console.log('开始播放')  
    })  
    this.passwordContexts['ber'].onEnded(() => {  
        this.passwordContexts['ber'].destroy()  
    })  
    this.passwordContexts['ber'].onError((res) => {  
        console.log(res, 'yinpin')  
    })  
},  
//输入密码的音频  
initialisePassword() {  
    if (this.passwordContexts['ber']) {  
        this.passwordContexts['ber'].destroy();  
    }  
    const innerAudioContext = uni.createInnerAudioContext();  
    innerAudioContext.autoplay = false; // 禁自动播放    
    innerAudioContext.src = '/static/sounds/ber.mp3';  
    innerAudioContext.sessionCategory = 'ambient';  
    this.passwordContexts['ber'] = innerAudioContext  
},

操作步骤:

methods: {  
    //失去焦点之后把自动聚焦变为false  
    isblur(e) {  
        if (e == 'ok') {  
            this.showKeyboard = false  
        }  
    },  
//输入框长度变化了  
    ischange(e) {  
        this.initialisePassword()  
        this.passwordContexts['ber'].play()  
    this.passwordContexts['ber'].onPlay(() => {  
        console.log('开始播放')  
    })  
    this.passwordContexts['ber'].onEnded(() => {  
        this.passwordContexts['ber'].destroy()  
    })  
    this.passwordContexts['ber'].onError((res) => {  
        console.log(res, 'yinpin')  
    })  
},  
//输入密码的音频  
initialisePassword() {  
    if (this.passwordContexts['ber']) {  
        this.passwordContexts['ber'].destroy();  
    }  
    const innerAudioContext = uni.createInnerAudioContext();  
    innerAudioContext.autoplay = false; // 禁自动播放    
    innerAudioContext.src = '/static/sounds/ber.mp3';  
    innerAudioContext.sessionCategory = 'ambient';  
    this.passwordContexts['ber'] = innerAudioContext  
},  
//点击房间的音频  
initialiseClick() {  
    if (this.qiaContexts['qia']) {  
        this.qiaContexts['qia'].destroy();  
    }  
    const innerAudioContext = uni.createInnerAudioContext();  
    innerAudioContext.autoplay = false; // 禁自动播放    
    innerAudioContext.src = '/static/sounds/qia.mp3';  
    innerAudioContext.sessionCategory = 'ambient';  
    this.qiaContexts['qia'] = innerAudioContext  
},

预期结果:

音频能够正常播放,并且不会中止其他声音播放

实际结果:

ischange(e) {  
    this.initialisePassword()  
    this.passwordContexts['ber'].play()  
    this.passwordContexts['ber'].onPlay(() => {  
        console.log('开始播放')  
    })  
    this.passwordContexts['ber'].onEnded(() => {  
        this.passwordContexts['ber'].destroy()  
    })  
    this.passwordContexts['ber'].onError((res) => {  
        console.log(res, 'yinpin')  
    })  
},  
{"errMsg":"MediaError","errCode":-5} ,  yinpin

经过我今天的调试,最终发现在每次音频播放的时候,同一时间onPlay()里的回调会打印两次,我估计这可能是音频没办法正常播放的原因,然后我把innerAudioContext.sessionCategory = ‘ambient’;改为了’playback’,声音能正常出来了,但是并不能完全满足需求,因为项目中部分地方的音频可能会根据后端的数据变化同时出现。

bug描述:

项目打包到安卓和h5播放所有的音频都没有问题,但是打包到ios进行真机调试的时候音频无法播放,偶尔会出现一下声音但是马上又消失,

更多关于uni-app uni.createInnerAudioContext()打包到ios无法正常播放声音的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

解决了么 我也遇到了

更多关于uni-app uni.createInnerAudioContext()打包到ios无法正常播放声音的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni.createInnerAudioContext() 开发 uni-app 应用时,如果在 iOS 上打包后无法正常播放声音,可能是由于以下几个原因导致的。以下是一些常见的问题及解决方案:


1. 音频文件路径问题

  • 问题描述:iOS 对音频文件路径的要求较为严格,如果路径不正确,音频无法加载。
  • 解决方案
    • 确保音频文件路径是 相对路径网络路径
    • 如果是本地文件,建议将音频文件放在 static 目录下,并使用相对路径引用:
      const audio = uni.createInnerAudioContext();
      audio.src = '/static/audio.mp3'; // 确保路径正确
      
    • 如果是网络路径,确保 URL 是有效的,并且支持 HTTPS。

2. 音频文件格式问题

  • 问题描述:iOS 对音频格式的支持有限,某些格式可能无法播放。
  • 解决方案
    • 确保音频文件是 iOS 支持的格式,如 .mp3.m4a.wav 等。
    • 如果格式不支持,可以使用工具将音频文件转换为 iOS 支持的格式。

3. iOS 自动播放限制

  • 问题描述:iOS 对音频的自动播放有严格的限制,用户必须主动触发播放(如点击事件)。
  • 解决方案
    • 在用户交互事件(如按钮点击)中触发播放:
      const audio = uni.createInnerAudioContext();
      audio.src = '/static/audio.mp3';
      
      document.getElementById('playButton').addEventListener('click', () => {
          audio.play();
      });
      
    • 避免在页面加载时自动播放。

4. iOS 静音模式

  • 问题描述:如果 iOS 设备处于静音模式,音频可能无法播放。
  • 解决方案
    • 提示用户关闭静音模式。
    • 在代码中检测并处理静音模式(但 iOS 对静音模式的控制较为严格,开发者无法直接绕过)。

5. 权限问题

  • 问题描述:iOS 可能需要特定权限才能播放音频。
  • 解决方案
    • 确保在 manifest.json 中配置了必要的权限:
      {
          "app-plus": {
              "ios": {
                  "permissions": {
                      "audio": true
                  }
              }
          }
      }
      

6. uni-app 打包配置问题

  • 问题描述:iOS 打包时,某些配置可能导致音频无法正常播放。
  • 解决方案
    • 确保打包配置正确,尤其是 manifest.json 中的 app-plusios 配置。
    • 如果使用了自定义基座,尝试重新打包或使用官方基座测试。

7. 调试与日志

  • 问题描述:无法确定具体问题所在。
  • 解决方案
    • 使用 console.log 打印音频加载和播放的状态:
      audio.onPlay(() => {
          console.log('音频开始播放');
      });
      audio.onError((err) => {
          console.error('音频播放失败', err);
      });
回到顶部