前段时间做了一个摇奖功能,监测摇动并播放一个“唰 唰”的声音,功能都已实现;突然被告知在安卓上依旧正常,但是在IOS上没有声音了。
按照程序员的思维,我的第一个反应是:
“你是不是静音了?” —— " 并不是"
“那是谁改我代码了?”—— "..."
好吧,查看服务器,JS文件的最后修改时间是两个月前。那就是说没人改动。
(急于寻找答案的同学可以直接翻到最后—_—)开始排查原因,了解到:
在safri on ios里面明确指出等待用户的交互动作后才能播放media,也就是说如果你没有得到用户的action就播放的话就会被safri拦截
也就是说,音频无法通过代码触发音频的播放,必须通过用户点击等交互动作来触发?
(还是奇怪我之前怎么没问题?因为微信或者IOS版本更新?)
先贴我的代码:
HTML :
<audio id="shakeMusic" src="../sprize/sound/shake.mp3" class="media-audio" preload>您的浏览器不支持音频播放标签。</audio>
JS :
var shakeMusic = document.getElementById("shakeMusic");
window.addEventListener('shake', shakeEventDidOccur, false);
function shakeEventDidOccur(obj) {
shakeMusic.play();
}
首先,测试上面提过的 —— “ 等待用户的交互动作后才能播放media。”
新建一个元素,并用点击事件触发shakeMusic.play(),如:
<div id="playShake" onclick="shakeMusic.play();"></div>
测试发现播放正常,也就是说:在IOS里并没有把自定义事件shake当成交互动作...
点击后,再摇动,发现摇动也会有声音!那就是说:在点击之前audio是没有被加载的?
那么在获得shakeMusic后,加载一下音频。如:
var shakeMusic = document.getElementById("shakeMusic");
// 微信提供的事件,微信浏览器内部初始化完成后
document.addEventListener("WeixinJSBridgeReady", function () {
shakeMusic.load();
}, false);
测试OK,Bug修复完毕!!!
贴一下完整代码:
HTML :
<audio id="shakeMusic" src="../sprize/sound/shake.mp3" class="media-audio" preload>您的浏览器不支持音频播放标签。</audio>
JS :
var shakeMusic = document.getElementById("shakeMusic");
// 微信提供的事件,微信浏览器内部初始化完成后
document.addEventListener("WeixinJSBridgeReady", function () {
shakeMusic.load();
}, false);// 监听手机摇动
window.addEventListener('shake', shakeEventDidOccur, false);function shakeEventDidOccur(obj) {
shakeMusic.play();
}
网友评论
<audio id='ado-shake' src='/resources/plugins/shake/shake.mp3' preload style="width: 0; height: 0px;"></audio>
<audio id='ado-shaked' src='/resources/plugins/shake/shaked.mp3' preload style="width: 0; height: 0px;"></audio>
</div>
var adoShake = document.getElementById('ado-shake');
var adoShaked = document.getElementById('ado-shaked');
var btnShake = document.getElementById('btn-start');
document.addEventListener("WeixinJSBridgeReady", function() {
adoShake.load();
adoShaked.load();
}, false);
btnShake.addEventListener('click', function(e) {
$('.shake').addClass('shaking');
adoShake.play();
});
adoShake.addEventListener('ended', function() {
$('.shake').removeClass('shaking');
adoShaked.play();
}, false);
var myShakeEvent = new Shake({
threshold : 15
});
myShakeEvent.start();
window.addEventListener('shake', shakeEventDidOccur, false);
function shakeEventDidOccur() {
$('.shake').addClass('shaking');
adoShake.play();
}
};