页面加载完自动播放一段提示音,iOS 上直接失败,play() 返回的 Promise 报 NotAllowedError,安卓 Chrome 却能响。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
btn.addEventListener('click', () => {
audio.play().catch(e => console.warn('播放被拒', e.name));
});
iOS 的音频播放必须由用户手势触发,脚本在 load 事件里调用一律被拒。页面也没有可见的播放开关,用户根本不知道这里有音频。这一点先确认清楚,后面就不用反复试。
「iOS 音频手势」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,把首次播放绑定到按钮点击 不要自动播;在点击回调里同步调用 play 并 catch 错误;记住播放状态 翻页后由用户手势恢复。
改完照着核一遍,iOS 上点一次播放按钮音频正常响起,刷新后再点仍能播放。
