You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:59