Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Undefined不是对象(正在评估';navigator.permissions.query';)_Javascript_Ios_Iphone_Reactjs_Permissions - Fatal编程技术网

Javascript Undefined不是对象(正在评估';navigator.permissions.query';)

Javascript Undefined不是对象(正在评估';navigator.permissions.query';),javascript,ios,iphone,reactjs,permissions,Javascript,Ios,Iphone,Reactjs,Permissions,当我试图在iPhone7上访问我的网站时,我遇到了这个错误,它有一个白色的银行屏幕(主屏幕加载正常,但我在点击某个东西后在网络屏幕上看到了这个错误) 我想这就是它所说的: useEffect(() => { navigator.permissions .query({ name: "microphone" }) .then((permissionStatus) => { setMicrophonePermissionGranted(

当我试图在iPhone7上访问我的网站时,我遇到了这个错误,它有一个白色的银行屏幕(主屏幕加载正常,但我在点击某个东西后在网络屏幕上看到了这个错误)

我想这就是它所说的:

  useEffect(() => {
    navigator.permissions
      .query({ name: "microphone" })
      .then((permissionStatus) => {
        setMicrophonePermissionGranted(permissionStatus.state === "granted");

        permissionStatus.onchange = function () {
          setMicrophonePermissionGranted(this.state === "granted");
        };
      });

    navigator.permissions.query({ name: "camera" }).then((permissionStatus) => {
      setCameraPermissionGranted(permissionStatus.state === "granted");

      permissionStatus.onchange = function () {
        setCameraPermissionGranted(this.state === "granted");
      };
    });
  }, []);

如何修复此问题?

我试图通过iOs设备和Facebook浏览器检查麦克风和摄像头的权限,我想这会导致整个过程失败,因为这些环境中不存在。
一旦我将该查询移动到仅在非移动设备时加载的组件,我的错误就得到修复。

您需要检查权限API的可用性,如果不可用,则检查标准API

以下是位置示例:

if(navigator.permissions&&navigator.permissions.query){
//请先尝试权限API
navigator.permissions.query({name:'geolocation'})。然后(函数(结果){
//将返回[“已授予”、“提示”、“拒绝”]
const permission=result.state;
如果(权限==‘已授予’| |权限===‘提示’){
_onGetCurrentLocation();
}
});
}else if(navigator.geolocation){
//然后是导航API
_onGetCurrentLocation();
}
函数_onGetCurrentLocation(){
navigator.geolocation.getCurrentPosition(函数(位置){
//模拟地图拼接结构
常量标记={
纬度:位置坐标纬度,
lng:position.coords.longitude
};
})
}
Permissions.query()
自2021年6月起被标记为试验性功能

从今天起,这就意味着您需要实现两个UI/流;一个能够支持花哨的流来告诉用户如何继续,另一个更标准,使用
try/catch
块。类似于:

useEffect(() => {
    requestPermissions();
}, []);

const requestPermissions = async () => {
    try {
        handlePermissionsGranted();
        const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
        startRecording();
    } catch {
        ...
    }
};

const handlePermissionsGranted = async () => {
    if (navigator.permissions && navigator.permissions.query) {
        const permissions = await navigator.permissions.query({name: 'microphone'});
        permissions.onchange = () => {
          setMicrophonePermissionGranted(permissions === 'granted');
        };
    } 
};

const startRecording = async () => {
    try {
        const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
        const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm' });
        ...
    } catch {
        ... << if you reach this catch means that either the browser does not support webrtc or that the user didn't grant permissions
    }
};
useffect(()=>{
请求权限();
}, []);
const requestPermissions=async()=>{
试一试{
handlePermissionsGranted();
const stream=wait navigator.mediaDevices.getUserMedia({audio:true,video:true});
startRecording();
}抓住{
...
}
};
const handlePermissionsGranted=async()=>{
if(navigator.permissions&&navigator.permissions.query){
const permissions=wait navigator.permissions.query({name:'microscopy'});
permissions.onchange=()=>{
SetMicrophonePermissionPrograted(权限=='Prograted');
};
} 
};
const startRecording=async()=>{
试一试{
const stream=await navigator.mediaDevices.getUserMedia({audio:true,video:false});
constMediaRecorder=newMediaRecorder(流,{mimeType:'audio/webm'});
...
}抓住{
...