关于H5页面背景音乐播放的问题
2017-08-22 00:00
453 查看
起因:这是一个嵌入到APP里的H5页面,都是一些相册集模板,用户添加照片,放到模板里,可以生成记忆链,然后进行播放。但是由于APP都是去调用自带的浏览器,以及安卓去调用自己生成的浏览器,导致了页面在iOS以及部分安卓上面无法自动播放背景音乐。
一开始接到这个任务的时候感觉没啥,因为这个东西在以前的时候就做过,每太在意,但是这次突然发现不行了,在本地测试的时候iOS不能播放,安卓倒是没问题,到了实体机测试的时候就完蛋了,全军覆没,所以就要去找问题原因以及解决方案。
首先我想到的是,是不是标签问题,以及兼容性等问题,所以我就写了一段js去判定当前音乐是否播放,没有的话就开始播放,这里贴出代码:
$(function(){
var media = document.getElementById('audio');
media.src = "bgm/See You Again.mp3";
media.play();
var flag = true;
$('#music').click(function(){
if(flag == true){
$(this).removeClass('on').addClass('off');
flag = false;
$('#audio').get(0).pause();
}else{
$(this).removeClass('off').addClass('on');
flag = true;
$('#audio').get(0).play();
}
})
})
这里用media.src = "bgm/See You Again.mp3";强制注入路径,是因为iOS对静态标签src这个标签的支持并不是很友好,然后后面就进行了判定,结果发现,部分安卓的问题解决了,但是在iOS上依旧不行。
这时候就尝试着换一下思路试试,为什么产生这种问题,以前就可以,现在怎么不行了。然后第一个想到的就是iOS的版本问题,然后就去网上看了一下,果然是,从iOS9之后就出现这个问题了,也包括安卓的不断升级,为了节省用户的流量,安卓跟ios都默认不允许开发者进行自动播放,除非用户进行页面操作,这也就是说,说白了就是想要播放,就要怼一下这个页面,点击啦,滑动什么的。
但是我偏偏不信,所以就尝试着各种方法,一个是延时播放,就是加一个定时器,1秒或者零点几秒后播放,结果失败,这里就不贴出代码了。第二个就是模拟点击事件,在加载页面的时候,模拟一个click(),结果同上T_T。后面我又尝试了事件绑定等等,结果都不行,果然是干不过人家浏览器呀。
不过也是略有收获,就是在微信浏览器里还是没问题的,那就是监听WeixinJSBridgeReady事件、DOMContentLoaded事件
微信的JS API建立在微信壳浏览器的内置JS对象WeixinJSBridge上,WeixinJSBridge并不是WebView一打开就有了,客户端需要初始化这个对象,当这个对象准备好的时候,客户端会抛出事件"WeixinJSBridgeReady"。
并且发现部分机型,监听DOMContentLoaded和load事件,在回调中也可以播放音乐;
所以,
3ff0
为了保险起见,可以同时监听两个事件,以增强其适用性。
这里贴出代码:
<audio id="car_audio" src="bgm/See You Again.mp3" ></audio>
document.addEventListener('DOMContentLoaded', function () {
function audioAutoPlay() {
var audio = document.getElementById('car_audio');
audio.play();
document.addEventListener("WeixinJSBridgeReady", function () {
audio.play();
}, false);
}
audioAutoPlay();
});
然后,又继续找了找,找到了第二种方案,这里也贴上代码:
<audio id="car_audio" src="bgm/See You Again.mp3" loop></audio>
document.getElementById('car_audio').play();
document.addEventListener("WeixinJSBridgeReady", function () {
WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
document.getElementById('car_audio').play();
});
}, false);
经测试证明,这两种方案完全可行,在微信浏览器里没有问题,在实体机测试,能兼容所有iOS设备以及安卓设备。
尽管这样还是没有满足在所有浏览器以及APP内部自动播放,客户还是不满意,必须要求自动播放。尽管我们心里明白,iOS那边必须要有一个强制事件才能触发,但是客户根本不去想这些。在解决问题的同时,也不断的去找一些大企业以及BAT这样的公司的页面,一是来佐证这个想法,二是可以看看人家怎么做的。事实证明,这个问题都存在,其实这个问题也不能算是bug,只是浏览器的一种保护机制。
最后我们想了一种方案,就是跟iOS以及安卓那边配合开发,由后台提供开始,暂停,播放方法,我们前端这边去传参数和调用,就是把音乐的链接,以及标签的ID,传给后台,后台返回方法名,然后去调用,经过好久的调试,终于能在APP里播放了,同时也证明这种方法是可行的。
最后的代码,因为牵扯的东西略多就不贴出来了,但是思路,以及过程就是这样。最后调页面的时候,由于用到了swipe,就出现了事件穿透这个问题,当时还懵了一下,就赶紧临时抱佛脚去学了一下,等之后可以分享一下。
如果有大神看到这个东西的话,有不对的地方请指出,非常感谢!
一开始接到这个任务的时候感觉没啥,因为这个东西在以前的时候就做过,每太在意,但是这次突然发现不行了,在本地测试的时候iOS不能播放,安卓倒是没问题,到了实体机测试的时候就完蛋了,全军覆没,所以就要去找问题原因以及解决方案。
首先我想到的是,是不是标签问题,以及兼容性等问题,所以我就写了一段js去判定当前音乐是否播放,没有的话就开始播放,这里贴出代码:
$(function(){
var media = document.getElementById('audio');
media.src = "bgm/See You Again.mp3";
media.play();
var flag = true;
$('#music').click(function(){
if(flag == true){
$(this).removeClass('on').addClass('off');
flag = false;
$('#audio').get(0).pause();
}else{
$(this).removeClass('off').addClass('on');
flag = true;
$('#audio').get(0).play();
}
})
})
这里用media.src = "bgm/See You Again.mp3";强制注入路径,是因为iOS对静态标签src这个标签的支持并不是很友好,然后后面就进行了判定,结果发现,部分安卓的问题解决了,但是在iOS上依旧不行。
这时候就尝试着换一下思路试试,为什么产生这种问题,以前就可以,现在怎么不行了。然后第一个想到的就是iOS的版本问题,然后就去网上看了一下,果然是,从iOS9之后就出现这个问题了,也包括安卓的不断升级,为了节省用户的流量,安卓跟ios都默认不允许开发者进行自动播放,除非用户进行页面操作,这也就是说,说白了就是想要播放,就要怼一下这个页面,点击啦,滑动什么的。
但是我偏偏不信,所以就尝试着各种方法,一个是延时播放,就是加一个定时器,1秒或者零点几秒后播放,结果失败,这里就不贴出代码了。第二个就是模拟点击事件,在加载页面的时候,模拟一个click(),结果同上T_T。后面我又尝试了事件绑定等等,结果都不行,果然是干不过人家浏览器呀。
不过也是略有收获,就是在微信浏览器里还是没问题的,那就是监听WeixinJSBridgeReady事件、DOMContentLoaded事件
微信的JS API建立在微信壳浏览器的内置JS对象WeixinJSBridge上,WeixinJSBridge并不是WebView一打开就有了,客户端需要初始化这个对象,当这个对象准备好的时候,客户端会抛出事件"WeixinJSBridgeReady"。
并且发现部分机型,监听DOMContentLoaded和load事件,在回调中也可以播放音乐;
所以,
3ff0
为了保险起见,可以同时监听两个事件,以增强其适用性。
这里贴出代码:
<audio id="car_audio" src="bgm/See You Again.mp3" ></audio>
document.addEventListener('DOMContentLoaded', function () {
function audioAutoPlay() {
var audio = document.getElementById('car_audio');
audio.play();
document.addEventListener("WeixinJSBridgeReady", function () {
audio.play();
}, false);
}
audioAutoPlay();
});
然后,又继续找了找,找到了第二种方案,这里也贴上代码:
<audio id="car_audio" src="bgm/See You Again.mp3" loop></audio>
document.getElementById('car_audio').play();
document.addEventListener("WeixinJSBridgeReady", function () {
WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
document.getElementById('car_audio').play();
});
}, false);
经测试证明,这两种方案完全可行,在微信浏览器里没有问题,在实体机测试,能兼容所有iOS设备以及安卓设备。
尽管这样还是没有满足在所有浏览器以及APP内部自动播放,客户还是不满意,必须要求自动播放。尽管我们心里明白,iOS那边必须要有一个强制事件才能触发,但是客户根本不去想这些。在解决问题的同时,也不断的去找一些大企业以及BAT这样的公司的页面,一是来佐证这个想法,二是可以看看人家怎么做的。事实证明,这个问题都存在,其实这个问题也不能算是bug,只是浏览器的一种保护机制。
最后我们想了一种方案,就是跟iOS以及安卓那边配合开发,由后台提供开始,暂停,播放方法,我们前端这边去传参数和调用,就是把音乐的链接,以及标签的ID,传给后台,后台返回方法名,然后去调用,经过好久的调试,终于能在APP里播放了,同时也证明这种方法是可行的。
最后的代码,因为牵扯的东西略多就不贴出来了,但是思路,以及过程就是这样。最后调页面的时候,由于用到了swipe,就出现了事件穿透这个问题,当时还懵了一下,就赶紧临时抱佛脚去学了一下,等之后可以分享一下。
如果有大神看到这个东西的话,有不对的地方请指出,非常感谢!
相关文章推荐
- webview 加载H5页面音乐不会自动播放问题解决方案
- 关于animation PlayState在ios上不起作用, 以及ios前端页面音乐不能自动播放的问题
- h5页面背景音乐不能自动播放的方案之一
- 一种解决h5页面背景音乐不能自动播放的方案
- 解决ios下的微信页面背景音乐无法自动播放问题
- 解决ios下的微信页面背景音乐无法自动播放问题
- WebView加载h5页面播放音乐或视频 返回,按锁屏键,按home键 播放不停止问题
- 同一页面不同背景音乐切换播放
- 解决微信页面中ios音乐不能自动播放问题
- 关于背景图片固定 不会随着页面滚动而变化,及定位注意问题
- 关于苹果耳机或者其他耳机在电脑上不能正常播放音乐问题解决
- 音乐在不同HTML页面的连续播放问题
- 关于移动端音乐没有自动播放的问题
- 关于Flash网站背景音乐问题
- 解决ios下的微信打开的页面背景音乐无法自动播放
- 关于java播放wav格式音乐问题及代码解释
- CocoStudio开发之背景音乐播放两秒就没声音问题
- 关于实现背景为自动循环播放、无声的、宽度自适应视频的相关问题
- H5页面音频自动播放问题
- 解决页面退出 WebView 继续播放视频音乐的问题