天天看點

浏覽器定位是如何實作的?為什麼會有浏覽器定位失敗的情況?

高德地圖開放平台JavaScript API提供的Geolocation定位插件,融合了HTML5 Geolocation定位接口、精确IP定位服務,以及安卓定位sdk定位。其中與安卓定位sdk的結合使用适用于開發安卓系統的H5應用,需同時使用安卓定位sdk和JavaScript API。

PART1. Geolocation.getCurrentPosition擷取精确位置的流程是什麼樣的?

在PC端,因為原生接口成功率很低,JavaScript API會優先調用精确IP定位服務,在IP定位失敗的時候,嘗試使用浏覽器原生定位接口進行定位,如果原生定位接口也定位失敗,則傳回error事件或回調error資訊。定位成功之後我們會對浏覽器定位的經緯度結果進行向高德坐标的轉化,并對所有有效定位結果融合位址資訊後傳回complete事件或者回調complete資訊。

在移動端,如果開發者開啟了sdk輔助定位,那麼安卓手機上我們會優先嘗試調用sdk的定位接口,失敗之後優先調用浏覽器原生定位接口進行定位,浏覽器定位失敗之後嘗試進行精确IP定位,如果以上三種定位全部嘗試失敗則傳回error事件或回調error資訊,否則和PC端的一樣,定位成功之後進行高德坐标轉化和位址融合。

我們在定位的回調或者事件響應中傳回了message字段,message字段明确指出了每一步的成敗和失敗原因。

PART2. getCurrentPosition定位失敗的原因有哪些?

1.IP精确定位失敗,message包含‘Get ipLocation failed.’資訊,精确IP定位服務無法完全覆寫所有IP和使用者,故而失敗;

2.sdk定位失敗,請檢查sdk的key是否設定好,以及webview的定位權限及應用和系統的定位權限是否開啟。

3.浏覽器定位失敗,有多種情況:

第一種情況,浏覽器不支援原生定位接口,如IE較低版本的浏覽器等,message字段包含‘Browser not Support html5 geolocation.’資訊;

第二種情況,使用者禁用了定位權限,需要使用者開啟定位權限,message字段包含‘Geolocation permission denied.’

第三種情況,浏覽器禁止了非安全域的定位請求,比如Chrome、IOS10已陸續禁止,這時候需要更新站點到HTTPS,message字段也是包含‘Geolocation permission denied.’資訊。注意Chrome不會禁止localhost等域名HTTP協定下的定位;

第四種情況,浏覽器定位逾時,包括原生的逾時,可以适當增加逾時屬性的設定值以減少這一現象,另外還有個别浏覽器本身的定位接口就是黑洞,完全沒有回應,也會逾時傳回失敗,message字段包含‘Get geolocation time out.’資訊;

第五種情況,确實定位失敗,Chrome、火狐以及部分套殼浏覽器接入的定位服務在國外,有較大限制,失敗率高;

注釋:如果定位到城市即可滿足需求,建議大家改用Geolocation.getCityInfo方法,可以根據IP傳回使用者所在城市的基本資訊,包括省、市名稱、adcode、citycode、城市中心點,城市矩形邊界等資訊。

PART3. getCurrentPosition定位代碼怎麼寫?

繼續閱讀