uniapp开发企业微信应用中的定位问题记录

项目背景:开发工具为HBuilderX,框架为uniapp,开发移动端的Web应用,在企业微信中使用(自建应用),Web开发的应用,不是小程序。
需求点:获取用户当前的位置信息,技术流程包括以下几个环节:
- 1、获取当前用户的经纬度位置信息,用的uniapp的
uni.getLocation()接口。- 2、显示一个地图,标记用户的位置,用的百度地图SDK。
- 3、地图可以拖动,拖动后标记点会跟着移动,让用户可以自行调整位置。
- 4、获取标记点详细地址,采用百度地图的逆解析API,获得详细位置信息。

问题:但实际开发中定位老是不准,存在各种问题,最后通过升级HTTPS解决,记录一下处理过程。
01、百度地图
到百度地图开放平台,注册一个开发者账号,百度地图需要申请一个KEY才能使用。可根据项目情况选择个人账号,还是企业账号。
| 类型 | 个人账号 | 企业开发者账号 |
|---|---|---|
| 应用场景 | 个人学习 | 企业商业使用 |
| 认证方式 | 开发者认证,个人实名认证(已完成) | 企业名称、营业执照、法人、联系方式、对公帐号信息 |
| 认证时长 | 很快 | 几分钟-5个工作日,多种认证方式 |
| 收费 | 白嫖 | 商业授权,基础版5W/年 |
| 调用限额 | JS API 定位:5,000次/日,并发10次/秒 JS API 逆地理编码:5,000次/日,并发30次/秒 |
JS API 定位:30W次/日,并发100次/秒 JS API 逆地理编码:300W次/日,并发100次/秒 |
方案:
- 如果使用次数较多,则需要考虑企业账号,或购买额度。
- 一般小项目、公司内部使用,调用频次不多,可申请个人账号,或者多申请几个账号,轮训使用。
国内地图三巨头腾讯、高德、百度的商业授权都是收费的,起步价都是5W/年。
逆地址解析:
// 根据坐标获取位置描述
export function getLocationByPoint(p, BMap) {
if (!p || !p.lng) return ''
const gc = new BMap.Geocoder()
return new Promise((resolve) => {
gc.getLocation(p, (rs) => {
const addComp = rs.addressComponents
resolve(addComp.province + addComp.city + addComp.district + addComp.street+ addComp.district)
})
})
}
坐标转换,wgs84坐标转换为火星坐标,否则在百度地图上显示会有偏差
// wgs84 坐标转百度坐标
export function WGS2BD(p, BMap) {
const wpoint = new BMap.Point(p.lng, p.lat)
const convertor = new BMap.Convertor()
return new Promise(resolve => {
convertor.translate([wpoint], 1, 5, function (data) {
if (data.status === 0) {
resolve(data.points[0])
}
})
})
}
资料:
02、UNI的定位
UNI的定位核心API:uni.getLocation(OBJECT),但在使用中定位有问题。
- uni自带的
getLocation在移动端浏览器上运行正常,第一次会提示定位权限。type为wgs84可定位,如果为gcj02则定位失败。 - 如果H5应用嵌入企业微信,在企业微信中运行,则会定位失败,可能是权限问题,无法获取手机定位权限。
type String:默认为 wgs84 返回 gps 坐标,gcj02 返回国测局坐标,可用于 uni.openLocation 和 map 组件坐标,App 和 H5 需配置定位 SDK 信息才可支持 gcj02。
2.1、getLocationbug
uni.getLocation还有bug,就是如果内部调用失败,就会报错,且无法捕获,看源码(gitee源码)是其内部使用了Promise但没有处理好异常导致的,外面无法捕获。
Uncaught (in promise) Error: network error
2.2、配置地图key-没解决
定位不准,继续寻找方案。打包的H5是在企业微信中使用,就申请了一个腾讯地图的Key,在uniapp中配置。如下图,在Web配置中启用地图定位,填上腾讯开发者key。

然而并没有什么改善,返回的定位依然是不准的。这里的不准不是有偏差,而是一个城市里的位置都一样,都指向市政府。
2.3、微信JS-SDK
企业微信为应用开发提供了一个JS-SDK,可以用来定位、获取蓝牙、摄像头等权限。
// 获取用户当前位置
wx.getLocation({
type: 'wgs84',
success: function (res) {
var latitude = res.latitude; // 纬度
var longitude = res.longitude; // 经度
var speed = res.speed; // 速度,以米/秒计算
var accuracy = res.accuracy; // 位置精度,以米为单位的定位误差
alert("您的位置是:" + latitude + "," + longitude);
},
fail: function (res) {
alert("获取用户位置信息失败!");
}
});
但使用前必须先用接口注册,流程比较麻烦,需要前后端配合。官方使用说明,看官方要求和项目情况可能存在问题,还是先试试HTTPS吧。
2.4、开启HTTPS-通过
部署的网站是HTTP的,并没有启用HTTPS,在微信小程序的开发文档中有明确说明需要HTTPS进行网络通信,那就升级到HTTPS吧。
在腾讯云申请免费的HTTPS证书,总计可以申请最多50张免费的SSL证书(其中20张免费证书支持绑定全网域名,30张免费证书可绑定腾讯云域名),成为腾讯云 V2 会员即可提升绑定全网域名的额度。
- 免费证书不支持泛域名(*.qq.com)。
- 免费证书有效期为1年,到期后如需继续使用证书,请重新申请并安装。
- 正式版可以自动续费,单域名证书个人版500+/年,企业版2K+/年;泛域名证书个人版2K+/年,企业版5K+/年。

