我为 iPhone 创建了一个 PhoneGap 应用程序,它通过 webview 中的 JavaScript 使用地理定位。
当我第一次运行该应用程序时,它会提示我允许此应用程序的地理定位。
当我点击“ok”时,它会再次提示我同样的问题,但这次它指出“index.html”需要使用地理位置的权限。
这是有道理的,因为 iOS 可能第一次想要允许应用程序本身的地理定位,而浏览器第二次想要获得权限。
但是,因为不会带来很好的用户体验:
如何防止这种双重提示?(如果可以防止第二个提示,我就足够了)
我为 iPhone 创建了一个 PhoneGap 应用程序,它通过 webview 中的 JavaScript 使用地理定位。
当我第一次运行该应用程序时,它会提示我允许此应用程序的地理定位。
当我点击“ok”时,它会再次提示我同样的问题,但这次它指出“index.html”需要使用地理位置的权限。
这是有道理的,因为 iOS 可能第一次想要允许应用程序本身的地理定位,而浏览器第二次想要获得权限。
但是,因为不会带来很好的用户体验:
如何防止这种双重提示?(如果可以防止第二个提示,我就足够了)
我找到了问题的原因。
调用navigator.geolocation.getCurrentPosition(onsuccess, onerror)发生在 Phonegap 完全加载之前。
这意味着webview的地理定位调用(而不是通过 PhoneGap 的本地调用)被触发,这将再次请求许可(这确实有意义)。将其与智能手机上的普通 Safari 浏览器进行比较。它会要求每个新网站的地理位置许可。在应用程序启动时通过 PhoneGap 加载 index.html 时也是如此。
但是,解决方案是等待 PhoneGap 完全加载时触发的 deviceready 事件:
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
看看这个: 在 iPhone 上使用 PhoneGap 的位置许可警报
第二个似乎是 Webkit 警报。为了防止这种情况,您似乎必须简单地将所有 js 文件移动到根目录。告诉我,如果它有效,因为我将不得不很快解决同样的问题。
终于解决了这个问题。
在 index.html 中,只需将您的 cordova.js 向上移动
<script src="cordova.js"></script>
作为要包含的第一个 js 文件(特别是确保它在 maps include js 之上)。这将确保提示只显示一次
我通过移动解决了这个问题
<script src="cordova.js"></script>
作为要包含的最后一个脚本