Capacitor iOS地理定位watchPostion kCLErrorDomain在授予权限时出现错误1

a8jjtwal  于 2023-02-01  发布在  iOS
关注(0)|答案(1)|浏览(275)
    • bounty将在5天后过期**。回答此问题可获得+400声望奖励。BillPull希望引起更多人关注此问题。

我使用的是电容器地理定位的旧版本v1.3.1,最近切换到watchPosition实现,但偶尔会出现位置为空或未定义的情况,即使设备显示的位置图标为应用程序激活。我试图通过回退到较慢的getCurrentPosition函数来解决这个问题,但仍然存在。以前有人遇到过这个问题吗?下面是钩子的要点。
https://gist.github.com/billpull/8bc6e49872cfee29aa5cef193b59c835
useCurrentPosition.ts

const useCurrentPosition = (): GeoWatchPositionResult => {
  const [position, setPosition] = useState<Position>();
  const [watchId, setWatchId] = useState("");
  const [error, setError] = useState();

  const clearWatch = () => {
    if (watchId) {
      clearPosition({ id: watchId });
      setWatchId("");
    }
  };

  const startWatch = async () => {
    if (!watchId) {
      const id = await watchPosition(async (pos: Position | null, err) => {
        if (err) {
          setError(err);
        }
        if (pos) {
          setPosition(pos);
        } else {
          const newPosition = await getCurrentPosition();
          setPosition(newPosition);
        }
      });
      setWatchId(id);
    }
  };

  useEffect(() => {
    startWatch();

    return () => clearWatch();
  }, []);

  return { currentPosition: position, error };
};

即使watchPosition仍然返回位置数据的间隔,我得到一个kCLErrorDomain错误1.这在网上说,这意味着权限被拒绝,但这不是情况下,手机只是在睡眠模式.有没有办法捕捉这个错误具体?我应该清除手表,并重新启动它在这个错误?
编辑:
我做的一个尝试是在手表中使用一个try catch,但我仍然遇到了这个问题。

const useCurrentPosition = (): GeoWatchPositionResult => {
  const [position, setPosition] = useState<Position>();
  const [watchId, setWatchId] = useState("");
  const [error, setError] = useState();

  const clearWatch = () => {
    if (watchId) {
      clearPosition({ id: watchId });
      setWatchId("");
    }
  };

  const startWatch = async () => {
    if (!watchId) {
      const id = await watchPosition(async (pos: Position | null, err) => {
       try {
        if (err) {
          setError(err);
        }
        if (pos) {
          setPosition(pos);
        } else {
          const newPosition = await getCurrentPosition();
          setPosition(newPosition);
        }
       } catch (ex) {
         await requestPermission();
         clearWatch();
         await startWatch();
       }
      });
      setWatchId(id);
    }
  };

  useEffect(() => {
    startWatch();

    return () => clearWatch();
  }, []);

  return { currentPosition: position, error };
};
t98cgbkg

t98cgbkg1#

我想你应该用这个代码段来检查当前位置。

import { Geolocation, Geoposition } from '@ionic-native/geolocation/ngx';

constructor(private geolocation: Geolocation) { }

...

let watch = this.geolocation.watchPosition();
watch.subscribe((data) => {
 // data can be a set of coordinates, or an error (if an error occurred).
 // data.coords.latitude
 // data.coords.longitude
});

还可以使用下面的代码段获取当前位置。

this.geolocation.getCurrentPosition().then((resp) => {
 // resp.coords.latitude
 // resp.coords.longitude
}).catch((error) => {
  console.log('Error getting location', error);
});

如果您想处理权限被拒绝错误,处理权限被拒绝错误的最佳方法是在尝试访问任何位置数据之前先检查应用的权限状态。这可以通过使用Capacitor Permissions API来完成。如果已授予权限,则可以继续使用watchPosition或getCurrentPosition API。如果权限被拒绝,您可以提示用户再次请求权限。

相关问题