【问题标题】:Why am I not able to load valid PDF file with WKWebView?为什么我无法使用 WKWebView 加载有效的 PDF 文件?
【发布时间】:2021-12-27 10:22:15
【问题描述】:

我正在尝试使用以下代码使用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 的原因如下:

  1. 一旦 URL 完成加载(有或没有错误),我可以得到回调
  2. 我还需要加载其他类型的内容,例如PPT,这样我就可以复用WKWebiew代码了。

使用WKWebiew 无法加载 PDF 可能是什么问题。是 PDF 的问题,还是 URL 的问题,或者我使用 WKWebiew 加载它的方式?

【问题讨论】:

    标签: ios wkwebview nsurl ios-pdfkit


    【解决方案1】:

    你直接提供的代码不起作用,导致如下错误

    WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, domain=WebKitErrorDomain, code=102

    我没有找到任何有关此特定错误的官方苹果文档,但简单的搜索指向某种中断。

    作为替代方案,您可以尝试从 URL 加载数据:

        if let data = try? Data(contentsOf: url) {
            self.webView.load(data, mimeType: "", characterEncodingName: "", baseURL: url)
        }
    

    但这会导致您在问题中显示的奇怪页面。

    在这里,Web 视图不知道您正在尝试显示 PDF。只需提供内容类型即可解决问题。

        if let data = try? Data(contentsOf: url) {
            self.webView.load(data, mimeType: "application/pdf", characterEncodingName: "UTF8", baseURL: url)
        }
    

    因此,您需要确保 Web 视图知道您要加载的内容类型。 对于您想要支持的各种文件类型,您将如何做到这一点是您需要弄清楚的另一个问题。

    【讨论】:

    • 感谢您的全面回答。在 PDF 的情况下,我尝试通过提供 mimeType 来加载数据,但我得到了相同的结果。
    • 除此之外的 PDF 可以正确打开。
    • 答案已被接受,因为它解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2015-01-02
    • 1970-01-01
    • 2015-01-01
    • 2013-12-31
    • 2019-03-23
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多