我自己解决了。
我可以通过WKUIDelegate的optional func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?方法处理水龙头
编辑 - 根据@SeriousSam 在评论中的要求添加代码
// MARK: - WKUIDelegate
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
var urlString = navigationAction.request.url
let lastPathComponent = urlString!.lastPathComponent
let encodedLastPathComponent = lastPathComponent.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
urlString?.deleteLastPathComponent()
let encodedUrl = urlString!.absoluteString+encodedLastPathComponent!
let jsHandler = "var xhr = new XMLHttpRequest;xhr.responseType = 'blob';xhr.onload = function() {var recoveredBlob = xhr.response;var reader = new FileReader;reader.onload = function() {var blobAsDataUrl = reader.result;window.location = blobAsDataUrl;};reader.readAsDataURL(recoveredBlob);};xhr.open('GET', '\(encodedUrl)');xhr.setRequestHeader(\"Cache-Control\", \"no-store\");xhr.send();"
webView.evaluateJavaScript(jsHandler, completionHandler: nil)
}
return nil
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url {
if (url.absoluteString.hasPrefix("data:")) {
let splitted = url.absoluteString.components(separatedBy: "base64,")
if splitted.count == 2 {
if splitted[0].contains("csv") {
self.documentName = "export.csv"
}
if let data = Data(base64Encoded: splitted[1]), let documentName = self.documentName {
let fileName = String(format: "%@.%@", ProcessInfo.processInfo.globallyUniqueString, "\((documentName as NSString).pathExtension)")
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
do {
try data.write(to: fileURL, options: .atomicWrite)
// show the CSV document ...
decisionHandler(.cancel)
return
} catch {
let alert = UIAlertController(title: NSLocalizedString("Errore", comment: "Error Alert Title"), message: error.localizedDescription, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
decisionHandler(.cancel)
return
}
}
}
}
}
decisionHandler(.allow)
}