Swift PDFKit/Capacitor无需下载加载PDF 模拟器预览失败求助
问题排查与修复方案
核心问题1:PDFView缺少有效布局约束
你代码中把PDFView的上下左右锚点约束全部注释了,PDFView没有确定的尺寸和位置,自然无法在界面上渲染出来。
核心问题2:网络请求未启动
你创建dataTask后没有调用resume()方法,网络请求根本不会执行。
核心问题3:PDFView重复初始化
你在类定义时已经初始化了一次pdfView,在viewDidLoad中又重新初始化了一次,属于冗余错误。
其他潜在问题
- 没有对生成的
PDFDocument做非空校验,无法排查数据转PDF对象失败的情况 - 如果传入的url是base64格式的data URI,不需要走网络请求,可以直接解析加载
- 如果是远程HTTP url,需要确认已经在Info.plist中配置了ATS非HTTPS域名白名单
修正后完整代码
import Foundation import PDFKit @objc public class PdfViewer: UIViewController, PDFViewDelegate { var pdfView: PDFView = PDFView() public override func viewDidLoad() { super.viewDidLoad() // 删掉重复初始化代码 self.view.addSubview(pdfView) // 布局约束直接在viewDidLoad配置即可,无需放到异步回调 pdfView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pdfView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor), pdfView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor), pdfView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), pdfView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor) ]) // 通用配置提前写好 pdfView.autoScales = true pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical } @objc public func loadPDF(url: String) -> Void { // 兼容base64格式的PDF链接,直接解析不需要走网络请求 if url.hasPrefix("data:application/pdf;base64,") { guard let dataUrl = URL(string: url), let data = try? Data(contentsOf: dataUrl) else { print("Base64格式解析失败") return } DispatchQueue.main.async { guard let doc = PDFDocument(data: data) else { print("PDF数据解析失败") return } self.pdfView.document = doc } return } guard let pdfURL = URL(string: url) else { print("Error: cannot create URL") return } var pdfURLRequest = URLRequest(url: pdfURL) pdfURLRequest.httpMethod = "GET" let session = URLSession.shared let task = session.dataTask(with: pdfURLRequest){ (data, response, error)in if let error = error { print("网络请求失败:\(error.localizedDescription)") return } guard let data = data else { print("返回数据为空") return } print("base64 ------> ", data.base64EncodedString()) DispatchQueue.main.async { guard let doc = PDFDocument(data: data) else { print("PDF数据解析失败") return } self.pdfView.document = doc } } task.resume() // 启动网络请求,原有代码漏了这一行 } }
内容的提问来源于stack exchange,提问作者richa Singh
相关产品推荐
相关产品推荐

