Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PhoneGap调用iPhone定位服务请求URL访问gps的权限,而不是应用程序_Iphone_Cordova_Uiwebview_Geolocation - Fatal编程技术网

使用PhoneGap调用iPhone定位服务请求URL访问gps的权限,而不是应用程序

使用PhoneGap调用iPhone定位服务请求URL访问gps的权限,而不是应用程序,iphone,cordova,uiwebview,geolocation,Iphone,Cordova,Uiwebview,Geolocation,我有一个应用程序正在利用PhoneGap(版本1.4.1)。它不是一个普通的PhoneGap应用程序,因为该应用程序是使用MonoTouch而不是Xcode构建的。PhoneGap库正在加载到IUWebView中,PhoneGap-1.4.1.js文件位于远程服务器上。我可以调用PhoneGap API中的函数,一切正常;我唯一的问题是PhoneGap地理定位API。虽然地理定位可以工作,但每次加载网页时,都会请求使用iPhone locations服务的权限,但它不会请求对我的应用程序名的权限

我有一个应用程序正在利用PhoneGap(版本1.4.1)。它不是一个普通的PhoneGap应用程序,因为该应用程序是使用MonoTouch而不是Xcode构建的。PhoneGap库正在加载到IUWebView中,PhoneGap-1.4.1.js文件位于远程服务器上。我可以调用PhoneGap API中的函数,一切正常;我唯一的问题是PhoneGap地理定位API。虽然地理定位可以工作,但每次加载网页时,都会请求使用iPhone locations服务的权限,但它不会请求对我的应用程序名的权限,而是请求对页面源所在的URL的权限。所以警报会说“http://xxx.xxx.xxx.xxx 如果用户回答“允许”,iphone将不记得这一点,因为它将在下次重新加载页面时再次询问


有人知道为什么我对PhoneGap地理定位API的调用会这样做吗?这是让PhoneGap请求我的应用程序使用定位服务而不是URL的某种方式吗?

这是因为PhoneGap使用网络视图。和Safari一样,webview可以加载任何URL,因此它必须逐个URL进行查询。

我找到了解决此问题的方法。PhoneGap使用自己的函数替换所有UIWebView/MobileSafari navigator.geolocation函数,以便调用navigator.geolocation函数将执行相应的PhoneGap函数。要查看javascript源代码中发生的情况,请搜索以下行:

if (typeof navigator._geo == "undefined") 
这一行下面的描述描述了PhoneGap试图避免的问题。不过,主要问题是我在jquery的document.ready处理程序中执行了以下操作:

navigator.geolocation.getCurrentPosition(onGpsSuccess,onGpsError,{enableHighAccurance:true})

在执行过程中的这一点上,PhoneGap初始化尚未完成,因此对navigator.geolocation.getCurrentPosition的调用调用调用了MobileSafari的
版本的getCurrentPosition,而不是PhoneGap。我通过放置警报(navigator.\u geo)确定初始化未完成;在document.ready中,发现它返回未定义

然后,解决方案是用以下代码替换文档中的代码行:

document.addEventListener("deviceready", function() {
    navigator.geolocation.getCurrentPosition(onGpsSuccess, onGpsError, { enableHighAccuracy: true });
}, false); 
这确保了仅在PhoneGap完成初始化时才调用navigator.geolocation

因此,如果遇到此问题,请检查以下各项:

document.addEventListener("deviceready", function() {
    navigator.geolocation.getCurrentPosition(onGpsSuccess, onGpsError, { enableHighAccuracy: true });
}, false); 
  • 您正在使用处理此问题的最新版本的PhoneGap
  • 在PhoneGap准备就绪之前,您不会尝试使用navigator.geolocation