【问题标题】:React - play audio onClick is causing an "Unhandled Rejection (NotAllowedError)" on iOS devices?React - 在 iOS 设备上播放音频 onClick 导致“未处理的拒绝(NotAllowedError)”?
【发布时间】:2019-10-22 03:38:14
【问题描述】:

我的问题的沙盒演示:https://codesandbox.io/s/jolly-fermat-j23w9

我正在尝试在我的 React 网站上实现一个功能,用户点击一个元素,音频就会播放。

在桌面上,这工作正常。但是在 iOS 设备上,我遇到了“未处理的拒绝 (NotAllowedError)”。此错误通常是由 iOS 设备上的自动播放媒体引起的。但是,在这种情况下,用户必须单击该元素才能开始播放音频,因此不应发生此错误。

我的怀疑是,由于组件在状态更改时重新呈现,React 不知道用户必须与站点交互才能触发音频。

这是基本代码:

// audio playing function, found on this stackoverflow question:
// https://stackoverflow.com/questions/47686345/playing-sound-in-reactjs
const useAudio = url => {
  const [audio] = useState(new Audio(url));
  const [playing, setPlaying] = useState(false);

  const toggle = () => setPlaying(!playing);

  useEffect(() => {
    playing ? audio.play() : audio.pause();
  }, [playing]);

  return [playing, toggle];
};

// url of audio is passed in as prop from App.js
const PlayAudio = ({ url }) => {
  const [playing, toggle] = useAudio(url);

  return (
    <>
      <PlayButton onClick={toggle}>{playing ? "Pause" : "Play"}</PlayButton>
    </>
  );
};

在使用 Safari、Chrome 和 Firefox 浏览器的 iPhone 上测试。

再次,可以在这里找到完整的工作演示,您需要在 iOS 设备上查看错误:https://codesandbox.io/s/jolly-fermat-j23w9

感谢任何帮助。

【问题讨论】:

  • 在 Android 设备和 Chrome 77.03865.116 上测试过,并且可以播放。
  • 但是您可以尝试使用音频参考的另一种方式:
  • 谢谢@Oleg。在一些简短的测试中,我可以确认使用 refs 将避免我原来问题中的错误。虽然这在功能上解决了我的问题,但我仍然会留下这个问题,因为我仍然想知道这个错误发生的确切原因,而且因为我已经在我的项目中使用了大量的 refs,而 React 文档建议不要过度使用它们。
  • 我还将编辑问题以澄清这似乎是严格的 iOS 问题,而不是移动问题。感谢您进行测试。
  • 你能在IOS中试试这个示例吗:codesandbox.io/s/lpzr84p39z

标签: javascript ios reactjs audio


【解决方案1】:

使用您的代码创建示例但另一种方法:

 <audio ref....> 

https://codesandbox.io/s/elegant-black-c0jr8

【讨论】:

  • 所以您的示例适用于我的 iOS 设备。但是,在您创建示例之前,我尝试按照您的建议使用 refs 重新创建示例,有趣的是,我仍然在 iPhone 上遇到上述错误。你可以在这里看到:codesandbox.io/s/winter-voice-kze0f 所以看来问题不一定是使用refshooks,而是我实现 refs 的任何方式与你的方式。这可能解释了我最初问题中问题的根源,因为您的示例有效,但我的示例无效,尽管它们都使用了 refs。
  • 我还测试了沙箱的一个分支,唯一的区别是 src 是在 &lt;audio&gt; 标记中定义的,而不是在 useEffect 中定义的,(所以我实际上可以暂停和恢复音频而不是每次都从头开始)并且错误再次出现。
  • 没看懂,有解决办法吗?
  • 功能上,是的。虽然我仍然不确定为什么会出现错误,尤其是在我上面评论过的沙箱中。您的解决方案的一个缺点是音频每次都会重新启动,并且不会暂停。感谢您对 Oleg 的所有帮助。
  • 有趣的是,您更新的答案使我的 iPhone 上弹出错误:(
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2018-03-30
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多