微信小程序audio组件在ios端无法播放的解决办法

 更新时间:2021年07月02日 09:03:44   作者:🍬Black Eyed Peas🍥  
audio是音频组件,用于播放一个基于http协议的音频资源,这篇文章主要给大家介绍了关于微信小程序audio组件在ios端无法播放的解决办法,需要的朋友可以参考下

解决方法: 给 audio 组件绑定点击事件,手动触发播放暂停方法!

代码片段:

wxml文件

<!-- 判断是语音通话,有通话记录,通话描述不包含'未接' -->
<view class="reference"
    wx:if="{{itemList.activity_type === 'phone' && itemList.activity_reference_id && tool.indexOf(itemList.comment,'未接') === -1 }}">
    <!-- 语音播放 -->
    <van-button class="ref-btn" wx:if="{{audioResourceMaps[itemList.activity_reference_id] === undefined}}"
      loading="{{itemList.activity_reference_id === currentGettingReferenceId}}" icon="play" type="info" plain
      data-reference-id="{{itemList.activity_reference_id}}" bindtap="getReference">
    </van-button>
    <view wx:else class="audio-box">
        <!-- 语音播放暂停 -->   
      <van-button class="ref-btn" wx:if="{{audioResourceMaps[itemList.activity_reference_id]}}"
      data-reference-id="{{itemList.activity_reference_id}}"
        icon="pause" type="info" plain bindtap="pauseAudio"/>
        <!-- 点击没有通话录音 --> 
      <span wx:else class="no-audio-text">未找到通话录音</span>
    </view>
</view>

wxss文件

.reference {
  margin-top: 20rpx;
  height: 100%;
  padding: 5rpx;
  box-sizing: border-box;
}

.ref-btn {
  width: 80rpx;
  height: 80rpx;
  display: flex;
}

.ref-btn button {
  width: 80rpx;
  height: 80rpx;
  border-radius: 50%;
}

js文件

/**
   * 组件的初始数据
   */
  data: {
    currentGettingReferenceId: null,  //正在播放的音频id
    audioResourceMaps: {}, //点击过的音频列表
    isPause:false, // 是否暂停
  },
