必须用原生locationmanager.isproviderenabled(gps_provider)检测安卓gps开关,ios则需调用cllocationmanager.locationservicesenabled(),二者缺一不可;uni.getsysteminfosync().locationenabled在两平台均不可靠。

不能只看 uni.getSystemInfoSync().locationEnabled —— 这个值在 iOS 上永远是 true,安卓某些 ROM 也返回缓存旧值,完全不可信。
安卓端必须用原生 LocationManager 检查 GPS_PROVIDER
系统级 GPS 开关状态,得靠 Android 原生 LocationManager.isProviderEnabled() 判断,uni.getLocation 或 uni.getSetting 都不反映这个。
-
plus.android.importClass("android.location.LocationManager")导入类 - 通过
main.getSystemService(context.LOCATION_SERVICE)获取服务实例 - 调用
mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER),返回true才代表系统 GPS 已开 - 注意:不能用
NETWORK_PROVIDER替代,它只管基站/WiFi 定位,不是 GPS - Android 12+ 仍可用该方式检测开关,和权限声明(
ACCESS_FINE_LOCATION)无关
iOS 端必须调用 CLLocationManager.locationServicesEnabled()
iOS 没有“GPS 开关”概念,但有全局定位服务总开关,必须用原生 CLLocationManager.locationServicesEnabled() 查,uni.getSystemInfo 的 locationEnabled 字段在此平台完全失效。
-
plus.ios.import("CLLocationManager")导入管理器 - 调用
cllocationManger.locationServicesEnabled(),返回false即系统级定位已关闭 - 注意:此调用和授权状态
authorizationStatus()是两件事,必须分开判断 - 调用后务必用
plus.ios.deleteObject(cllocationManger)释放对象,否则内存泄漏
跳转系统设置页的 URL Scheme 必须分平台写死
用户拒绝后引导跳转,不是所有 URL 都能生效;iOS 尤其敏感,错一个字符就打不开设置页。
- 安卓:用
Settings.ACTION_LOCATION_SOURCE_SETTINGS,兼容所有版本 - iOS:
NSURL.URLWithString("App-Prefs:root=Privacy&path=LOCATION")在 iOS 16+ 已失效 - 实测有效的是:
NSURL.URLWithString("app-settings:")(iOS 15~17 全支持) - 不要用
prefs:root=或App-Prefs:root=LOCATION_SERVICES,这些在 iOS 14 后被苹果废弃 - 跳转前必须确保
plus.ready已触发,否则plus.ios对象未初始化
最常被忽略的一点:系统 GPS 关闭时,uni.getLocation 会进 fail 回调,但错误码可能是 "getLocation:fail auth deny"(误判为用户拒绝),也可能是静默超时。真正可靠的依据只有原生 API 的两个返回值——locationServicesEnabled() 和 isProviderEnabled(GPS_PROVIDER),缺一不可。











