高德地圖開放平臺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定位程式碼怎麼寫?
var geolocation = new AMap.Geolocation(); map.addControl(geolocation); //geolocation.getCurrentPosition(); //精準定位 geolocation.getCityInfo(); //定位到城市 });