2016-09-23 192 views
6

我在我的應用程序中有一個WKWebView,當我開始瀏覽www.google.com或任何其他需要位置服務的網站時,會彈出一個窗口,要求獲得訪問設備位置的權限,即使我已經接受分享我的位置。如何防止WKWebView重複請求訪問位置的權限?

我做的唯一處理這個位置的東西是我在我的info.plist中添加了NSLocationWhenInUseUsageDescription屬性。

我在網上找不到任何答案,所以任何想法將非常感激。

回答

3

原來這很難,但可以做。您必須注入攔截請求的JavaScript代碼到navigator.geolocation並將它們傳送到您的應用程序,然後使用CLLocationManager獲取位置,然後將位置注入JavaScript。

下面是簡要方案:

  1. 添加WKUserScriptWKWebView配置,其覆蓋的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的幫助下找到您的位置。

  4. 現在是時候將位置注入發出請求的JavaScript與webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})")。 當然你的注入JavaScript應該有didUpdateLocation函數準備啓動已保存的成功hanlder。

相當長的算法,但它的工作原理!