是否可以在WKWebView中关闭位置权限?

时间:2018-07-29 02:51:44

标签: javascript swift wkwebview

我想知道是否可以阻止WKWebView显示位置许可提示? (“ website.com”将要使用您的当前位置)我相信它正在显示,因为该网站包含Google地图。我对将位置预加载到其他SO问题所示的位置不感兴趣。我根本不想在WKWebView中使用位置。有没有一种方法可以阻止出现位置许可提示?我尝试注入以下JavaScript,但无法正常工作。

        let contentController = WKUserContentController()

        let scriptSource = "navigator.geolocation.getCurrentPosition = function(success, error, options) { // }; navigator.geolocation.watchPosition = function(success, error, options) { // }; navigator.geolocation.clearWatch = function(id) { // };"
        let script = WKUserScript(source: scriptSource, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
        contentController.addUserScript(script)

        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        webView = WKWebView(frame: .zero, configuration: config)
        self.view = webView

2 个答案:

答案 0 :(得分:1)

一些注意事项:

  1. .atDocumentEnd意味着您的脚本将在页面加载后执行,这可能会导致javascript在劫持位置函数之前询问位置信息;使用.atDocumentStart
  2. 可能会获得更好的结果
  3. 脚本中有//个序列,这很可能导致脚本的其余部分被解释为注释,从而导致注入了不正确的JS
  4. 函数的签名似乎与HTML 5 Geolocation API不匹配,尽管考虑到我们在JS世界中并且函数主体为空,但这可能没有任何作用。

尝试解决上述问题,这可能导致您需要的行为。

答案 1 :(得分:0)

我遇到了同样的问题,以上仅部分解决了问题。我认为解决此问题的更正确方法是使用PERMISSION_DENIED错误代码调用错误回调,以便网站可以在拒绝位置访问时执行所需的操作。这是我最终使用的代码(我只需要getCurrentPosition覆盖,但是如果需要,也可以添加watchPosition一个):

let removeLocationJS = """
navigator.geolocation.getCurrentPosition = function(success, error, options) {
    error({
        PERMISSION_DENIED: 1,
        code: 1
    });
};
"""

let removeLocation = WKUserScript(source: removeLocationJS, injectionTime: .atDocumentStart, forMainFrameOnly: true)
contentController.addUserScript(removeLocation)

let config = WKWebViewConfiguration()
config.userContentController = contentController

let webView = WKWebView(frame: .zero, configuration: config)

真的,如果您的Info.plist中没有条目,WKWebView似乎应该为您解决这个问题,它应该只是自动执行此操作(并且可能会在控制台中吐出一条消息,让您知道它确实)。我要去雷达...