我在我的應用程序中有一個WKWebView
,當我開始瀏覽www.google.com或任何其他需要位置服務的網站時,會彈出一個窗口,要求獲得訪問設備位置的權限,即使我已經接受分享我的位置。如何防止WKWebView重複請求訪問位置的權限?
我做的唯一處理這個位置的東西是我在我的info.plist
中添加了NSLocationWhenInUseUsageDescription
屬性。
我在網上找不到任何答案,所以任何想法將非常感激。
我在我的應用程序中有一個WKWebView
,當我開始瀏覽www.google.com或任何其他需要位置服務的網站時,會彈出一個窗口,要求獲得訪問設備位置的權限,即使我已經接受分享我的位置。如何防止WKWebView重複請求訪問位置的權限?
我做的唯一處理這個位置的東西是我在我的info.plist
中添加了NSLocationWhenInUseUsageDescription
屬性。
我在網上找不到任何答案,所以任何想法將非常感激。
原來這很難,但可以做。您必須注入攔截請求的JavaScript代碼到navigator.geolocation
並將它們傳送到您的應用程序,然後使用CLLocationManager
獲取位置,然後將位置注入JavaScript。
下面是簡要方案:
添加WKUserScript
您WKWebView
配置,其覆蓋的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
的幫助下找到您的位置。
現在是時候將位置注入發出請求的JavaScript與webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})")
。 當然你的注入JavaScript應該有didUpdateLocation
函數準備啓動已保存的成功hanlder。
相當長的算法,但它的工作原理!