iOS微信自动播放视频的处理方案
现象:iOS的微信会阻止视频和音频的加载,因此我们设置的autoplay属性是不会生效的,并且在iOS微信上,视频的duration也不会被加载出来。
处理方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| document.addEventListener('WeixinJSBridgeReady', play, false)
function play() { if (isElementInView(videoDom) && autoplay) { const promise = videoDom.play() if (promise != undefined) { promise .then(() => { videoDom.play() }) .catch(error => { videoDom.muted = false; }) } } }
function isElementInView() { const rect = el.getBoundingClientRect() const inView = rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) return inView }
|
这种方式可以成功的两个重要原理:
WeixinJSBridgeReady和用户的真实操作来(touchend、click、doubleclick 或 keydown 事件等标准的事件)触发调用video.play(),才能自动播放视频。
video.play()是一个异步操作,返回一个Promise,并不是一个瞬时的操作。因此,一个src为空的video触发了play,会等到src赋值正确之后再去进行播放。
最终页面的加载流程:
video的Dom结构渲染 ===> 监听weixinJsBridgeReady ===> 触发weixinJsBridgeReady,执行video的play ===> 拿到video的src,进行赋值 ===> 播放