我的问题的沙盒演示: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

任何帮助表示赞赏。

最佳答案

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

 <audio ref....>

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

07-27 17:51