uni-app 定位获取失败

uni-app 定位获取失败

开发环境 版本号 项目创建方式
Windows 教育版1809 HBuilderX
3.1.22

操作步骤:

1)首次进入APP,APP发起定位授权,选择【拒绝不再询问】 2)程序调取打开【设置】进入【应用详情】,进行【手动授权】允许APP获取定位信息 3)返回APP后,手动触发【获取定位】API,显示报错信息【获取定位权限失败】,实际上已经允许【获取定位】 4)调取【重新打开】方法可以解决这个问题,但在某些表单页面需要定位就中断了表单填写

预期结果:

不需要【重新打开】也可以获取定位信息

实际结果:

bug描述:

1)首次进入APP,APP发起定位授权,选择【拒绝不再询问】 2)程序调取打开【设置】进入【应用详情】,进行【手动授权】允许APP获取定位信息 3)返回APP后,手动触发【获取定位】API,显示报错信息【获取定位权限失败】,实际上已经允许【获取定位】 4)调取【重新打开】方法可以解决这个问题,但在某些表单页面需要定位就中断了表单填写


更多关于uni-app 定位获取失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

更多关于uni-app 定位获取失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的Android权限管理机制导致的定位状态同步问题。当用户在系统设置中手动授权后,应用进程并未实时感知到权限状态变化,导致uni.getLocation()调用时仍使用旧的权限状态判断。

核心原因: Android系统在权限变更后,需要应用重新创建或通过特定方式刷新权限状态缓存。uni-app底层调用系统定位API时,获取的是应用启动时缓存的权限状态。

解决方案

  1. 权限状态监听方案(推荐): 在返回APP时,通过uni.onNeedPermissionAuthorization监听权限变化,或使用uni.getSetting检查权限状态更新:

    // 返回APP时检查权限状态
    onShow() {
      uni.getSetting({
        success: (res) => {
          if (res.authSetting['scope.userLocation']) {
            // 权限已授权,执行定位
            this.getLocation()
          }
        }
      })
    }
    
  2. 延迟获取方案: 在从系统设置返回后,添加短暂延迟再调用定位接口:

    setTimeout(() => {
      uni.getLocation({
        success: (res) => {
          // 定位成功
        }
      })
    }, 300)
回到顶部