草庐IT

小程序切换前后台获取实时地理信息进行定位上报

技术钱 2023-09-24 原文

在做小程序有个需求要采集司机定位并进行上报给后台,之前用了wx.getLocation() 和定时调用setinterval在一定的间隔内进行采集和上报司机位置,但是频繁调用时它给我返回报错信息 官网解释 高频率调用会导致耗电 ,而且2.17.0 增加调用频率限制,相关公告
后面使用了wx.startLocationUpdateBackground 和 wx.onLocationChange 不管是切换前后后都能获取地理位置信息。

1.getLocation 的使用

首先在微信公众平台 开发管理 -> 接口设置里面去申请开通该接口

其次在app.json里面配置permission,意为申请权限

"permission": {
   "scope.userLocation": {
     "desc": "你的位置信息将用于定位"
   }
 },
 "requiredPrivateInfos": [
   "getLocation",
 ]

这样就可以使用wx.getLocation 获取地理位置信息
代码如下:

// 封装 getLocation 方法  在需要获取地理位置信息 调用该方法 就可以获取当前地理位置信息
 getLocation() {
    return new Promise((resolve, reject) => {
      wx.getLocation({
        type:'gcj02',
        isHighAccuracy: true,
        success: res => {
          resolve(res)
        },
        fail: e => {
           wx.getSetting({
            success: res => {
              if (typeof(res.authSetting['scope.userLocation']) != 'undefined' && !res.authSetting['scope.userLocation']) {
                wx.showModal({
                  title: '提示',
                  content: '您拒绝了定位权限,将无法使用该功能',
                  success: res => {
                    if (res.confirm) {
                      wx.openSetting({
                        success: res => {
                          if (res.authSetting['scope.userLocation']) {
                            wx.getLocation({
                              type:'gcj02',
                              isHighAccuracy: true,
                              success: res => {
                                resolve(res)
                              }
                            });
                          } else {
                            wx.showToast({
                              title: '您拒绝了定位权限,将无法使用该功能',
                              icon: 'none'
                            });
                          }
                        }
                      });
                    }
                  }
                });
              } else {
                resolve(res)
              }
            }
          });
        }
      })
    })
  },

// 需要获取地理位置信息
getLocation().then(res => {
 // res 就是当前地理位置信息
})

2.使用wx.onLocationChange实时获取地理位置信息

该方法需结合 wx.startLocationUpdateBackground、wx.startLocationUpdate使用

首先在微信公众平台 开发管理 -> 接口设置里面去申请开通该接口

其次在app.json里面配置

"requiredBackgroundModes": [
   "location"
 ],
 "requiredPrivateInfos": [
   "getLocation",
   "startLocationUpdateBackground",
   "onLocationChange"
 ]

在utils文件下建立location.js再封装成一个方法

/**
 * 切换前后台获取地理位置信息
 * **/
const getLocation = () => {
  return new Promise((resolve, reject) => {
    const locationChangeFn = (res) => {
      resolve(res)
    }

    // 前后台定位
    const startLocationUpdateBackground = () => {
      wx.startLocationUpdateBackground({
        success: (res) => {
          wx.onLocationChange(locationChangeFn)
        }
      })
    }

    // 前台定位
    const startLocationUpdate = () => {
      wx.startLocationUpdate({
        success: (res) => {
          wx.onLocationChange(locationChangeFn)
        },
        fail: (err) => {
          console.log(err)
        }
      })
    }

    // 授权
    wx.getSetting({
      success(res) {
        if (res.authSetting['scope.userLoactionBackground']) { 
          // 前后台定位 
          startLocationUpdateBackground()
        } else if(res.authSetting['scope.userLocation']) {
          // 前台定位
          startLocationUpdate()
        } else {
          wx.showModal({
            content: '需要获取前后台运行定位权限',
            success: (res) => {
              if (res.confirm) {
                wx.openSetting({
                  success: (res) => {
                    if (res.authSetting['scope.userLocationBackground']) {
                      // 前后台定位 
                      startLocationUpdateBackground()
                    }else if(res.authSetting['scope.userLocation']) {
                      // 前台定位
                      startLocationUpdate()
                    } else {
                      wx.showToast({
                        title: '不能获取定位',
                      })
                    }
                  },
                  fail: (err) => {
                    wx.showToast({
                      title: '不能获取定位',
                    })
                  }
                })
              } else {
                wx.showToast({
                  title: '不能获取定位',
                })
              }
            }
          })
        }
      }
    })
  })
}

module.exports = {
  getLocation
}

在需要调用的地方 引入并调用该方法

import { getLocation } from '../../utils/location'

getLocation().then(res => {
  // res 就是实时获取的地理位置
})
也可以这样写(在最近的方法前添加asyncconst {longitude, latitude} = await getLocation()

使用setinterval在一定的时间内上报地理位置信息
在app.js定义一个全局变量用于在某些条件下清除定位上报

// app.json
App({
  ......
  globalData: {
      reportSetInt: null
  }
  ......
})
// 使用地方
const App = getApp()
......
App.globalData.reportSetInt = setInterval(() => {
  // 上报给后台的方法
  ......
}, 60*1000)
......

有关小程序切换前后台获取实时地理信息进行定位上报的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  8. ruby - 如何在 ruby​​ 中运行后台线程? - 2

    我是ruby​​的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp

  9. ruby - what is - gets is a directory - 错误信息 - 2

    我遇到了这个奇怪的错误.../Users/gideon/Documents/ca_ruby/rubytactoe/lib/player.rb:13:in`gets':Isadirectory-spec(Errno::EISDIR)player_spec.rb:require_relative'../spec_helper'#theuniverseisvastandinfinite...itcontainsagame....butnoplayersdescribe"tictactoegame"docontext"theplayerclass"doit"musthaveahumanplay

  10. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

随机推荐