getUserMedia API 不适用于 React 中的 iOS Safari

IT技术 html reactjs typescript safari
2021-05-10 10:25:58

我正在尝试通过getUserMedia在我的 React 应用程序中实现API来访问 iOS 上的相机

我已经成功实现了一个可以在 Chrome 上呈现并正常工作的组件,但是当我mylocalIP:3000在 iOS Safari 上导航时它似乎不起作用我将非常感谢任何有关我的代码可能出错的地方与 iOS 不兼容的指示。StackBlitz 链接到代码

const Video: React.FC = (props) => {
    useEffect(() => {
        start()
    })

    const constraints = {
        audio: false,
        video: true
    };

    async function start() {
        const stream = await navigator.mediaDevices.getUserMedia(constraints)
        const video = document.getElementById('video') as HTMLVideoElement;
        video.setAttribute("playsinline", "true");
        video.setAttribute("controls", "true");
        video.srcObject = stream;
    }

    return (
        <video id='video' autoPlay playsInline></video>
    )
}

export default Video
1个回答

结果发现 getUserMedia需要在 HTTPS 环境中执行

Create React App您需要通过将start脚本更改package.json"HTTPS=true react-scripts start"

iOS 设备会警告 CRA 的签名无效,但是如果您继续访问该站点,它会提示您访问网络摄像头。

更新:在我所有的 CRA 项目中,我使用mkcert来安装证书颁发机构,然后生成证书供 webpack 在 CRA 中编译站点时使用。

在 CRA 项目根目录中:

mkcert -install

mkdir .cert && cd $_ && mkcert localhost

printf "\nSSL_CRT_FILE=.cert/localhost.pem\nSSL_KEY_FILE=.cert/localhost-key.pem\nHTTPS=true" >> ../.env

或者,如果您不喜欢执行您不理解的随机命令:

  1. .cert/在项目根目录下创建文件夹
  2. 将目录更改为.cert/终端中文件夹
  3. mkcert localhost
  4. .env在您的项目根目录中创建一个文件
  5. 在此文件中添加以下内容:
SSL_CRT_FILE=.cert/localhost.pem
SSL_KEY_FILE=.cert/localhost-key.pem
HTTPS=true