h5获取用户定位碰到的坑

最近接到一个h5的小项目,但是需要获取用户的定位经纬度作为接口参数,因为我一直做的后台,对这些东西都不熟悉,只有网上查找各种资料;

接下来就是各种问题了。

首先,一开始查找到html5自带的定位API,看起来特别简单,跃跃欲试,代码如下:

var lat=0,lng=0;
function getLocation() {
    var options = {

        enableHighAccuracy: true, //精确定位

        maximumAge: 1000//最长时间

    }
    if (navigator.geolocation) {
        //alert("定位开始")
        navigator.geolocation.getCurrentPosition(showPosition, showError, options);
    } else {
        alert("浏览器不支持地理定位。");
    }
}

function showError(error) {
    switch (error.code) {
        case error.PERMISSION_DENIED:
            alert("定位失败,用户拒绝请求地理定位");
            break;
        case error.POSITION_UNAVAILABLE:
            alert("定位失败,位置信息是不可用");
            break;
        case error.TIMEOUT:
            alert("定位失败,请求获取用户位置超时");
            break;
        case error.UNKNOWN_ERROR:
            alert("定位失败,定位系统失效");
            break;
    }
}

function showPosition(position) {
     lat = position.coords.latitude; //纬度
     lng = position.coords.longitude; //经度
     alert('纬度:' + lat + ',经度:' + lng);
}

使用之后发现微信浏览器、苹果手机定位失败。。。

了解到微信必须使用签名https域名,将本地的springboot项目改为https服务,继续测试,微信浏览器直接白屏还是不行,手机浏览器可以点击同意之后访问,微信安全校验严格,直接不显示,放弃,

继续测试将项目部署到测试服务器,https服务,应该可以了吧,是可以了,安卓手机可以,苹果不行。。。

接口方是使用高德API来定位的,避免麻烦,改为高德定位吧

首先去高德API官方网站注册账号,建应用,主要是为了申请key,可以调用高德定位API,参考地图js API;

引入js

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.2&key=youkey"></script>
youkey就是你在高德上申请的key
高德定位js代码如下,container是div容器id
var lat = 0, lng = 0;

var map, geolocation;
//加载地图,调用浏览器定位服务
map = new AMap.Map('container', {
    resizeEnable: true
});
map.plugin('AMap.Geolocation', function () {
    geolocation = new AMap.Geolocation({
        enableHighAccuracy: true, //是否使用高精度定位,默认:true
        timeout: 10000, //超过10秒后停止定位,默认:无穷大
        buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
        zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
        buttonPosition: 'RB'
    });
    map.addControl(geolocation);
    //询问是否允许获取地理信息
    geolocation.getCurrentPosition();
    //定位成功,返回经纬度信息
    AMap.event.addListener(geolocation, 'complete', onComplete);
    //定位失败,返回定位出错信息
    AMap.event.addListener(geolocation, 'error', onError);
});

//解析定位结果
function onComplete(data) {
    lat = data.position.getLng();
    lng = data.position.getLat();
    alert(lat);
}
//解析定位错误信息
function onError(data) {
    alert('定位失败');
}

屁颠屁颠部署上线,打开手机(安卓),完美!乐滋滋

。。。

。。。

。。。

同事打开手机(苹果),点位失败。。。

哎。

继续找资料

使用高德的补丁函数 http://a.amap.com/jsapi_demos/static/remogeo/remogeo.js 有异步的问题建议放在本地

在高德地图初始化的地方  new RemoGeoLocation()

苹果新发的 iOS 11 操作系统的一大特性是对 http 形式访问页面的限制变得非常严格


var lat = 0, lng = 0;

var map, geolocation;
//加载地图,调用浏览器定位服务
map = new AMap.Map('container', {
resizeEnable: true
});
map.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true, //是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
buttonPosition: 'RB'
});

//判断是否是ios系统,如果是,则调用远程定位方法

if (AMap.UA.ios) {
//使用远程定位,见 remogeo.js
var remoGeo = new RemoGeoLocation();
//替换方法
navigator.geolocation.getCurrentPosition = function () {
return remoGeo.getCurrentPosition.apply(remoGeo, arguments);
};
//替换方法
navigator.geolocation.watchPosition = function () {
return remoGeo.watchPosition.apply(remoGeo, arguments);
};
}
map.addControl(geolocation);
//询问是否允许获取地理信息
geolocation.getCurrentPosition();
//定位成功,返回经纬度信息
AMap.event.addListener(geolocation, 'complete', onComplete);
//定位失败,返回定位出错信息
AMap.event.addListener(geolocation, 'error', onError);
});

//解析定位结果
function onComplete(data) {
lat = data.position.getLng();
lng = data.position.getLat();
alert(lat);
}
//解析定位错误信息
function onError(data) {
alert('定位失败');
}

就是加上针对苹果手机的特殊处理,走远程定位逻辑

本地测试,安卓,苹果浏览器打开正常,微信当然还是不行,部署上线,微信浏览器正常,解决!

在我快要绝望的时候找到这个https://www.cnblogs.com/helzeo/p/11642380.html,万分感谢该作者!

原文地址:https://www.cnblogs.com/qingpw/p/13048286.html