2017-08-16 32 views
0

當我嘗試使用PDFDocument.init(url:)時,我注意到它與http配合使用,但與https URL配合使用。有誰知道爲什麼?PDFKit的PDFDocument init(url:URL)不適用於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 

回答

1

乍一看,這似乎是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