Как просмотреть PDF из хранилища Firebase — SwiftUI PDFVIEW

#ios #swift #swiftui #pdfkit

#iOS #swift #swiftui #pdfkit

Вопрос:

У меня возникли некоторые проблемы при попытке отобразить PDF-файл, который хранится в хранилище Firebase в моем приложении SwiftUI.

Я успешно выполнил следующее;

  • Загруженный PDF-файл в хранилище Firebase
  • Получить URL из пути к каталогу
  • Создайте PDFView и передайте URL

В настоящее время 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
    }
    
}
 

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
}
 

Комментарии:

1. PdfDocument использует собственный сеанс URL, так что насчет аутентификации / ключей / билетов для Firestore? PdfDocument работает с URL-адресом так же, как с прямыми открытыми ресурсами. Поэтому я предполагаю, что Firestore просто не разрешает доступ к вашему PDF-документу, молча. Я думаю, вам нужно загрузить документ в локальную файловую систему и оттуда отобразить его в PDFView.

Ответ №1:

Я не могу опубликовать это в качестве комментария, поскольку у меня недостаточно репутации для этого, но, похоже, проблема может быть в вашей функции urlForDocPath, которая пытается выполнить асинхронную операцию, но возвращается синхронно.

Не могли бы вы проверить, не равен ли url нулю в PDFKitView? Потому что, если это так, это докажет мою точку зрения.

Еще не пробовал в 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)
    }
}
 

Комментарии:

1. Да, кажется, что URL-адрес имел нулевое значение, и urlForDocPath это асинхронная задача. Я просто поместил все методы в свой ViewModel и выполнил задачу, прежде чем представить PDFVIEW , который напрямую использовал url свойство из моей модели.

2. рад, что вы это исправили.