前段时间公司突然想用egret(白鹭引擎)做一个金币游戏,大半个月边看文档边写吭哧吭哧也总算是弄完了。期间遇到一个问题,那就是ios环境下微信浏览器的音频自动播放问题。

个人感觉吧,egret自己封装的audio还是不太健壮。群里,社区呼声一片,相信前端的很多人都碰到过这个问题。而网上随便search一下答案很快就出来了。这里就先copy一份答案吧。

   <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
// 方法1: 微信JS-SDK, 不推荐使用"野生"方式, 因为不知道什么时候就可以不能用了!
// http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
// 通过config接口注入权限验证配置后, 在 ready 中 play 一下 audio
function autoPlayAudio1() {
wx.config({
// 配置信息, 即使不正确也能使用 wx.ready
debug: false,
appId: '',
timestamp: 1,
nonceStr: '',
signature: '',
jsApiList: []
});
wx.ready(function() {
document.getElementById('bgmusic').play();
});
}
// 方法2: "野生"方法, 借用原来老的 WeixinJSBridge
function autoPlayAudio2() {
window.onload = function() {
// alert(typeof WeixinJSBridge);
WeixinJSBridge.invoke('getNetworkType', {}, function(e) {
// 在这里拿到 e.err_msg, 这里面就包含了所有的网络类型
// alert(e.err_msg);
document.getElementById('bgmusic').play();
});
};
}
// 大家或多或少都知道 iOS Safari 不允许自动播放 audio, 可能已经被坑过了,
// 但微信内嵌的浏览器应该是做了一些定制化, 允许自动播放 audio.
// 测试了以下机型在微信内嵌浏览器中仅需设置 audio autoplay 即可自动播放(audio)音乐, 无需特殊处理.
// * iPhone5 iOS 7.0.6 WeChat 6.2
// * iPhone5s iOS 8.1.2 WeChat 6.3.7
// * iPhone6Plus iOS 8.1.3 WeChat 6.3.7
// * MI1S Android 4.1.2 WeChat 6.3.7
//
// 但是当手机是 iPhone6s iOS 9.1 WeChat 6.3.7 时, 必须做如下特殊处理才能在微信中自动播放(audio)音乐,
// 我可以推测是 iOS 9 的兼容性问题么?
//
autoPlayAudio1(); // 推荐使用方法1
// autoPlayAudio2(); // 也可以试一试方法2 那么在egret 中怎么比较好的去实现打包h5之后,ios微信浏览器自动播放呢?这里就参考了一下前端的方法,还是贴代码比较好解释吧。
1:在html模板中的body标签前面添加一段js,注意是body前面;

function playsound(sound,loop){
                              if(sound == null){
                                    console.log('sound err')
                                    return;
                                }
                              var times = loop?0:1;
                             if(typeof WeixinJSBridge != 'undefined'){
                                    WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
                                    return sound.play(0,times);
                                     });
                                 }else{
                                  return sound.play(0,times);
                                   }
                                 }

       原谅代码的缩进有些恶心,粘贴过来的就这样了。接下来,我们怎么在ts中调用呢?

class SoundMenager {
                             public constructor() {

//加载资源
                                       this.loadMusic();
                                       if (SoundMenager.getIsSound()) {
                                       //静音引导后播放可以控制的背景音乐

setTimeout(() => {this.nullAudio.addEventListener(egret.Event.COMPLETE, function loadOver(event:egret.Event) {window["playsound"](this.nullAudio, false)}, this);}}, 800);
                                            setTimeout(()=>{this._bgm.addEventListener(egret.Event.COMPLETE, function loadOver(event:egret.Event) {this.PlayBgMusic();}, this);},1000);
                                         }
                             }

public PlayBgMusic(){
                                       this._bgm_channel=this._bgm.play(0, -1);
                            }
                           //背景音乐开关
                           public StopBgmusic() {
                                      this._bgm_channel.stop();
                           }

//播放音乐
                             public PlayMusic(audio: egret.Sound, loop: Boolean = false, callback?: any) {
                                              let betGoldChannel: egret.SoundChannel;
                                             if (SoundMenager.getIsSound()) {
                                                        betGoldChannel =audio.play(0,1);
                                                         if (callback) {
                                                          betGoldChannel.addEventListener(egret.Event.SOUND_COMPLETE, () => { callback(); }, this);
                                                         }
                                              }else{
                                                    if(callback){
                                                                   callback();
                                                                  }
                                                      }
                                           }....

        首先在实例化SoundMenager的时候要先加载音乐。等待加载完毕后会先通过我们前面在window环境在添加的一个方法window["playsound"]去播放一段静音去触发音频播放。
