关于html5 audio 标签在ios系统上不能正常自动播放的解决办法

Posted CQIQIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于html5 audio 标签在ios系统上不能正常自动播放的解决办法相关的知识,希望对你有一定的参考价值。

由于 ios Safari 限制不允许 audio autoplay, 必须用户主动交互(例如 click)后才能播放 audio, 因此我们通过一个用户交互事件来主动 play 一下 audio.

这个坑相信大家都已经踩过了, 在 iOS 9 没出现以前, 这样的 hack 方案还是妥妥的.
但 iOS 9 出现后, 发现这个方案"失效"了.

没有办法, 看来是时候升级一下 hack 方案了, 于是仔细看了下 audio 的事件.

对于能够自动播放时事件的顺序如下
loadstart -> loadedmetadata -> loadeddata -> canplay -> play -> playing

对于不能自动播放时触发的事件因系统版本不同而不同
* iPhone5 iOS 7.0.6 loadstart
* iPhone6s iOS 9.1 loadstart -> loadedmetadata -> loadeddata -> canplay

最终发现相比原来的 hack 方案, 对于 iOS 9 还需要额外的 load 一下, 否则直接 play 不能让 audio 开始播放.
    audioEl.load(); // iOS 9
    audioEl.play(); // iOS 7/8 仅需要 play 一下

技术分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>Fake auto play html audio in iOS Safari the right way</title>
</head>
<body>
    <h1>在 iOS Safari 中假装自动播放 HTML5 audio(音乐) 的正确方式</h1>
    <p>核心原理: 通过一个用户交互事件来主动 play 一下 audio</p>
    <br>
    <br>
    <br>
    <audio id="bgmusic" autoplay preload loop controls></audio>
    <script>
    (function() {
        function log(info) {
            console.log(info);
            // alert(info);
        }
        function forceSafariPlayAudio() {
            audioEl.load(); // iOS 9   还需要额外的 load 一下, 否则直接 play 无效
            audioEl.play(); // iOS 7/8 仅需要 play 一下
        }

        var audioEl = document.getElementById(‘bgmusic‘);

        // 可以自动播放时正确的事件顺序是
        // loadstart
        // loadedmetadata
        // loadeddata
        // canplay
        // play
        // playing
        // 
        // 不能自动播放时触发的事件是
        // iPhone5  iOS 7.0.6 loadstart
        // iPhone6s iOS 9.1   loadstart -> loadedmetadata -> loadeddata -> canplay
        audioEl.addEventListener(‘loadstart‘, function() {
            log(‘loadstart‘);
        }, false);
        audioEl.addEventListener(‘loadeddata‘, function() {
            log(‘loadeddata‘);
        }, false);
        audioEl.addEventListener(‘loadedmetadata‘, function() {
            log(‘loadedmetadata‘);
        }, false);
        audioEl.addEventListener(‘canplay‘, function() {
            log(‘canplay‘);
        }, false);
        audioEl.addEventListener(‘play‘, function() {
            log(‘play‘);
            // 当 audio 能够播放后, 移除这个事件
            window.removeEventListener(‘touchstart‘, forceSafariPlayAudio, false);
        }, false);
        audioEl.addEventListener(‘playing‘, function() {
            log(‘playing‘);
        }, false);
        audioEl.addEventListener(‘pause‘, function() {
            log(‘pause‘);
        }, false);

        // 由于 iOS Safari 限制不允许 audio autoplay, 必须用户主动交互(例如 click)后才能播放 audio,
        // 因此我们通过一个用户交互事件来主动 play 一下 audio.
        window.addEventListener(‘touchstart‘, forceSafariPlayAudio, false);

        audioEl.src = ‘http://www.w3school.com.cn/i/song.mp3‘;
    })();
    </script>
</body>
</html>
















以上是关于关于html5 audio 标签在ios系统上不能正常自动播放的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上自动播放 HTML5 <video> 和 <audio> 标签?

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

CEF3 HTML5 audio标签为什么不能播放mp3格式的音频文件

为啥 HTML5 音频标签在 iOS 上显示错误?

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

移动浏览器中 html5 <audio> 标签的功能障碍