输入域名,选择DNS验证,需要在域名解析处添加一条TEXT记录。参考官方DNS 验证文档。

验证通过后,即可下载证书。然后配置Nginx,腾讯文档Nginx 服务器 SSL 证书安装部署。
- 先确保Nginx是否安装了ssl模块“http_ssl_module”
- 证书拷贝到cert 文件夹下。
- 修改配置文件“nginx.conf ”,添加“https server”配置。
- 重启Nginx。
配置好HTTPS的相关配置,重新打包部署,PC端正常,但移动端存在故障。移动端访问老是被重定向到HTTP上了,几经波折,发现是刚才在uniapp打包时顺手勾上了一个选项“启用https协议”,去掉就好了。,这个选项是干什么的?

重新打包更新,定位准确了!
03、调试uniapp
可以安装微信开发者工具,用公众号网页来调试H5,打开页面后提示错误:“无法获取用户身份”。

需要两个条件:
- 1、开启开发者模式:我的企业 -> 微信插件 -> 开发者工具勾选上

- 2、注意是“当前管理员”,开发者工具登录的微信必须是当前企业微信的管理员。
参考资料:
️版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!原文编辑地址-语雀
uniapp开发企业微信应用中的定位问题记录的更多相关文章
- ionic4 开发企业微信应用0
作为一个后台开发人员,几年前参与过Ionic1开发过一微信公众号的经历,所以这次开发企业微信应用,就使用了ionic,正好ionic4 rc版本发布,虽然不是正式版,作为本项目的项目经理,还是决定使用 ...
- uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面
一.介绍 运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息.表情(gif图), ...
- 基于uni-app的微信小程序之分包
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 0. 缘由 1. 关于分包 1.0 这是 官方文档 1.1 注意事项 2.使用方法 2.1 首先你得有个uniapp的微信小程序项目 2.2 ...
- uni-app开发经验分享十九: uni-app对接微信小程序直播
uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情> 记录这两个参数直播 ...
- 使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转
在<使用uView UI+UniApp开发微信小程序>的随笔中,介绍了基于uView UI+UniApp开发微信小程序的一些基础知识和准备工作,其中也大概介绍了一下基本的登录过程,本篇随笔 ...
- 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统
在前面随笔<使用uView UI+UniApp开发微信小程序>和<使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转>介绍了微信小程序的常规登录处理和验 ...
- nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId
nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId 前言: 我准备用nodejs+koa+uniapp实现一款餐饮点单小程序,以及nodejs+koa+vue实现后端管理 ...
- C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
- nodejs 开发企业微信第三方应用入门教程
最近公司要开发企业微信端的 Worktile,以前做的是企业微信内部应用,所以只适用于私有部署客户,而对于公有云客户就无法使用,所有就准备开发企业微信的第三方应用,本文主要介绍在调研阶段遇到的山珍海味 ...
随机推荐
- Win32窗口设置为透明
可以使用以下方法将Win32窗口设置为透明: 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL. 在窗口创建时,使用WS_EX_LAYERED风格和SetLay ...
- D7lsu. 树题
\(\text{Solution}\) 又是一道考场想到做法写不出来的题 对于 \(\ge x\) 的数全部 \(+1\) 的操作有个很优美的大材小用的想法,那就是分段函数 于是线段树倒着维护分段函数 ...
- vuex记录状态
// actions import { queryProductDetailsById } from '../service' /* * 异步 */ export const addAndGetPro ...
- node.js解决跨域方案
服务端 1.通过使用cors模块解决跨域问题 var express = require('express') , cors = require('cors') , app = express(); ...
- CSS伪元素详解以及伪元素与伪类的区别
前面已经介绍过CSS伪类的知识,具体可见前文 CSS伪类知识详解. 伪元素常常被误解为伪类,主要在于他们的语法相似,都是对于选择器功能的扩展,相似程度很高导致被混淆. 本文通过详细介绍伪元素和常见的使 ...
- python入门教程之一 什么是python
python简介 1 什么是python Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页 ...
- python实现远程桌面
项目旨在让大家理解远控软件的原理,通过远控桌面可以实现远程控制我们的电脑,更好更方便的管理电脑.文末将给出初始版的完整代码,需要使用到的其他工具也会有所说明.最终实现的效果就是只要用户点击了客户端的程 ...
- [ElasticSearch]#解决问题#修改Search Guard密码时 报错:ERR: Seems there is no Elasticsearch running on localhost:9300 - Will exit
问题复现 [root@es2 tools]# ps -ef | grep elasticsearch 9200 22693 1 1 09:31 ? 00:04:54 /usr/bin/java -Xm ...
- LeeCode数组问题(一)
LeeCode 27:移除元素 题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度length. 不要使用额外的数组空间,你 ...
- 【谷粒商城】(二)SpringCloudAlibaba分布式组件
微服务 分布式组件 注册中心:每一个微服务上线都应该注册到注册中心.这样做的好处在于方便微服务之间的相互调用,比如订单服务想要调用商品服务,就可以通过注册中心查看有哪几台主机的商品服务进行了注册,然后 ...