uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?

开发环境 版本号 项目创建方式
HBuilder X 3.4.7 -

HarmonyOS 2.0.0真机调试

Device: HUAWEI P30

setInterval(  
function(){  
uni.getLocation({  
    complete() {  
        console.log("完成")  
    },  
    success() {  
        console.log("成功")  
    },  
    fail() {  
        console.log("失败")  
    }  
})  
},1000  
)  

(应用已授权获取定位权限情况下)

  1. 位置信息开启中,关闭后,啥也不输出啦? 导致回调函数不执行的原因可能是: ____

  2. 位置信息关闭中,打开后,会有一段延时才回复正常频次? 是uniapp限频还是鸿蒙有限频?


更多关于uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

有时候,加延时就能解决

更多关于uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


临时解决方案
let system = uni.getSystemInfoSync(); // 获取系统信息
if (system.platform === ‘android’) { // 判断平台
console.log(“安卓”);
var context = plus.android.importClass(“android.content.Context”);
var locationManager = plus.android.importClass(“android.location.LocationManager”);
var main = plus.android.runtimeMainActivity();
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
return false
// uni.showModal({
// title: ‘提示’,
// content: ‘请打开定位服务功能’,
// showCancel: false, // 不显示取消按钮
// success() {
// if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
// var Intent = plus.android.importClass(‘android.content.Intent’);
// var Settings = plus.android.importClass(‘android.provider.Settings’);
// var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
// main.startActivity(intent); // 打开系统设置GPS服务页面
// } else {
// console.log(‘GPS功能已开启’);
// }
// }
// });
} else {
return true
}
} else if (system.platform === ‘ios’) {
console.log(“苹果”);
var cllocationManger = plus.ios.import(“CLLocationManager”);
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
plus.ios.deleteObject(cllocationManger);
if (enable && status != 2) {
return true
} else {
// uni.showModal({
// title: ‘提示’,
// content: ‘请前往设置-隐私-定位服务打开定位服务功能’,
// showCancel: false, // 不显示取消按钮
// success() {
// var UIApplication = plus.ios.import(“UIApplication”);
// var application2 = UIApplication.sharedApplication();
// var NSURL2 = plus.ios.import(“NSURL”);
// // var setting2 = NSURL2.URLWithString(“prefs:root=LOCATION_SERVICES”);
// // var setting2 = NSURL2.URLWithString(“App-Prefs:root=LOCATION_SERVICES”);
// var setting2 = NSURL2.URLWithString(“app-settings:”);
// //var setting2 = NSURL2.URLWithString(“App-Prefs:root=Privacy&path=LOCATION”);
// // var setting2 = NSURL2.URLWithString(“App-Prefs:root=Privacy&path=LOCATION_SERVICES”);
// application2.openURL(setting2);
// plus.ios.deleteObject(setting2);
// plus.ios.deleteObject(NSURL2);
// plus.ios.deleteObject(application2);
// }
// });
return false
}
}

在鸿蒙2.0.0系统上使用uni-app进行真机调试时,如果关闭了位置信息(定位开关),uni.getLocation 的回调函数不执行,这可能是由于以下几个原因:

1. 系统权限限制

  • 鸿蒙系统可能对位置信息的获取有严格的权限控制。如果定位开关关闭,系统可能直接阻止了位置信息的获取,导致 uni.getLocation 无法执行任何回调。
  • 在鸿蒙系统中,某些API可能会在权限不足时直接静默失败,而不触发任何回调。

2. uni-app的兼容性问题

  • uni-app 在鸿蒙系统上的兼容性可能还不够完善,特别是在处理权限相关的API时。如果系统关闭了定位开关,uni.getLocation 可能无法正确处理这种情况,导致回调函数不执行。

3. 回调函数的触发条件

  • uni.getLocation 的回调函数(successfailcomplete)可能只在某些特定条件下触发。如果系统直接阻止了位置信息的获取,可能不会触发 failcomplete 回调。

解决方案

  1. 检查权限

    • 在调用 uni.getLocation 之前,先检查是否有位置信息的权限。可以使用 uni.authorizeuni.getSetting 来检查权限状态。
    • 如果权限被拒绝,可以提示用户打开定位开关。
    uni.getSetting({
        success(res) {
            if (!res.authSetting['scope.userLocation']) {
                uni.showModal({
                    title: '提示',
                    content: '请开启位置信息权限',
                    success(res) {
                        if (res.confirm) {
                            uni.openSetting();
                        }
                    }
                });
            } else {
                uni.getLocation({
                    type: 'wgs84',
                    success(res) {
                        console.log('获取位置成功', res);
                    },
                    fail(err) {
                        console.log('获取位置失败', err);
                    },
                    complete() {
                        console.log('获取位置完成');
                    }
                });
            }
        }
    });
  2. 处理回调不执行的情况

    • 如果 uni.getLocation 的回调函数不执行,可以在调用 uni.getLocation 后设置一个超时机制,确保在回调不执行时能够处理超时情况。
    let timeout = setTimeout(() => {
        console.log('获取位置超时');
        // 处理超时逻辑
    }, 5000); // 5秒超时
    
    uni.getLocation({
        type: 'wgs84',
        success(res) {
            clearTimeout(timeout);
            console.log('获取位置成功', res);
        },
        fail(err) {
            clearTimeout(timeout);
            console.log('获取位置失败', err);
        },
        complete() {
            clearTimeout(timeout);
            console.log('获取位置完成');
        }
    });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!