从Firebase下载pdf并将其本地存储在iOS上
我需要从存储器下载一份pdf文件,并将其保存在本地的iOS设备上,以便可以在文件中看到它 以下代码取自我正在使用的文档:从Firebase下载pdf并将其本地存储在iOS上,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我需要从存储器下载一份pdf文件,并将其保存在本地的iOS设备上,以便可以在文件中看到它 以下代码取自我正在使用的文档: override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let userID = Auth.auth().currentUser!.uid print(userID)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let userID = Auth.auth().currentUser!.uid
print(userID)
// Get a reference to the storage service using the default Firebase App
let storage = Storage.storage()
// Create a storage reference from our storage service
let storageRef = storage.reference()
// Create a reference to the file you want to download
let islandRef = storageRef.child("pdf/sample.pdf")
// Create local filesystem URL
let localURL = URL(string: "pdf/sample.pdf")!
// Download to the local filesystem
let downloadTask = islandRef.write(toFile: localURL) { url, error in
if let error = error {
// Uh-oh, an error occurred!
} else {
// Local file URL for "images/island.jpg" is returned
}
}
}
当我尝试运行此ViewController时,它不会崩溃,但会抛出以下错误:
“无法打开文件,因为不支持指定的URL类型。”UserInfo={NSURL=pdf/sample.pdf}
Firebase存储中的文件保存在名为
pdf/sample.pdf
的文件夹中。最后,我希望从存储器中获取引用,并将其传递到RealtimeDatabase
,以便用户可以通过在表视图中查看有关它的详细信息来下载它 打开文件时,应该使用URL(string:string)
而不是URL(fileURLWithPath:string)
。我认为需要做的是指定要将下载的文档保存到本地文件系统的路径。假设您想使用临时文件夹保存您的pdf
。您可以尝试以下操作:
let tmporaryDirectoryURL = FileManager.default.temporaryDirectory
let localURL = tmporaryDirectoryURL.appendingPathComponent("sample.pdf")
islandRef.write(toFile: localURL) { url, error in
if let error = error {
print("\(error.localizedDescription)")
} else {
self.presentActivityViewController(withUrl: url)
}
}
下载文件后,为了将其保存在文件应用程序中,您需要使用UIActivityViewController
func presentActivityViewController(withUrl url: URL) {
DispatchQueue.main.async {
let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
self.present(activityViewController, animated: true, completion: nil)
}
}
我还没有测试它,但我的假设是,您出现此错误是因为您的
localURL
变量不是文件系统URL。我需要添加任何其他内容来启动下载吗?您尝试过吗?我不熟悉Firebase API,但URL肯定是个问题。是的,我熟悉。它不会记录错误,但不会启动下载。下面是我所做的更改let localURL=URL(fileURLWithPath:“pdf/sample.pdf”)
@marosoaie是正确的,但我认为如果它仍然不起作用,那么可能是您必须在.plist文件中添加NSAppTransportSecurity
。如果您选中此项,那么您的问题可能会得到解决。@Emon我在info.plist文件中做了以下更改,我添加了这段代码NSAppTransportSecurity nsallowsrabiryloads
。不幸的是,它不起作用。您仍然面临相同的错误?@Emon没有错误,但该文件不会下载。现在检查您的url,它是否是您期望的url?出现以下错误:无法将“url”类型的值转换为预期的参数类型“String”
抱歉。我更新了我的答案以直接使用url,而不是再次重新创建。进行了更改,没有错误。但是下载过程没有启动。好的。我又做了一次编辑。添加downloadTask.resume()
。正在进入完成块?完成块在必须打印URL时抛出错误,下面是错误load failed with error error Domain=NSURLErrorDomain code=-999“cancelled”UserInfo={NSErrorFailingURLStringKey=https://firebasestorage.googleapis.com/v0/b/project-6a073.appspot.com/o/pdf%2Fsample.pdf?alt=media,n错误失败键=https://firebasestorage.googleapis.com/v0/b/nameoftheproject-6a073.appspot.com/o/pdf%2Fsample.pdf?alt=media,_nsurlerorelatedurlSessionTaskErrorKey=(“本地下载任务”)
我已尝试缩短错误,将其添加到此处。