最近接到一個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,萬分感謝該作者!