iOS端expo-location定位不准确及AVCaptureSession异常问题求助
iOS端expo-location定位不准确及AVCaptureSession异常问题求助
大家好,我正在开发一个基于Expo的活动签到APP,核心功能是用expo-camera扫描QR码,同时通过expo-location获取用户当前位置来完成签到提交。目前在iOS端遇到两个问题,想请教下社区的大佬们帮忙分析排查:
问题1:部分iOS用户定位严重不准确
- 部分iOS用户反馈,扫码签到时获取的位置和实际位置偏差超过1km,但也有不少iOS用户扫码和定位都完全正常,安卓端暂时没有收到类似反馈。
- 我在
app.json中配置了expo-location的权限,代码里获取位置时指定了高精度模式,但还是出现了偏差问题。
问题2:Sentry捕获到相机相关异常,但不影响部分用户使用
- 从Sentry中捕获到了这样的异常:
NSGenericException *** -[AVCaptureSession startRunning] startRunning may not be called between calls to beginConfiguration and commitConfiguration
- 奇怪的是,有些用户扫码功能完全正常,定位也准确,不确定这个异常和定位问题有没有关联,或者是不是Expo Camera内部的潜在问题?
相关配置与代码片段
app.json 插件配置
"plugins": [ ... [ "expo-camera", { "cameraPermission": "This allows you to capture a photo using your camera to update your profile picture and scan an event QR code.", "microphonePermission": "Allow $(PRODUCT_NAME) to access your microphone", "recordAudioAndroid": true } ], [ "expo-location", { "locationAlwaysAndWhenInUsePermission": "Allow $(PRODUCT_NAME) to use your location." } ], ... ]
scanner.tsx 关键代码
权限请求逻辑
export default function Scanner() { const [cameraPermission, requestCameraPermission] = useCameraPermissions() const [locationPermission, setLocationPermission] = useState<Location.LocationPermissionResponse>() useEffect(() => { askPermission() }, []) const askLocationPermission = async () => { return await Location.requestForegroundPermissionsAsync() } const askPermission = async () => { const [cameraPerm, locationPerm] = await Promise.all([ requestCameraPermission(), askLocationPermission(), ]) setLocationPermission(locationPerm) // 权限未授予时的提示逻辑... } // ...其他状态定义 }
位置获取函数
const getCurrentLocation = async () => { try { let location = await Location.getCurrentPositionAsync({ accuracy: Location.LocationAccuracy.High, }) return location } catch (error) { return null } }
扫码与签到处理
const handleOnScan = async (scanningResult: BarcodeScanningResult) => { if (isScanning) return setIsScanning(true) const codeValue = scanningResult.data try { const parsedURL = new URL(codeValue) if (parsedURL.hostname !== 'myapp.app.link') { // 无效QR提示 } else { const { data: linkData } = await Api.postRequest('read-deep-link', { link: codeValue }) if (linkData?.event_id && linkData?.type === 'mark-attend-event') { await handleMarkAttendance(linkData.event_id) } // ...其他逻辑 } } catch (err) { // 异常处理 } finally { setTimeout(() => setIsScanning(false), 1000) } } const handleMarkAttendance = async (eventId: any) => { const location = await getCurrentLocation() if (!location) { // 未获取到位置提示 return } const postData = { eventId, deviceId: oneSignalSubscription.current?.id, deviceType: Platform.OS, geolocation: [location.coords.latitude, location.coords.longitude], } // 提交签到请求... }
我的疑问
- 定位不准确的问题,是不是权限配置或者位置获取的参数存在疏漏?比如iOS上
LocationAccuracy.High是否需要额外的配置,或者权限类型选择是否合适?有没有可能是用户设备的定位模式导致,但我已经请求了AlwaysAndWhenInUse权限? - Sentry捕获的
AVCaptureSession异常,会不会间接影响定位功能?还是说这是Expo Camera内部的已知问题,不需要我额外处理?
麻烦大家帮忙看看,谢谢啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

