为什么我无法使用 WKWebView 加载有效的 PDF 文件?
Why am I not able to load valid PDF file with WKWebView?
我正在尝试使用以下代码使用 WKWebiew
从 URL 加载 PDF,并且我还添加了 WKWebiew
.
的必要委托方法
func loadPDFDocument()
{
if let url = URL(string: self.contentURL)
{
print("URL: \(url)")
if UIApplication.shared.canOpenURL(url) {
self.webView.navigationDelegate = self
self.webView.load(URLRequest(url: url))
} else {
self.showInvalidURLError()
}
} else {
self.showInvalidURLError()
}
}
正在加载,但没有显示实际内容,而是显示如下图:
现在,我已经使用以下代码在 PDFKit 上进行了尝试,它正在加载实际内容。
func loadPDFDocument()
{
let pdfView = self.createPdfView(withFrame: self.view.bounds)
if let pdfDocument = self.createPdfDocument() {
self.view.addSubview(pdfView)
pdfView.document = pdfDocument
}
}
func createPdfDocument() -> PDFDocument?
{
if let resourceUrl = URL(string: "https://d1shcqlf263trc.cloudfront.net/Engage/Contents/LearningStore/16335111672611633500529010123TestPDFfile06Oct2021.pdf") {
return PDFDocument(url: resourceUrl)
}
return nil
}
func createPdfView(withFrame frame: CGRect) -> PDFView
{
let pdfView = PDFView(frame: frame)
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
pdfView.autoScales = true
return pdfView
}
我想使用 WKWebiew
加载此 PDF 的原因如下:
- 我可以在 URL 完成加载(有或没有错误)后收到回调
- 我还需要加载其他类型的内容,例如PPT,所以我可以重复使用
WKWebiew
代码。
PDF 无法使用 WKWebiew
加载的问题可能是什么。是 PDF 的问题,还是 URL 的问题,或者我用 WKWebiew
加载它的方式?
您直接提供的代码不起作用,导致出现如下错误
WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, domain=WebKitErrorDomain, code=102
我没有找到任何关于此特定错误的官方 Apple 文档,但简单的搜索指向某种中断。
作为替代方案,您可以尝试从 URL:
加载数据
if let data = try? Data(contentsOf: url) {
self.webView.load(data, mimeType: "", characterEncodingName: "", baseURL: url)
}
但这会导致您在问题中显示的奇怪页面。
此处,网络视图不知道您正在尝试显示 PDF。只需提供内容类型即可解决问题。
if let data = try? Data(contentsOf: url) {
self.webView.load(data, mimeType: "application/pdf", characterEncodingName: "UTF8", baseURL: url)
}
因此,您需要确保网络视图知道您要加载的内容类型。
对于您想要支持的各种文件类型,您将如何做到这一点是您需要弄清楚的另一个问题。
我正在尝试使用以下代码使用 WKWebiew
从 URL 加载 PDF,并且我还添加了 WKWebiew
.
func loadPDFDocument()
{
if let url = URL(string: self.contentURL)
{
print("URL: \(url)")
if UIApplication.shared.canOpenURL(url) {
self.webView.navigationDelegate = self
self.webView.load(URLRequest(url: url))
} else {
self.showInvalidURLError()
}
} else {
self.showInvalidURLError()
}
}
正在加载,但没有显示实际内容,而是显示如下图:
现在,我已经使用以下代码在 PDFKit 上进行了尝试,它正在加载实际内容。
func loadPDFDocument()
{
let pdfView = self.createPdfView(withFrame: self.view.bounds)
if let pdfDocument = self.createPdfDocument() {
self.view.addSubview(pdfView)
pdfView.document = pdfDocument
}
}
func createPdfDocument() -> PDFDocument?
{
if let resourceUrl = URL(string: "https://d1shcqlf263trc.cloudfront.net/Engage/Contents/LearningStore/16335111672611633500529010123TestPDFfile06Oct2021.pdf") {
return PDFDocument(url: resourceUrl)
}
return nil
}
func createPdfView(withFrame frame: CGRect) -> PDFView
{
let pdfView = PDFView(frame: frame)
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
pdfView.autoScales = true
return pdfView
}
我想使用 WKWebiew
加载此 PDF 的原因如下:
- 我可以在 URL 完成加载(有或没有错误)后收到回调
- 我还需要加载其他类型的内容,例如PPT,所以我可以重复使用
WKWebiew
代码。
PDF 无法使用 WKWebiew
加载的问题可能是什么。是 PDF 的问题,还是 URL 的问题,或者我用 WKWebiew
加载它的方式?
您直接提供的代码不起作用,导致出现如下错误
WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, domain=WebKitErrorDomain, code=102
我没有找到任何关于此特定错误的官方 Apple 文档,但简单的搜索指向某种中断。
作为替代方案,您可以尝试从 URL:
加载数据 if let data = try? Data(contentsOf: url) {
self.webView.load(data, mimeType: "", characterEncodingName: "", baseURL: url)
}
但这会导致您在问题中显示的奇怪页面。
此处,网络视图不知道您正在尝试显示 PDF。只需提供内容类型即可解决问题。
if let data = try? Data(contentsOf: url) {
self.webView.load(data, mimeType: "application/pdf", characterEncodingName: "UTF8", baseURL: url)
}
因此,您需要确保网络视图知道您要加载的内容类型。 对于您想要支持的各种文件类型,您将如何做到这一点是您需要弄清楚的另一个问题。