uniapp開發企業微信應用中的定位問題記錄

安木夕發表於2023-05-13

image.png

專案背景:開發工具為HBuilderX,框架為uniapp,開發移動端的Web應用,在企業微信中使用(自建應用),Web開發的應用,不是小程式。
需求點:獲取使用者當前的位置資訊,技術流程包括以下幾個環節:

  • 1、獲取當前使用者的經緯度位置資訊,用的uniapp的uni.getLocation()介面。
  • 2、顯示一個地圖,標記使用者的位置,用的百度地圖SDK。
  • 3、地圖可以拖動,拖動後標記點會跟著移動,讓使用者可以自行調整位置。
  • 4、獲取標記點詳細地址,採用百度地圖的逆解析API,獲得詳細位置資訊。

image.png

❓問題:但實際開發中定位老是不準,存在各種問題,最後透過升級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在移動端瀏覽器上執行正常,第一次會提示定位許可權。typewgs84可定位,如果為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。

image.png

然而並沒有什麼改善,返回的定位依然是不準的。這裡的不準不是有偏差,而是一個城市裡的位置都一樣,都指向市政府。

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+/年。

image.png

輸入域名,選擇DNS驗證,需要在域名解析處新增一條TEXT記錄。參考官方DNS 驗證文件。

image.png

驗證透過後,即可下載證照。然後配置Nginx,騰訊文件Nginx 伺服器 SSL 證照安裝部署

  • 先確保Nginx是否安裝了ssl模組“http_ssl_module”
  • 證照複製到cert 資料夾下。
  • 修改配置檔案“nginx.conf ”,新增“https server”配置。
  • 重啟Nginx。

配置好HTTPS的相關配置,重新打包部署,PC端正常,但移動端存在故障。移動端訪問老是被重定向到HTTP上了,幾經波折,發現是剛才在uniapp打包時順手勾上了一個選項“啟用https協議”,去掉就好了。???,這個選項是幹什麼的?

image.png

重新打包更新,定位準確了!???


03、除錯uniapp

可以安裝微信開發者工具,用公眾號網頁來除錯H5,開啟頁面後提示錯誤:“無法獲取使用者身份”。

image.png

需要兩個條件:

  • 1、開啟開發者模式:我的企業 -> 微信外掛 -> 開發者工具勾選上

image.png

  • 2、注意是“當前管理員”,開發者工具登入的微信必須是當前企業微信的管理員。

參考資料:


©️版權申明:版權所有@安木夕,本文內容僅供學習,歡迎指正、交流,轉載請註明出處!原文編輯地址-語雀

相關文章