RileyDev
RileyDev

Reputation: 2525

How to view PDF from Firebase Storage - SwiftUI PDFVIEW

I am having some issues trying to display a PDF which is stored in Firebase Storage in my SwiftUI app.

I have successfully done the following;

Currently the PDFKITVIEW appears but with nothing to show, and no errors. What am I missing ?

Show 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
    }
    
}

DataManager

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
}

Upvotes: 1

Views: 1064

Answers (1)

Burak Akkaş
Burak Akkaş

Reputation: 535

I cannot post this as a comment since I haven't got enough reputation to do so but seems like the problem can be in your urlForDocPath function, which tries to do an async operation but returning synchronously.

Could you check if url is not nil on the PDFKitView? Because if it is, it will prove my point.

Didn't tried yet in Xcode but needs to be something like following:

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)
    }
}

Upvotes: 1

Related Questions