uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?
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
)
(应用已授权获取定位权限情况下)
-
位置信息开启中,关闭后,啥也不输出啦? 导致回调函数不执行的原因可能是: ____
-
位置信息关闭中,打开后,会有一段延时才回复正常频次? 是uniapp限频还是鸿蒙有限频?
更多关于uni-app在鸿蒙2.0.0系统真机调试时,关闭位置信息后(定位开关),uni.getLocation的任意一个回调函数都不执行?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
有时候,加延时就能解决
更多关于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
的回调函数(success
、fail
、complete
)可能只在某些特定条件下触发。如果系统直接阻止了位置信息的获取,可能不会触发fail
或complete
回调。
解决方案
-
检查权限
- 在调用
uni.getLocation
之前,先检查是否有位置信息的权限。可以使用uni.authorize
或uni.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('获取位置完成'); } }); } } });
- 在调用
-
处理回调不执行的情况
- 如果
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('获取位置完成'); } });
- 如果