javascript - Safari 11 对 HTML5 音频的新自动播放限制

标签 javascript ios safari html5-audio

我想弄清楚 Safari 11(和 iOS)的自动播放限制是如何实现的,我不明白为什么以下内容没有开始播放音频文件:

/*
    Call stack, this doesn't work 💩
*/

const btn = document.createElement('BUTTON')
const textLabel = document.createTextNode('Play')
const audio = new window.Audio()
audio.src = 'https://raw.githubusercontent.com/vnglst/autoplay-tutorial/master/mp3/winamp.mp3'
// audio.controls = true

btn.appendChild(textLabel)
document.getElementById('root').appendChild(btn)
document.getElementById('root').appendChild(audio)

btn.onclick = e => {
  window
    .fetch(`https://api.github.com/repos/vnglst/autoplay-tutorial/contents/mp3/modem-sound.mp3`)
    .then(resp => resp.json())
    .then(json => {
      audio.src = json.download_url
      audio.play()
    })
}
<div id='root'/>

而 Safari 可以处理以下内容:

/*
    Call stack, using a fake Promise. This works 👍
*/

const btn = document.createElement('BUTTON')
const textLabel = document.createTextNode('Play')
const audio = new window.Audio()
audio.src = 'https://raw.githubusercontent.com/vnglst/autoplay-tutorial/master/mp3/modem-sound.mp3'
// audio.controls = true

btn.appendChild(textLabel)
document.getElementById('root').appendChild(btn)
document.getElementById('root').appendChild(audio)

const mockedPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const src = 'https://raw.githubusercontent.com/vnglst/autoplay-tutorial/master/mp3/winamp.mp3'
    return resolve(src)
  }, 500)
})

btn.onclick = (e) => {
  mockedPromise.then(src => {
    audio.src = src
    audio.play()
  })
}
<div id='root'/>

有谁知道 Safari 是如何确定某些内容是否为自动播放的?我不是在寻找解决方法(例如启动和暂停帮助),但我想弄清楚它是如何工作的。

(有关 Safari 新自动播放政策的更多背景信息可在此处找到:https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/)

最佳答案

你需要改变你的算法

用户点击 -> 加载音频信息 -> 更改源 -> 播放

用户点击 -> 更改源 -> 播放

基本上,您需要更改 audio 中的 src 并在用户单击播放按钮后立即开始播放。

iOS 会在存在中间提取时阻止自动播放。

关于javascript - Safari 11 对 HTML5 音频的新自动播放限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44629198/

相关文章:

javascript - 限制第三方脚本 - Google Caja?

javascript - 是否可以跟踪 iPhone 智能横幅的点击率

iphone - 两个 UIWebView,如何设置第二个 webview,以便在单击链接时将它们发送到第一个 webview 进行加载?

objective-c - 如何避免 UIView 触摸手势重叠

javascript - Safari:window.showModalDialog 使所有按键加倍(Safari for Windows)

ipad - 如何在 iPad 中跟踪 HTTP 请求/响应?

视频/音频似乎不适用于 safari?

JavaScript let 绑定(bind)不应添加到全局对象中,浏览器、Node 和 jsfiddle 中的行为不同

javascript - Jquery 克隆每个都没有按预期工作

ios - Apple Pay P2P (iOS 11) - 2017 年秋季是否会有此 SDK?