为什么不直接播放bgm呢,我发现在window["playsound"]中return出的一个egret.SoundChannel对象不可用,ts这边是undefined。所以就先通过静音触发,再播放可以控制的背景音乐。
												

egret 篇——关于ios环境下微信浏览器的音频自动播放问题的更多相关文章

  1. html5 video微信浏览器视频不能自动播放

    html5 video微信浏览器视频不能自动播放 一.微信浏览器(x5内核): 1.不能自动播放 2.全屏 3.最顶层(z层的最顶层) 二.ios系统解决方案:(无phone手机未测试) <au ...

  2. ios端微信浏览器 音乐不自动播放问题

    <audio id=''music src='' preload autoplay loop> <script src="http://res.wx.qq.com/open ...

  3. ios下微信浏览器如何唤醒app?app已上架应用宝

    android下可以通过在应用宝微下载地址后面加参数&android_schema='应用schema'来实现,ios下如何实现? ios下微信浏览器如何唤醒app?app已上架应用宝 > ...

  4. 解决ios下的微信页面背景音乐无法自动播放问题

    在做各种html5场景页面的时候,插入背景音乐是一个很普遍的需求,我们都知道,ios下的safari是无法自动播放音乐的,以至于现在行程一种认知,ios是没有办法自动播放媒体资源的,这个认知其实是错误 ...

  5. 【bug解决】ios微信浏览器中背景音乐无法播放

    我记得之前在一次项目中,出现过浏览报错: 当时的文档链接如右:[解决]HTML5新标签audio的autoplay自动播放属性失效的解决方案 所以在这次H5的制作中,我使用了iframe来加载音频文件 ...

  6. iphone微信 h5页音乐自动播放

    iphone微信 h5页音乐自动播放: // iphone自动播放 document.addEventListener("WeixinJSBridgeReady", functio ...

  7. html5 audio标签微信部分苹果手机不能自动播放音乐终极解决方案

    html5 audio标签微信部分苹果手机不能自动播放音乐终极解决方案 大家都知道需要在点击时候后 播放 ps:如果点击ajax 回来播放也不行,必须点击立即播放 要背景自动播放只能采取下面方案< ...

  8. 微信的audio无法自动播放的问题

    一.问题 最近做了一个html5的项目,里面涉及到音乐播放,项目要求音乐进入页面就自动播放,于是我就想到了html5的audio标签,将mp3引入进去. 1.在audio标签里引入了autoplay属 ...

  9. 微信h5,背景音乐自动播放

    移动端默认是禁止背景音乐自动播放的,很多需求都需要在页面加载完成的情况下同时出现背景音乐. 既然是微信h5,那么wx.config肯定不陌生,废话不多,直接上代码: html: <audio s ...

随机推荐

  1. 【Neo4j】踩坑大会-Neo4J用中文索引

    正在用的Neo4j是当前最新版:3.1.0,各种踩坑.说一下如何在Neo4j 3.1.0中使用中文索引.选用了IKAnalyzer做分词器. 1. 首先参考文章: https://segmentfau ...

  2. DIV+CSS网页布局常用的一些基础知识

    CSS命名规范 一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/I ...

  3. 如何去掉vue路由中的#

    通过脚手架vue-cli构建的项目,在项目启动后,URL地址上都会带有#,如:http://localhost:8080/#/father 原因:这是因为vue-router 默认hash模式, 使用 ...

  4. 在Linux(centos)下,安装Apache和PHP环境

    1001  ll /opt/lampp/modules/ 1002  history | grep httpd 1003  vim /etc/httpd/conf/httpd.conf 1004  v ...

  5. vue cli3使用webpack4打包优化

    去掉console.log,以及开启gzip const CompressionPlugin = require('compression-webpack-plugin');//引入gzip压缩插件 ...

  6. Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.1.0

    android studio  3.0 出现此问题可能是因为 你的android studio 时脱机状态 无法下载资源 这时候你可以点击左上角分File->Other Settings-> ...

  7. Laravel 迁移检查表是否存在

    Schema::hasTable('TableName'); //检查表释放存在 Schema::hasColumn('tableName', 'columeName'); //检查表是否存在某个字段 ...

  8. 同步锁与GIL的关系

    #_author:来童星#date:2019/12/2# Python的线程在GIL的控制之下,线程之间,对整个python解释器,对python提供的CAPI的访问都是互斥的,# 这可以看作是Pyt ...

  9. 视频云肖长杰:视频AI科技助力短视频生态

    人工智能技术是当今炙手可热的技术领域,它在制造.家居.零售.交通.安防等行业的应用已经是大势所趋.在本月云栖Techday音视频技术沙龙中,阿里云视频云产品专家肖长杰为我们分享了一些AI技术在视频中应 ...

  10. hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对

    题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...