这感觉像是 WKWebView.load(_ data: Data, mimeType MIMEType: String, characterEncodingName: String, baseURL: URL) -> WKNavigation? 中的错误。它应该按照我们尝试使用它的方式工作,但我们是如何解决这个问题的:
声明您的 WKWebView 和自定义方案名称
let webView: WKWebView
let customSchemeName = "custom-scheme-name"
创建 WKURLSchemeHandler 的子类。我们使用 webView 在 webView 的生命周期中显示单个文档(PDF、Word、PowerPoint 或 Excel),因此我们将该文档作为 Data 和 FileTypeInfo 传递,FileTypeInfo 是我们创建的具有文件 MIME 类型的自定义类除此之外,在 WKURLSchemeHandler 的 init 中。
private class ExampleWKURLSchemeHandler: NSObject, WKURLSchemeHandler {
private let data: Data
private let fileTypeInfo: FileTypeInfo
init(data: Data, fileTypeInfo: FileTypeInfo) {
self.data = data
self.fileTypeInfo = fileTypeInfo
super.init()
}
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
if let url = urlSchemeTask.request.url, let scheme = url.scheme, scheme == customSchemeName {
let response = URLResponse.init(url: url, mimeType: fileTypeInfo.mimeType, expectedContentLength: data.count, textEncodingName: nil)
urlSchemeTask.didReceive(response)
urlSchemeTask.didReceive(data)
urlSchemeTask.didFinish()
}
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
//any teardown code you may need
}
}
使用您刚刚创建的自定义方案处理程序类实例化您的 webView:
let webViewConfiguration = WKWebViewConfiguration()
let webViewSchemeHandler = ExampleWKURLSchemeHandler.init(data: data, fileTypeInfo: fileTypeInfo)
webViewConfiguration.setURLSchemeHandler(webViewSchemeHandler, forURLScheme: customSchemeName)
self.webView = WKWebView.init(frame: .zero, configuration: webViewConfiguration)
告诉 webView 使用与您的自定义方案匹配的 URL 加载文档。您可以在 url 中的 customSchemeName 前缀之后传递任何您想要的内容,但对于我们的用例,我们不需要这样做,因为我们已经传递了想要在 WKSchemeHandler 的初始化程序中显示的文档:
guard let url = URL.init(string: "\(customSchemeName):/123") else {
fatalError()
}
webView.load(URLRequest.init(url: url))