作为Web开发者,如果拥有了用户当前位置,我们所能做的事情就有很多了,比如高级过滤(advanced filtering)、在地图上标出用户的位置、还能基于用户的当前位置提供一些相关的建议。
作为用户,你肯定希望自己的物理位置是受到保护的,用户自然是希望得到他们信息的人是值得信任的。这也是为什么当一个站点需要获取用户当前位置时,浏览器会弹出提示询问用户请求权限。
在这篇指南里中,你将会看到:
- 当用户拒绝将他们的位置提供给开发者
- 当需要使用定位时,要用上回退
- 在手势操作时请求用户的位置
- 鼓励用户将他们的位置授权给应用/站点
最近的用户调查显示了用户很反感在页面加载时就请求位置,那么开发者应该要怎么做呢?
简而言之:
- 假设用户不授权他们的位置给应用/站点
- 说清楚为什么开发者需要获取用户的位置
- 不要在页面加载时立刻请求位置
假设用户不同意授权位置
你需要直面一个现实,很多用户都不愿意将它们的位置告诉开发者,所以你需要使用一个防御性的开发风格。
- 将错误放在定位API之外去处理
- 清晰明白地表达出开发者为什么需要使用用户的位置
- 如果需要,请使用回退方案
当需要使用定位时,要用上回退
我们建议不要在你的站点或者应用中持续请求用户的当前位置,但是如果你应用或者站点一定需要用户的位置,那么也有第三方的解决方法来模糊定位用户的当前位置。
这种情况下的解决办法通常都是通过查看用户的IP地址,然后将IP地址对应到注册在RIPE数据库中的物理地址中。不过这些定位通常无法精确到用户当前的位置,只是会告诉开发者离用户当前位置最近的电信枢纽的位置,或者是最近的蜂窝站。不过在很多情况下,返回的地理位置甚至都达不到这样的精确,特别是当用户在使用VPN或者其他的代理服务时,情况可能更不理想了。
在手势操作时请求用户的位置
不要在页面加载的时候向用户请求当前位置(像下图中显示的那样),用户此时是摸不着头脑为什么需要将自己的位置共享出来的。
用户不会将时间花在阅读页面,然后再花脑子去理解为什么需要使用他们的位置,所以让用户使用手势操作去触发位置请求比较合理。然后你应该清楚明白地告诉用户他们应该将位置授权给应用或者站点,此时用户就能更容易地将这个授权请求和刚刚他们使用的手势联系起来。
请求用户位置时清晰明确告诉用户为什么需要位置信息
Google广告团队的一份研究表明,当某一个用户要参加一个在波士顿召开的会议而想要在召开会议的酒店预订房间时,他们会希望一旦碰到了主页上的“查找和预定”时他们的GPS位置就能立刻被共享。在一些情况下,当用户明明希望预定波士顿的酒店房间可是系统总是返回给她旧金山的酒店信息时,用户就会很想崩溃。
如果用户能够完全理解为什么你需要他们的位置信息,那就相当于带来了更好的用户体验,添加一个众所周知的跨设备的信号,比如说测距器。
或者考虑用一个非常明显的指令,比如“查找附近”。
鼓励用户将他们的位置授权给应用/站点
你没有办法看到用户每一步是如何操作的,你会知道用户拒绝分享他们的位置,但是你无法知道他们在什么时候将位置授权给你,你只能知道授权或者不授权这样的结果。当需要用户完成某一个的动作是,“暗示”用户是很不错的方法。
我们推荐:
- 设置一个5秒的时钟,在短时间内发出提醒
- 将错误提示显示给用户
- 如果你拿到了用户的位置,将定时钟取消
- 如果定时闹钟也不起作用了,给用户一个通知
- 如果后来用户又将位置共享了,那就将上述的通知从屏幕上移除
button.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 banner clearTimeout(nudgeTimeoutId); // Do magic with location startPos = 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 callout showNudgeBanner(); break; }; navigator.geolocation.getCurrentPosition(geoSuccess, geoError); };