PDFKit PDF 文档单元(url:URL)不适用于 HTTPS

PDFKit's PDFDocument init(url: URL) does not work with HTTPS

当我尝试使用 PDFDocument.init(url: ) 时,我注意到它适用于 http 但不适用于 https URL。有谁知道为什么?

import PDFKit

let httpURL = URL(string: "http://www.axmag.com/download/pdfurl-guide.pdf")!
let doc1 = PDFDocument(url: httpURL) //makes a PDFDocument

let httpsURL = URL(string: "https://www.gnu.org/s/libmicrohttpd/tutorial.pdf")!
let doc2 = PDFDocument(url: httpsURL) //nil

乍一看,这似乎是 Cocoa 框架中的一个常见问题;许多 API 接受 URL,但在许多情况下,不清楚他们会接受什么方案。有些只采用文件 URL,有些只采用 HTTP,有些采用 HTTP 和 HTTPS,并且文档通常不会说明具体情况。通常一个很好的假设是,如果文档没有另外说明,API 可能只接受 file: 个 URL。

然而,当你看得更深一点时,它并没有乍一看那么严重。在你的情况下,你可以通过使用 Data 的 try init(contentsOf:) 确实 支持 HTTPS,然后从中初始化你的 PDFDocument 来简单地解决这个问题,但这是这实际上是最好的方法。我实际上建议做的是使用像 URLSession 这样的异步 API 从服务器加载 PDF 数据。我建议这样做的原因是从网络加载数据需要时间,尤其是 PDF 文件,有时可能会非常大,如果您只是尝试在主线程上同步加载文件,您将阻止它并使您的应用程序看起来好像被锁定了。通过异步加载 PDF 数据,您可以为您的用户提供进度信息,以及取消操作的方法,如果出现问题,例如下载过程中网络中断,您可以立即处理该错误明智的方式。一旦数据全部下载完毕,您就可以使用生成的数据对象来初始化 PDFDocument.

所以回答你的问题,我猜为什么 PDFDocument 不支持 HTTPS 是因为像这样的同步初始化器不是通过网络加载东西的推荐方式,因此,把为此目的设计它的大量工作并不是优先事项。

以下是 link Apple 建议您使用异步网络的建议:https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010220-CH12-SW3

@IBOutlet var pdfView: PDFView!

var pdfDOC: PDFDocument!

 override func viewDidLoad() {
        super.viewDidLoad()
        downloadPDF()
    }

  func downloadPDF(){
        let urlString = "https://www.tutorialspoint.com/swift/swift_tutorial.pdf"
        guard let url = URL(string: urlString) else {return}
        do{
            let data = try Data(contentsOf: url)
            pdfDOC = PDFDocument(data: data)
            pdfView.displayMode = .singlePageContinuous
            pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            pdfView.displaysAsBook = true
            pdfView.displayDirection = .vertical
            pdfView.document = pdfDOC
            pdfView.autoScales = true
            pdfView.maxScaleFactor = 4.0
            pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
        }catch let err{
            print(err.localizedDescription)
        }
    }