如何创建一个接受 URL 参数并使用 evaluateJavaScript 返回 HTML 的 macOS 方法?
我想抓取一个使用 JavaScript 的 URL,所以 String(contentsOf: url) 和 URLSession.shared.dataTask(with: url) 似乎都不起作用。
下面的代码有效,但它创建了一个全局,而不是返回一个字符串。我想要可以在其他类似项目中重用的代码。
我可以使用 didSet{} 或 GCD DispatchGroup() 和 group.enter() 和 group.leave() 创建类或 ViewController 扩展来创建仅在页面加载和 JavaScript 完成时返回的简单方法吗?我假设我需要一个类来捕获 WKNavigationDelegate 调用。
我想要一个 macOS 方法,而不是 iOS 方法。
这是我的工作代码:
ViewController.swift
import Cocoa
import WebKit
class ViewController: NSViewController, WKNavigationDelegate {
var webView: WKWebView!
var webString: String = "" {
didSet {
print("webString: \(webString.count) Bytes")
print("\(webString)")
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.webView = WKWebView()
webView.navigationDelegate = self
let url = URL(string: "https://www.someWebsite.com")!
let myRequest = URLRequest(url: url)
webView.load(myRequest)
}
// WKNavigationDelegate methods
func webView(_ webView: WKWebView, didFinish: WKNavigation!) {
print(#function)
webView.evaluateJavaScript(
"document.documentElement.outerHTML.toString()",
completionHandler: { (html: Any?, error: Error?) in
self.webString = html as! String
print("In compHandler, HTML: \(self.webString.count) bytes\n")
})
}
func webView(_ webView: WKWebView, didFail: WKNavigation!, withError: Error) {
print(#function)
print("ERROR: Error=\(withError)")
}
我想要与我用于同步下载的代码类似的东西:
func downloadDataTask(url: String) -> String {
var returnStr = ""
guard let myURL = URL(string: url) else {
showErrorAlert(
title: "ERROR: Invalid URL",
message: "Invalid URL in downloadDataTask()\n URL:'\(url)'")
return("Error: Invalid URL: '\(url)'")
}
let group = DispatchGroup()
group.enter()
let task = URLSession.shared.dataTask(with: myURL) { data, urlResponse, error in
if let myData = data {
let string = String(decoding: myData, as: UTF8.self)
returnStr = string
group.leave()
} else {
showErrorAlert(
title: "ERROR: Unable to load HTML from URL",
message: "Unable to load HTML in downloadDataTask()\n")
group.leave()
}
}
task.resume()
// wait for async completion handler task to complete
group.wait()
return(returnStr)
}
任何帮助,将不胜感激!