记录比较散乱的内容
获取用户地理位置权限
有时候,我们需要获取用户地理位置的时候,通常会想到 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。