PDFKit的PDFDocument init(url:URL)不适用于HTTPS

时间:2017-08-16 15:39:40

标签: ios swift ios11

当我尝试使用PDFDocument.init(url: )时,我发现它适用于http,但不适用于https网址。有谁知道为什么?

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

2 个答案:

答案 0 :(得分:4)

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

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

所以为了回答你的问题,我猜测为什么PDFDocument不支持HTTPS是因为像这样的同步初始化程序不是通过网络加载某些东西的推荐方法,因此,放了很多为此目的设计它的工作不是优先事项。

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

答案 1 :(得分:3)

@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)
        }
    }