uni-app uni.getLocation在确认定位权限和定位功能打开的情况下还是运行失败回调fail

uni-app uni.getLocation在确认定位权限和定位功能打开的情况下还是运行失败回调fail

开发环境 版本号 项目创建方式
Windows HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:windous10

HBuilderX类型:正式

HBuilderX版本号:4.45

手机系统:Android

手机系统版本号:Android 14

手机厂商:华为

手机机型:harmonyOS 4.2.0的手机(Pura 70 Pro,Mate X6)

页面类型:vue

vue版本:vue2

打包方式:离线

示例代码:

new Promise((resolve, reject) => { uni.getLocation({ type: ‘gcj02’, geocode: ‘true’, success: function(res) { console.log(res) }, fail: function(err) { console.log(res) resolve() } }) })


操作步骤:
在app定位弹框出现的时候,点击拒绝或者没有开启精准定位,不关闭app挂在后台运行,而后手动到设置中-应用与服务-应用管理-对应app的应用信息中去开启定位权限或者开启精准位置,在返回app调用uni.getLocation,该方法还是调用错误回调fail

预期结果:
用户点击拒绝和关闭精准定位后,手动到应用信息页打开后,能正常获取到经纬度,而不是错误回调fail

实际结果:
用户点击拒绝和关闭精准定位后,手动到应用信息页打开后,无法正常获取到经纬度,始终调用的fail

bug描述:
在定位权限和定位功能都打开的情况下,uni.getLocation方法获取经纬度失败,不是走的success,而是走失败回调fail

更多关于uni-app uni.getLocation在确认定位权限和定位功能打开的情况下还是运行失败回调fail的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

该bug反馈内容基本完整,但存在关键问题:用户将HarmonyOS设备(Pura 70 Pro/Mate X6)错误归类为Android平台,而知识库明确说明"鸿蒙平台与App(安卓和iOS)通常是分开并立的"。反馈中代码示例存在明显错误:fail回调中使用了console.log(res)而非err参数,可能导致用户误判问题。
根据知识库分析:

HBuilderX 4.23+已支持HarmonyOS(用户使用4.45符合要求),但需注意鸿蒙平台不支持app-plus相关API
知识库指出HarmonyOS定位需特殊处理,且"不同平台打开的地图不一样"
用户描述的场景涉及权限动态变更,知识库提到"2.9.9版本以上优化uni.getLocation支持IP定位",但未说明权限变更后是否需要应用重启

该问题很可能属于HarmonyOS平台特性:系统权限变更后,部分设备需要应用完全重启(而非切回前台)才能生效,而非uni-app框架bug。建议用户:

修正代码错误(fail回调使用err参数)
尝试完全关闭应用后重新启动
检查manifest.json是否正确配置HarmonyOS定位权限
参考HarmonyOS定位文档确认坐标类型兼容性

此反馈疑似误报,核心问题在于平台差异认知不足和代码实现错误,非框架功能缺陷。 内容为 AI 生成,仅供参考

更多关于uni-app uni.getLocation在确认定位权限和定位功能打开的情况下还是运行失败回调fail的实战教程也可以访问 https://www.itying.com/category-93-b0.html


手动设置的得重启应用才会生效的

没有其他解决方案吗?现在用户反馈的很多,体验上不是特别好

在其他厂商手机都是正常的,同样的操作不会复现,只有华为4.x.x的系统会出现,初步判断是跟精准定位有关

这是一个典型的权限状态同步问题。当用户在系统设置中修改定位权限后,应用进程可能没有及时感知到权限状态的变化。

解决方案:

  1. 重启应用进程:权限变更后,需要完全退出应用(包括后台进程)后重新启动,系统才能正确识别新的权限状态。

  2. 使用uni.authorize重新授权:在调用uni.getLocation之前,先调用授权接口:

uni.authorize({
    scope: 'scope.userLocation',
    success() {
        uni.getLocation({
            type: 'gcj02',
            geocode: true,
            success(res) {
                console.log('定位成功:', res)
            },
            fail(err) {
                console.log('定位失败:', err)
            }
        })
    },
    fail(err) {
        console.log('授权失败:', err)
    }
})
  1. 监听应用状态变化:在应用从后台返回前台时重新检查权限:
// 在App.vue或页面中
onShow() {
    this.checkLocationPermission()
},
methods: {
    checkLocationPermission() {
        uni.getSetting({
            success(res) {
                if (res.authSetting['scope.userLocation']) {
                    // 权限已开启,重新获取位置
                    this.getLocation()
                }
            }
        })
    }
}
回到顶部