如何防止WKWebView重复请求访问位置的权限?
我在我的应用程序中有一个WKWebView
,当我开始浏览www.google.com或任何其他需要位置服务的网站时,会popup一个窗口,要求获得访问设备位置的权限,即使我已经接受分享我的位置。
我做的唯一一件事就是我在info.plist
添加了NSLocationWhenInUseUsageDescription
属性。
我无法在网上find任何答案,所以任何想法将非常感激。
原来这很难,但可以做。 你必须注入JavaScript代码,拦截请求到navigator.geolocation
并将它们传送到你的应用程序,然后用CLLocationManager
获取位置,然后将位置注入到JavaScript中。
以下是简要的scheme:
-
将
WKUserScript
添加到您的WKWebView
configuration,该configuration将覆盖navigator.geolocation
方法。 注入JavaScript应该看起来像这样:navigator.geolocation.getCurrentPosition = function(success, error, options) { ... }; navigator.geolocation.watchPosition = function(success, error, options) { ... }; navigator.geolocation.clearWatch = function(id) { ... };
-
使用
WKUserContentController.add(_:name:)
将脚本消息处理程序添加到您的WKWebView
。 注入JavaScript应该调用你的处理程序,如下所示:window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition');
-
当一个网页将要求一个位置,这个方法将触发
userContentController(_:didReceive:)
所以你的应用程序会知道网页正在请求位置。 像往常一样在CLLocationManager
的帮助下find你的位置。 -
现在可以通过
webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})")
将位置注入请求的JavaScript。 当然你的注入JavaScript应该有didUpdateLocation
函数准备启动保存的成功hanlder。
相当长的algorithm,但它的工作原理!