#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. рад, что вы это исправили.