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

Javascript 是否可以在WKWebView中关闭位置权限?,javascript,swift,wkwebview,Javascript,Swift,Wkwebview,我想知道是否可以阻止WKWebView显示位置权限提示?(“website.com”希望使用您当前的位置)我相信它正在显示,因为该网站包含谷歌地图。我对在其位置预加载位置不感兴趣,如其他SO问题所示。我只是不想在WKWebView中使用位置。有没有办法阻止出现位置权限提示?我已经尝试注入以下javascript,但它不起作用 let contentController = WKUserContentController() let scriptSource =

我想知道是否可以阻止WKWebView显示位置权限提示?(“website.com”希望使用您当前的位置)我相信它正在显示,因为该网站包含谷歌地图。我对在其位置预加载位置不感兴趣,如其他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
几点注意:

  • .atDocumentEnd
    意味着您的脚本将在页面加载后执行,这可能导致javascript在您劫持位置函数之前请求运行位置;使用
    .atDocumentStart
  • 脚本中有
    /
    序列,这可能会导致脚本的其余部分被解释为注释,从而导致注入不正确的JS
  • 函数的签名似乎不匹配,尽管考虑到我们在JS世界中,函数体是空的,这可能没有什么区别

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

    我也有同样的问题,而上述问题只起到了部分作用。我相信这个问题更正确的解决方法是使用PERMISSION_DENIED错误代码调用错误回调,这样当位置访问被拒绝时,网站可以做它需要做的事情。下面是我最终使用的代码(我只需要getCurrentPosition覆盖,但如果需要,也可以添加watchPosition覆盖):


    实际上,如果您的Info.plist中没有该条目,WKWebView似乎应该为您解决这个问题,它应该会自动执行此操作(并且可能会向控制台发送一条消息,让您知道它执行了此操作)。我要去归档一个雷达…

    停用JavaScriptJavascript仍然需要在网站上加载数据。如果您在文档末尾插入脚本(
    .atDocumentEnd
    ),您就有机会执行网页中的所有javascript。尝试在
    .atDocumentStart
    Hmm处插入它。。。再看一下您的脚本,
    /
    组件可能会导致问题,因为它可能会导致注释掉其余代码,从而导致无效的JS代码。尝试从脚本中删除这些内容,就是这样!我刚取下了//就成功了。非常感谢。这是//。非常感谢。
    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)