如何防止WKWebView重复请求访问位置的权限?

我在我的应用程序中有一个WKWebView ,当我开始浏览www.google.com或任何其他需要位置服务的网站时,会popup一个窗口,要求获得访问设备位置的权限,即使我已经接受分享我的位置。

我做的唯一一件事就是我在info.plist添加了NSLocationWhenInUseUsageDescription属性。

我无法在网上find任何答案,所以任何想法将非常感激。

原来这很难,但可以做。 你必须注入JavaScript代码,拦截请求到navigator.geolocation并将它们传送到你的应用程序,然后用CLLocationManager获取位置,然后将位置注入到JavaScript中。

以下是简要的scheme:

  1. WKUserScript添加到您的WKWebViewconfiguration,该configuration将覆盖navigator.geolocation方法。 注入JavaScript应该看起来像这样:

     navigator.geolocation.getCurrentPosition = function(success, error, options) { ... }; navigator.geolocation.watchPosition = function(success, error, options) { ... }; navigator.geolocation.clearWatch = function(id) { ... }; 
  2. 使用WKUserContentController.add(_:name:)将脚本消息处理程序添加到您的WKWebView 。 注入JavaScript应该调用你的处理程序,如下所示:

     window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition'); 
  3. 当一个网页将要求一个位置,这个方法将触发userContentController(_:didReceive:)所以你的应用程序会知道网页正在请求位置。 像往常一样在CLLocationManager的帮助下find你的位置。

  4. 现在可以通过webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})")将位置注入请求的JavaScript。 当然你的注入JavaScript应该有didUpdateLocation函数准备启动保存的成功hanlder。

相当长的algorithm,但它的工作原理!