You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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],
  }
  // 提交签到请求...
}

我的疑问

  1. 定位不准确的问题,是不是权限配置或者位置获取的参数存在疏漏?比如iOS上LocationAccuracy.High是否需要额外的配置,或者权限类型选择是否合适?有没有可能是用户设备的定位模式导致,但我已经请求了AlwaysAndWhenInUse权限?
  2. Sentry捕获的AVCaptureSession异常,会不会间接影响定位功能?还是说这是Expo Camera内部的已知问题,不需要我额外处理?

麻烦大家帮忙看看,谢谢啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:04:34