ios audio不能自动播放

  今天做了一个简单的落地页项目,就是类似于手机微信上经常看到的滑动效果。因为公司要求需要自己开发,所以我就用swiper+swiper.animate开发,开发速度很快,只不过最后音乐哪里出现了一点小bug在ios手机上不能自动播放。本着互联网分享精神我将分享给大家怎么解决这个bug。

思路讲解

  因为右上角的音乐图标需要转动,同时音乐播放。我的设计思路是当音乐加载完成后,音乐播放,图标转动(图标默认是不转动的),要不然有些用户网速慢造成音乐加载不完,图标却先转动了,这样也不符合逻辑。图标的转动和不转动切换时使用切换class实现的。这里我就不做过多的讲解了。

Html源码

    <audio id="narrate" src="music/1.mp3" loop="loop" preload="preload"></audio>

js源码

    var music = document.getElementById('music');
    var mnarrate = document.getElementById('narrate');
    mnarrate.oncanplay = function () {  //音乐加载完成执行的函数
        music.className = 'start-music';//图标开始旋转
        mnarrate.play(); //音乐开始播放
    };

   但是上列代码有个弊端,我在浏览器上测试的好好的,安卓也没什么事情。但是到ios上音乐不能播放只能点击下之后才能播放。由于iOS的安全机制问题。不允许audio和video自动播放,即使给play()也是播放过不了。

解决方案1

  使用微信sdk 

  js源码

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    function autoPlay(id) {
        var audio = document.getElementById(id);
        $('#narrate').addClass('start-music');
        audio.play();
        document.addEventListener("WeixinJSBridgeReady", function () {
            audio.play();
        }, false);
        document.addEventListener('YixinJSBridgeReady', function () {
            audio.play();
        }, false);
    }
    autoPlay('narrate');

   注意调用以上方法需要配置wn.config如果不配置调用不了,并且以上代码只有在微信访问的时候才生效,其他环境不生效。

   以上方法可能有些复杂,所以还有一个折中的办法。因为是落地页么。所以用户很有坑能滑动或者点击了屏幕,我们可以利用这一点来实现音乐自动播放。

  js代码如下

    var music = document.getElementById('music');
    var mnarrate = document.getElementById('narrate');
    var html = document.getElementsByTagName('html')[0];
    var oneClick = true; //指允许点击一次变量。
    mnarrate.oncanplay = function () {  //非ios执行函数
        music.className = 'start-music';
        mnarrate.play();
    };
    html.addEventListener('touchstart', function () {//ios执行函数。可与上非los同时使用两者不冲突。
        if (oneClick === false) {
            return
        }
        oneClick = false;
        music.className = 'start-music';
        mnarrate.play();
    }, false);

  以上代码是给html加一个触碰事件,一旦触碰音频开始播放,这一点ios是允许的。因为项目比较小我用原生写的,如果用jQuery的话有一个one方法,这个方法是指执行一次。

  后记:互联网世界之大,高手如云,本着虚心学习的半杯水精神,如果哪位大神有更好的方案可以给我留言。我会及时回复。

  

原文地址:https://www.cnblogs.com/waitforyou/p/6840550.html