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

Posted

技术标签:

【中文标题】是否可以在 WKWebView 中关闭位置权限?【英文标题】:Is it possible to turn off location permission in WKWebView? 【发布时间】:2018-07-29 02:51:44 【问题描述】:

我想知道是否可以阻止 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

【问题讨论】:

停用 JavaScript 仍然需要Javascript来加载网站上的数据。 如果您在文档末尾 (.atDocumentEnd) 插入脚本,您将有机会执行网页中的所有 javascript。尝试将其插入.atDocumentStart Hmm... 再看看你的脚本,// 组件可能会导致问题,因为它可能导致其余代码被注释掉,从而导致 JS 代码无效。尝试从你注入的脚本中删除那些 就是这样!我刚刚删除了 // 并且它起作用了。谢谢! 【参考方案1】:

几点说明:

    .atDocumentEnd 表示您的脚本将在页面加载后执行,这可能会导致 javascript 在您劫持位置功能之前要求运行位置;使用.atDocumentStart 可能会获得更好的结果 脚本中有// 序列,这可能会导致脚本的其余部分被解释为 cmets,从而导致注入不正确的 JS 函数的签名似乎与html 5 Geolocation API 不匹配,尽管考虑到我们在 JS 世界中并且函数体是空的,但这可能没有什么区别。

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

【讨论】:

这是 //。谢谢!【参考方案2】:

我遇到了同样的问题,上面的方法只是部分起作用。我相信这个问题更正确的解决方案是使用 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 似乎应该为您处理这个问题,它应该只是自动执行此操作(并且可能会向控制台发送一条消息以让您知道它做过)。我要去报个雷达...

【讨论】:

以上是关于是否可以在 WKWebView 中关闭位置权限?的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序在android中关闭,如何在服务应该工作时添加位置权限?

如果从设置中关闭位置,则获取位置

是否可以在vscode中关闭拖放功能?

如何在'rake test'中关闭警告'ruby -w'?

有啥方法可以使用 c# 在 Windows 中关闭“互联网”?

是否可以从 iPhone 应用程序中关闭漫游?