gps.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /**
  2. * GPS 定位定时上报功能
  3. */
  4. import { uploadGps } from '@/api/fulfiller/fulfiller.js'
  5. let gpsTimer = null
  6. /**
  7. * 获取并上传GPS定位 (带授权检查)
  8. */
  9. export function reportGps(manual = false) {
  10. return new Promise((resolve, reject) => {
  11. uni.getLocation({
  12. type: 'wgs84',
  13. success: function (res) {
  14. const data = {
  15. longitude: res.longitude,
  16. latitude: res.latitude
  17. }
  18. uploadGps(data).then(() => {
  19. console.log('GPS定位上传成功', data)
  20. resolve(res)
  21. }).catch(err => {
  22. console.error('GPS定位上传失败', err)
  23. reject(err)
  24. })
  25. },
  26. fail: function (err) {
  27. console.error('获取GPS定位失败', err)
  28. // 如果是手动触发且失败,尝试引导授权
  29. if (manual) {
  30. checkAndRequestPermission(reject)
  31. } else {
  32. reject(err)
  33. }
  34. }
  35. })
  36. })
  37. }
  38. /**
  39. * 检查并请求定位权限
  40. */
  41. function checkAndRequestPermission(reject) {
  42. uni.getSetting({
  43. success(res) {
  44. if (!res.authSetting['scope.userLocation']) {
  45. uni.showModal({
  46. title: '定位未授权',
  47. content: '请开启定位权限,以便为您推荐附近的订单并记录服务轨迹',
  48. confirmText: '去设置',
  49. success: (modalRes) => {
  50. if (modalRes.confirm) {
  51. uni.openSetting({
  52. success: (settingRes) => {
  53. if (settingRes.authSetting['scope.userLocation']) {
  54. reportGps(true)
  55. }
  56. }
  57. })
  58. } else {
  59. if (reject) reject(new Error('User denied location permission'))
  60. }
  61. }
  62. })
  63. } else {
  64. // 权限其实是有的,可能是系统GPS屏蔽了或其他原因
  65. uni.showToast({ title: '获取定位失败,请检查手机GPS是否开启', icon: 'none' })
  66. if (reject) reject(new Error('Location failed even with permission'))
  67. }
  68. }
  69. })
  70. }
  71. export function startGpsTimer() {
  72. const isEnabled = uni.getStorageSync('GPS_REPORT_ENABLED')
  73. if (isEnabled === false) {
  74. stopGpsTimer()
  75. return
  76. }
  77. stopGpsTimer()
  78. reportGps() // 默认静默尝试
  79. gpsTimer = setInterval(() => {
  80. reportGps()
  81. }, 1200000)
  82. }
  83. /**
  84. * 停止GPS定时上报
  85. */
  86. export function stopGpsTimer() {
  87. if (gpsTimer) {
  88. clearInterval(gpsTimer)
  89. gpsTimer = null
  90. }
  91. }