首页 > 解决方案 > 如何从 Firebase 存储中查看 PDF - SwiftUI PDFVIEW

问题描述

我在尝试在我的 SwiftUI 应用程序中显示存储在 Firebase Storage 中的 PDF 时遇到一些问题。

我已成功完成以下工作;

目前PDFKITVIEW出现但没有任何显示,也没有错误。我错过了什么?

显示 PDFKITVIEW

.sheet(isPresented: $isShowingDoc) {
    PDFKitView(path: model.object.docURL) // Path to firebase storage is correct 
}

PDFKITVIEW

import SwiftUI
import PDFKit

struct PDFKitView : UIViewRepresentable {
    
    private var url: URL?
    
    init(path: String) {
        
        // Get url from path
        let dm = DataManager()
        url = dm.urlForDocPath(path: path)
    }
    
    func makeUIView(context: Context) -> UIView {
        let pdfView = PDFView()

        if let url = url {
            pdfView.document = PDFDocument(url: url)
        }
        
        return pdfView
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        // Empty
    }
    
}

数据管理器

func getURLFromFirestore(path: String, success:@escaping (_ docURL:URL)->(),failure:@escaping (_ error:Error)->()){
    
    let storage = Storage.storage().reference(withPath: path)
     storage.downloadURL { (url, error) in
         if let _error = error{
             print(_error)
             failure(_error)
         } else {
             if let docURL = url {
                 success(docURL)
             }
         }
     }
}

func urlForDocPath(path: String) -> URL? {
    var url: URL?
    
    getURLFromFirestore(path: path,  success: { (docURL) in
        url = docURL
    }) { (error) in
        print(error)
    }
    
    return url
}

标签: iosswiftswiftuipdfkit

解决方案


我不能将此作为评论发布,因为我没有足够的声誉这样做,但似乎问题可能出在您的 urlForDocPath 函数中,该函数尝试执行异步操作但同步返回。

你能检查一下PDFKitView上的url是否不为零吗?因为如果是这样,它将证明我的观点。

尚未在 Xcode 中尝试过,但需要如下所示:

func urlForDocPath(path: String, success: @escaping (_ docURL:URL?)->(), failure: @escaping (_ error:Error)->()) {
    var url: URL?

    getURLFromFirestore(path: path,  success: { (docURL) in
        success(docURL)
    }) { (error) in
        failure(error)
    }
}

推荐阅读