iOS开发:如何将UIWebView加载的PDF保存至iBooks?
如何将UIWebView中加载的PDF保存到iBooks?
嘿,我能理解你想把WebView里的PDF导出到iBooks的需求。首先得提一句:UIWebView早在iOS 12就被苹果弃用了,新项目建议换成WKWebView,但咱先针对你当前的代码场景来解决问题。
核心思路是:直接获取PDF的原始数据,再通过系统的文档交互控制器分享到iBooks——因为UIWebView没有公开API能直接提取已加载的PDF内容,从原URL下载数据是最可靠的方式。
步骤1:修改加载逻辑,同时下载PDF数据
先把你的加载代码改成同时下载PDF数据,这样后面才能用来保存:
// 先在ViewController里定义一个变量存PDF数据 var pdfData: Data? override func viewDidLoad() { super.viewDidLoad() loadPDFAndDownloadData() } func loadPDFAndDownloadData() { guard let pdfUrl = URL(string: "https://www.tutorialspoint.com/swift/swift_tutorial.pdf") else { print("无效的PDF链接") return } // 先下载PDF数据 URLSession.shared.dataTask(with: pdfUrl) { [weak self] data, _, error in guard let self = self, let data = data, error == nil else { print("PDF下载失败:\(error?.localizedDescription ?? "未知错误")") return } self.pdfData = data // 回到主线程加载WebView DispatchQueue.main.async { let request = URLRequest(url: pdfUrl) self.webView.loadRequest(request) } }.resume() }
步骤2:添加保存到iBooks的触发逻辑
比如你可以加一个按钮,点击后执行以下代码:
@IBAction func saveToIBooksButtonTapped(_ sender: UIButton) { guard let pdfData = pdfData else { print("没有可用的PDF数据,请检查下载是否完成") return } // 把PDF数据写入临时文件(系统分享需要文件URL) let tempDirectory = NSTemporaryDirectory() let tempFileName = "temp_swift_tutorial.pdf" let tempFileUrl = URL(fileURLWithPath: tempDirectory).appendingPathComponent(tempFileName) do { try pdfData.write(to: tempFileUrl) // 创建文档交互控制器,用来唤起系统分享菜单 let docController = UIDocumentInteractionController(url: tempFileUrl) docController.delegate = self // 指定文件类型为PDF,确保iBooks能识别 docController.uti = "com.adobe.pdf" // 从按钮位置弹出分享菜单 docController.presentOptionsMenu(from: sender.bounds, in: view, animated: true) } catch { print("写入临时文件失败:\(error.localizedDescription)") } }
步骤3:实现文档交互控制器的代理
必须实现这个代理方法,不然分享菜单可能无法正常弹出:
extension YourViewController: UIDocumentInteractionControllerDelegate { func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { return self } }
额外注意点
- 如果你的PDF是本地文件,直接用本地文件URL就行,不需要走URLSession下载。
- 如果用的是HTTP链接(不是HTTPS),需要在
Info.plist里配置NSAppTransportSecurity的NSAllowsArbitraryLoads为YES(不过苹果推荐尽量用HTTPS)。 - 再次建议迁移到WKWebView,它性能更好,还有
WKNavigationDelegate能更精准地监听加载状态,后续维护也更有保障。
内容的提问来源于stack exchange,提问作者Visal Sambo
相关产品推荐
相关产品推荐

