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)
}
}
当我尝试使用 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)
}
}