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

У меня возникают проблемы с отображением PDF-файла, хранящегося в Firebase Storage, в моем приложении 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
    }
    
}

Менеджер данных

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
}

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

Asperi 18.12.2020 03:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
794
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)
    }
}

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

RileyDev 19.12.2020 05:50

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

Burak Akkaş 19.12.2020 15:27

Другие вопросы по теме