/**
   * 组件的生命周期 
   */
  lifetimes: {
    attached: function () {
      // 因为是子组件 所以要在这里获取实例
      this.audioContext = wx.createInnerAudioContext();
    },
    detached: function () {
      // 停止播放
      this.stopAudio()
      // 在组件实例被从页面节点树移除时执行
    },
  },
  methods: { 
    // 获取录音
    getReference(e) {
      let id = e.target.dataset.referenceId
      if(id != this.data.currentGettingReferenceId){
        this.stopAudio()
      }
      this.setData({
        currentGettingReferenceId:id
      })
      // 点击获取录音url的接口。 接口请求根据自己的封装来写
      WXAPI.getResourceUrl(
        `/conversation/conversationsession/${id}/`, {
          data_type: 'all',
        }).then(({resource_url}) => {
          console.log('音频地址====',resource_url,)
        let url = resource_url && resource_url.indexOf('https://') > -1? encodeURI(resource_url) : null
        this.data.audioResourceMaps[id] = url;
        if(resource_url) this.playAudio(id,url)
        this.setData({
          audioResourceMaps: this.data.audioResourceMaps
        })
        console.log('播放过的列表=====',this.data.audioResourceMaps)
      }).catch(function (e) {
        console.log(e)
      })
    },
    // 暂停
    pauseAudio(){
      this.setData({
        isPause: !this.data.isPause
      })
      let id = this.data.currentGettingReferenceId
      console.log(id,'播放暂停的id')
      const innerAudioContext = this.audioContext
      if(this.data.isPause){
        innerAudioContext.pause()
        console.log('暂停播放')
      }else{
        innerAudioContext.play()
        console.log('继续播放')
      }
    },
    // 停止播放
    stopAudio(){
      const innerAudioContext = this.audioContext
      innerAudioContext.stop()
      let obj = this.data.audioResourceMaps
      for(let item in obj){
        delete obj[item]
      }
      // 停止播放就要把播放列表id对应的音频地址做清空处理
      this.setData({
        audioResourceMaps: obj,
        currentGettingReferenceId:null
      })
      console.log('停止播放')
    },
    // 播放
    playAudio(id,url) {
      const innerAudioContext = this.audioContext
      console.log(url, '音频的地址')
      if(url){
        innerAudioContext.src = url
        innerAudioContext.play()
        innerAudioContext.onPlay(() => {
          console.log('开始播放')
        })
        innerAudioContext.onTimeUpdate(() => {
          console.log(innerAudioContext.duration,'总时长')   
          console.log(innerAudioContext.currentTime,'当前播放进度')
        })
        setTimeout(() => {
          console.log(innerAudioContext.duration,'总时长')   
          console.log(innerAudioContext.currentTime,'当前播放进度')
        }, 500)
        innerAudioContext.onEnded(() => {
          let obj = this.data.audioResourceMaps
          for(let item in obj){
            delete obj[item]
          }
          this.setData({
            audioResourceMaps: obj,
            currentGettingReferenceId:null
          })
          console.log('播放完毕')
        })
        innerAudioContext.onError((res) => {
          console.log(res.errMsg)
          console.log(res.errCode)
        })
      }
    }

效果图

⚠️微信小程序中使用vant,必须要在.json 文件中引用 不然标签不会显示哦

我是在app.json文件引得  全局可用

"usingComponents": {
    "van-button": "@vant/weapp/button/index",
    "van-icon": "@vant/weapp/icon/index",
  }

官网文档:developers.weixin.qq.com/miniprogram

总结

到此这篇关于微信小程序audio组件在ios端无法播放解决的文章就介绍到这了,更多相关小程序audio组件ios端播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用javascript将数据导入Excel示例代码

    用javascript将数据导入Excel示例代码

    将数据导入Excel的方法有很多,本例介绍的这个是使用js来实现数据的导入,感兴趣的朋友可以了解下
    2014-09-09
  • 微信小程序 简易计算器实现代码实例

    微信小程序 简易计算器实现代码实例

    这篇文章主要介绍了微信小程序 简易计算器实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例

    基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例

    这篇文章主要介绍了基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 5个JavaScript经典面试题

    5个JavaScript经典面试题

    这篇文章主要介绍了5个JavaScript经典面试题,这些面试题可能在各种公司的javascript面试中都会出现,需要的朋友可以参考下
    2014-10-10
  • 微信小程序 轮播图实现原理及优化详解

    微信小程序 轮播图实现原理及优化详解

    这篇文章主要介绍了微信小程序 轮播图实现原理及优化详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Bootstrap组件学习之导航、标签、面包屑导航(精品)

    Bootstrap组件学习之导航、标签、面包屑导航(精品)

    这篇文章主要介绍了Bootstrap组件学习之导航、标签、面包屑导航(精品)的相关资料,需要的朋友可以参考下
    2016-05-05
  • JS原型链 详解及示例代码

    JS原型链 详解及示例代码

    本文主要介绍JS原型链的知识,这里整理了相关资料及简单实现示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • TypeScript高级用法的知识点汇总

    TypeScript高级用法的知识点汇总

    这篇文章主要给大家介绍了关于TypeScript高级用法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用TypeScript具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • JavaScript自定义事件介绍

    JavaScript自定义事件介绍

    很多DOM对象都有原生的事件支持,向div就有click、mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会。随着web技术发展,使用JavaScript自定义对象愈发频繁,让自己创建的对象也有事件机制,通过事件对外通信,能够极大提高开发效率
    2013-08-08
  • OkHttp踩坑随笔为何 response.body().string() 只能调用一次

    OkHttp踩坑随笔为何 response.body().string() 只能调用一次

    想必大家都用过或接触过 OkHttp,我最近在使用 Okhttp 时,就踩到一个坑,在这儿分享出来,以后大家遇到类似问题时就可以绕过去
    2018-01-01

最新评论