如何在 Swift 3 的 WKWebView 中注入 javascript

Posted

技术标签:

【中文标题】如何在 Swift 3 的 WKWebView 中注入 javascript【英文标题】:How to inject a javascript in WKWebView in Swift 3 【发布时间】:2017-01-25 16:02:36 【问题描述】:

我试图通过在整个 javascript 中注入新的 CSS 规则来排除一些网页元素,如侧边栏,我在 xcode 中创建了一个新的 javascript 文件,带有一个新的样式标签来隐藏我在 Google chrome 开发人员工具中检查的侧边栏并结束使用此代码:

var styleTag = document.createElement("style");
styleTag.textContent = '.sidebar display:none;';
document.documentElement.appendChild(styleTag);

并创建了 WKWebViewConfiguration 对象,该对象包含一些属性,允许在本机代码和托管 Web 内容之间创建桥梁,如 here 所述,但仍然无法运行此脚本。

这是我完整的 ViewController 代码:

import UIKit
import WebKit

class scrapedBrowser: UIViewController, WKNavigationDelegate 

var webView: WKWebView!
var progressView: UIProgressView!

override func loadView() 

    webView = WKWebView()
    webView.navigationDelegate = self
    view = webView


required init?(coder aDecoder: NSCoder) 
    let config = WKWebViewConfiguration()
    let scriptURL = Bundle.main.path(forResource: "hideSections", ofType: "js")
    let scriptContent:String?
    do 
        scriptContent = try String(contentsOfFile: scriptURL!, encoding: String.Encoding.utf8)
    
    catch _ 
        scriptContent = nil
    

    let script = WKUserScript(source: scriptContent!, injectionTime: .atDocumentStart, forMainFrameOnly: true)
    config.userContentController.addUserScript(script)
    super.init(coder: aDecoder)
    self.webView?.navigationDelegate = self


override func viewDidLoad() 
    super.viewDidLoad()

    let url = URL(string: "http://yourwebsite.com/")!
    let request = URLRequest(url: url)
    webView.load(request)
    webView.allowsBackForwardNavigationGestures = true


func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
    title = webView.title



【问题讨论】:

有一些对 JSContext 的引用应该对你以后的工作有所帮助。 developer.apple.com/reference/javascriptcore/jscontexthere 上有一个 swift 3 线程 感谢@JesseC,这是在 ios 应用程序中通过 JavaScript 注入 CSS 的一个很好的例子,已经实现了这个并让我的应用程序根据需要运行。 【参考方案1】:

您需要将config 分配给WKWebView

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

【讨论】:

【参考方案2】:

您已经创建了配置并在 init 中添加了脚本,但您没有保留对配置的引用。稍后在 loadView 上,您正在创建 wkwebview,而不是设置您之前在 init 中创建的配置

【讨论】:

以上是关于如何在 Swift 3 的 WKWebView 中注入 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 在 WKWebView 的页面中间显示活动指示器?

如何在 WKWebView swift 5 中更改字体大小?

如果没有在 Swift 中加载 URL,如何使 WKWebView 不可滚动?

在 iOS 10 + Swift 3 中以编程方式在我的 WKWebView 上方添加 UILabel

在 Swift 中使用 WKWebView 进行身份验证

如何将 swift 对象传递给 javascript (WKWebView / swift)