根本原因是微信对定位API限制更严:必须用户主动触发、manifest.json中显式声明requiredPrivateInfos、pages.json配置permission字段,并在调用前执行uni.authorize申请权限,避免onLoad自动调用导致iOS静默失败。

uni-app 调用 uni.getLocation 获取定位时为什么总失败?
不是权限没开,就是返回 getLocation:fail system error 或空坐标,尤其在 iOS 微信小程序里高频出现。根本原因在于微信对定位 API 的限制比原生更严:必须用户主动触发(比如点击按钮),且需在 manifest.json 里显式声明 requiredPrivateInfos 权限,还要在 pages.json 中配置 permission 字段。
实操建议:
- 确保调用
uni.getLocation前已执行uni.authorize({scope: 'scope.userLocation'}),并捕获拒绝情况做引导提示 - 在
manifest.json的微信小程序平台配置块中加入:"mp-weixin": { "requiredPrivateInfos": ["getLocation"] } - 在对应页面的
pages.json中添加:"permission": { "scope.userLocation": { "desc": "用于考勤打卡位置校验" } } - 避免在
onLoad自动调用,改用按钮点击触发,否则 iOS 下大概率静默失败
如何用 uni.chooseLocation 绘制考勤围栏并校验打卡点?
企业考勤不能只靠单点坐标,得判断员工是否在预设地理围栏内。微信原生不提供围栏计算,得自己实现——但别手写球面距离公式,直接用 uni.chooseLocation 返回的 latitude/longitude 配合后端校验最稳妥。
实操建议:
-
uni.chooseLocation只能用于选点,不能实时监听移动;考勤打卡应先调用它获取「允许打卡的中心点」和半径(比如 200 米),存入后端配置表 - 前端打卡时,用
uni.getLocation拿到当前坐标,连同时间戳一起发给后端 - 后端用 Haversine 公式或 PostGIS 的
ST_DWithin判断是否在围栏内,避免前端算距离被绕过 - 注意:微信地图 SDK 返回的坐标是 GCJ-02 坐标系,若你用高德/百度地图做围栏管理,需统一转成 WGS84 再计算,否则偏差可达 500 米
打卡接口频繁 401 或提示 token expired 怎么办?
JWT 过期是考勤场景最典型的体验断点:员工点“打卡”按钮后卡住几秒,弹出登录框——不是后端没续签,而是 uni-app 的请求拦截器没处理好 token 刷新逻辑。
实操建议:
- 不要在每次请求头硬塞
Authorization: Bearer xxx,而是封装一个requestWithAuth方法,内部检查 token 是否 5 分钟内过期 - 过期时先发刷新请求(
/auth/refresh),拿到新 token 后再重放原请求;注意用 Promise 链或 async/await 控制并发,避免多个请求同时触发刷新导致 401 爆发 - 把 token 存在
uni.setStorageSync('token', ...)而非内存变量,防止页面刷新丢失 - 后端刷新接口必须校验设备指纹(如
uni.getSystemInfoSync().platform + uni.getSystemInfoSync().model拼接 hash),防 token 劫持复用
打包到 Android App 后定位不准、打卡失败怎么排查?
uni-app 编译成 App 后,uni.getLocation 默认走系统 GPS,但很多安卓厂商(华为、小米)会限制后台定位精度或强制切换为网络定位,导致坐标漂移超 500 米,直接判定打卡失败。
实操建议:
- 在
manifest.json的 Android 配置中开启高精度定位:"permissions": [ "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION" ]
- 调用前先检查定位服务状态:
uni.getSystemInfoSync().platform === 'android'时,用uni.openLocation或第三方插件(如uni-app-plugin-location)唤起系统定位设置页引导用户手动开启“高精度模式” - App 端不要依赖单次定位结果,可连续调用 3 次
uni.getLocation(间隔 1s),取平均值或剔除离群值,再传给后端 - 真机测试务必用 Release 包,Debug 模式下 HBuilderX 的调试代理会干扰定位服务
status: 'late',而不是前端根据系统时间硬算——否则时区、设备时间篡改、夏令时都会让逻辑崩塌。


















