如何在Phonegap应用中避免地理位置双重提示?

8
我创建了一个使用JavaScript内置webview的PhoneGap应用程序,可以在iPhone上使用geolocation功能。
第一次运行该应用程序时,它会提示我允许此应用程序使用geolocation。
当我点击“确定”后,它会再次提示相同的问题,但这次它指出“index.html”要求使用geolocation。
这很有道理,因为iOS可能想要为该应用程序自身首次允许geolocation权限,而第二次浏览器需要权限。
然而,这不会为用户带来良好的体验:
如何避免双重提示?(只需防止第二个提示即可)。
4个回答

14

我找到了问题的原因。

navigator.geolocation.getCurrentPosition(onsuccess, onerror)的调用发生在Phonegap完全加载之前。

这意味着webview(而不是通过PhoneGap的本地调用)触发了地理位置调用,这将再次请求权限(这是有道理的)。类似于智能手机上的普通Safari浏览器,每个新网站都会要求地理位置权限。当通过PhoneGap在应用程序启动时加载index.html时,情况也是一样的。

然而,解决办法是等待deviceready事件的触发,该事件在PhoneGap完全加载后才会触发:

document.addEventListener("deviceready", function(){
     navigator.geolocation.getCurrentPosition(onsuccess, onerror, params);
}, false);

这将使得PhoneGap API可用,覆盖浏览器默认的HTML5地理位置调用,并通过本地调用获取设备的地理位置(您已经在第一个提示中接受了该调用)。

这样做是可行的,因为PhoneGap的API调用与HTML5标准的W3C调用完全相同:http://docs.phonegap.com/en/2.2.0/cordova_geolocation_geolocation.md.html#Geolocation


Timo的回答非常出色。其他人的回答应该被删除,因为它们在散布错误信息。 - r3wt

0
我通过移动

来解决了这个问题。
<script src="cordova.js"></script>

作为最后一个被包含的脚本


这很危险,请小心。您可能会遇到竞态条件,这在您的情况下可能有效,但在其他环境中可能无效(取决于用户的互联网速度、浏览器类型等等...)。您应该先完全阅读并理解脚本执行顺序:http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de - Timo Ernst

0

问题终于解决了。

在index.html中,只需将cordova.js文件上移即可:

<script src="cordova.js"></script>

将其作为第一个要包含的js文件(特别是确保它在地图包含js文件之前)。这将确保提示仅显示一次。


当按照您建议的方式加载此脚本时,会出现冲突,导致网络服务无法加载或不提供任何错误信息。有什么解决方案吗? - developer
我正在使用Sencha Touch 2,在Ext.ajax.request中遇到了冲突。如何避免这种情况? - developer
这很危险,请小心。您可能会遇到竞态条件,这在您的情况下可能有效,但在其他环境中可能无效(取决于用户的互联网速度、浏览器类型等等...)。您应该先完全阅读并理解脚本执行顺序:http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de - Timo Ernst

0
看一下这个: 使用PhoneGap在iPhone上请求位置权限的警告 第二个似乎是Webkit警告。为了防止这种情况,你似乎只需要将所有js文件移动到根目录即可。如果它有效,请告诉我,因为我很快也要解决同样的问题。

不是那个,但你的链接指引了我正确的方向。请查看我的回答。 - Timo Ernst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接