У меня возникают проблемы с отображением PDF-файла, хранящегося в Firebase Storage, в моем приложении SwiftUI.
Я успешно сделал следующее;
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
}
}
Менеджер данных
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
}
Я не могу опубликовать это как комментарий, так как у меня недостаточно репутации для этого, но похоже, что проблема может быть в вашей функции 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)
}
}
Да, кажется, что URL-адрес имеет нулевое значение, а urlForDocPath
— это асинхронная задача. Я просто поместил все методы в свой ViewModel
и выполнил задачу, прежде чем представить PDFVIEW
, который напрямую использовал свойство url
из моей модели.
рад, что вы это исправили.
PDFDocument использует собственный сеанс URL, так что насчет аутентификации/ключей/билетов для Firestore? PDFDocument работает с URL как с прямыми открытыми ресурсами. Поэтому я предполагаю, что Firestore просто не разрешает доступ к вашему PDF-документу молча. Я думаю, вы скачали документ в локальную файловую систему и оттуда показывали его в PDFView.