Skip to content

记录比较散乱的内容

获取用户地理位置权限

有时候,我们需要获取用户地理位置的时候,通常会想到 H5 的 geolocation 方法,但是 HTTP 不支持,只能升级到 HTTPS 才行。而在 HTTP,其实我们可以使用百度/高德的 API 获取用户的地理位置。高德的我没用过,下面的代码是百度的

百度地图 api

javascript
getPoint(callback, err) {
  const oGeolocation = new BMap.Geolocation()
  oGeolocation.getCurrentPosition((r) => {
    let tmp = false
    if (window.oGeolocation.getStatus() === 0) 
      // 使用 accuracy 判断是否被拒绝(可能不准确)
      if (r.accuracy !== null) {
        tmp = r.point
      } else {
        console.log('拒绝')
        err && err()
      }
    }
    // 百度地图的授权框,被拒绝后,也会选择一个比较相近的坐标出来
    callback && callback(tmp)
  }, { enableHighAccuracy: true })
}

使用百度地图的 api,在 HTTP 也可以进行弹框授权,但是拒绝后,就很难才能再显示,不会每次页面重新打开都会进行弹框。

H5 geolocation api

javascript
getPoint(callback, err) {
  navigator.geolocation.getCurrentPosition((position) => {
    console.log('h5 获取地理:', position)
    const coords = position.coords
    // 拒绝
    if (coords.error === 11) {
      console.log('用户拒绝')
      err && err()
      return
    }
    // 这里已经是成功获取到用户的地理坐标了
    // position.coords.longitude, position.coords.latitude
    // 转换成百度地图坐标
    const convertor = new BMap.Convertor()
    convertor.translate([new BMap.Point(coords.longitude, coords.latitude)], 1, 5, (data) => {
      console.log('转换后的数据:', data)
      if (data.status === 0) {
        callback && callback(data.points[0])
      } else {
        // ...
        console.log('转换失败:', data)
      }
    })
  }, (errData) => {
    console.log('err 获取地理:', errData)
    err && err(errData)
  })
}

百度地图 API 和 H5 geolocation 在 HTTPS 中使用,拒绝后,每次打开页面都会重新显示授权框,而确认授权后,要过一会,才会重新弹出。

在 HTTPS 中使用百度地图 API 获取地理位置和原生的没什么区别的。但是,在 IOS 支付宝打开页面,在页面使用了百度地图,同时还使用百度地图 API 获取地理位置,就会闪退,整个支付宝 APP 都会关闭。我用了公司几台苹果都是这样,系统都是 11的,10却没这问题。后来使用原生的 API 后,才解决这 BUG。