作為Web開發者,如果擁有了使用者當前位置,我們所能做的事情就有很多了,比如高階過濾(advanced filtering)、在地圖上標出使用者的位置、還能基於使用者的當前位置提供一些相關的建議。
作為使用者,你肯定希望自己的物理位置是受到保護的,使用者自然是希望得到他們資訊的人是值得信任的。這也是為什麼當一個站點需要獲取使用者當前位置時,瀏覽器會彈出提示詢問使用者請求許可權。
在這篇指南里中,你將會看到:
- 當使用者拒絕將他們的位置提供給開發者
- 當需要使用定位時,要用上回退
- 在手勢操作時請求使用者的位置
- 鼓勵使用者將他們的位置授權給應用/站點
最近的使用者調查顯示了使用者很反感在頁面載入時就請求位置,那麼開發者應該要怎麼做呢?
簡而言之:
- 假設使用者不授權他們的位置給應用/站點
- 說清楚為什麼開發者需要獲取使用者的位置
- 不要在頁面載入時立刻請求位置
假設使用者不同意授權位置
你需要直面一個現實,很多使用者都不願意將它們的位置告訴開發者,所以你需要使用一個防禦性的開發風格。
- 將錯誤放在定位API之外去處理
- 清晰明白地表達出開發者為什麼需要使用使用者的位置
- 如果需要,請使用回退方案
當需要使用定位時,要用上回退
我們建議不要在你的站點或者應用中持續請求使用者的當前位置,但是如果你應用或者站點一定需要使用者的位置,那麼也有第三方的解決方法來模糊定位使用者的當前位置。
這種情況下的解決辦法通常都是通過檢視使用者的IP地址,然後將IP地址對應到註冊在RIPE資料庫中的實體地址中。不過這些定位通常無法精確到使用者當前的位置,只是會告訴開發者離使用者當前位置最近的電信樞紐的位置,或者是最近的蜂窩站。不過在很多情況下,返回的地理位置甚至都達不到這樣的精確,特別是當使用者在使用VPN或者其他的代理服務時,情況可能更不理想了。
在手勢操作時請求使用者的位置
不要在頁面載入的時候向使用者請求當前位置(像下圖中顯示的那樣),使用者此時是摸不著頭腦為什麼需要將自己的位置共享出來的。
使用者不會將時間花在閱讀頁面,然後再花腦子去理解為什麼需要使用他們的位置,所以讓使用者使用手勢操作去觸發位置請求比較合理。然後你應該清楚明白地告訴使用者他們應該將位置授權給應用或者站點,此時使用者就能更容易地將這個授權請求和剛剛他們使用的手勢聯絡起來。
請求使用者位置時清晰明確告訴使用者為什麼需要位置資訊
Google廣告團隊的一份研究表明,當某一個使用者要參加一個在波士頓召開的會議而想要在召開會議的酒店預訂房間時,他們會希望一旦碰到了主頁上的“查詢和預定”時他們的GPS位置就能立刻被共享。在一些情況下,當使用者明明希望預定波士頓的酒店房間可是系統總是返回給她舊金山的酒店資訊時,使用者就會很想崩潰。
如果使用者能夠完全理解為什麼你需要他們的位置資訊,那就相當於帶來了更好的使用者體驗,新增一個眾所周知的跨裝置的訊號,比如說測距器。
或者考慮用一個非常明顯的指令,比如“查詢附近”。
鼓勵使用者將他們的位置授權給應用/站點
你沒有辦法看到使用者每一步是如何操作的,你會知道使用者拒絕分享他們的位置,但是你無法知道他們在什麼時候將位置授權給你,你只能知道授權或者不授權這樣的結果。當需要使用者完成某一個的動作是,“暗示”使用者是很不錯的方法。
我們推薦:
- 設定一個5秒的時鐘,在短時間內發出提醒
- 將錯誤提示顯示給使用者
- 如果你拿到了使用者的位置,將定時鐘取消
- 如果定時鬧鐘也不起作用了,給使用者一個通知
- 如果後來使用者又將位置共享了,那就將上述的通知從螢幕上移除
12345678910111213141516171819202122232425262728293031323334button.onclick = function() {var startPos;var element = document.getElementById("nudge");var showNudgeBanner = function() {nudge.style.display = "block";};var hideNudgeBanner = function() {nudge.style.display = "none";};var nudgeTimeoutId = setTimeout(showNudgeBanner, 5000);var geoSuccess = function(position) {hideNudeBanner();// We have the location, don't display bannerclearTimeout(nudgeTimeoutId);// Do magic with locationstartPos = position;document.getElementById('startLat').innerHTML = startPos.coords.latitude;document.getElementById('startLon').innerHTML = startPos.coords.longitude;};var geoError = function(error) {switch(error.code) {case error.TIMEOUT:// The user didn't accept the calloutshowNudgeBanner();break;};navigator.geolocation.getCurrentPosition(geoSuccess, geoError);};