在 iphone 的 "files" 目录中找不到已保存的 pdfFile
Saved pdfFile not found in "files" directory on iphone
我在 'SO' 上查找了所有 "save pdf file" 问题,此刻我正为这个问题撞墙:
我下载了一个 pdf 文件(从 firebase 存储)并尝试使用该代码保存它:
static func getPdf(firebaseStoragePath:String){
let ref = Storage.storage().reference().child(firebaseStoragePath)
let documentsURL:NSURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
let fileURL = documentsURL.appendingPathComponent("doc.pdf")
print("***fileURL: ",fileURL ?? "")
let task = ref.write(toFile: fileURL!)
task.observe(StorageTaskStatus.success) { (snap) in
print("success")
}
}
看起来下载成功了,但是文件没有出现在我 iPhone 的 "files" 文件夹下,而且找不到访问它的方法。
打印出的文件 url 如下所示:
file:///var/mobile/Containers/Data/Application/635B2D57-CA7B-44EF-BDF1-4308CABD8ED5/Documents/doc.pdf
我试图将其写入“.downloadsDirectory”(以及其他一些目录),但出现不允许访问的错误。
我做错了什么?
此处您的 pdf 文件存储在您的应用程序的文档 space 中。所以您无法在 Files 应用程序中看到它。应用程序 Document 文件夹中保存的所有文档都可以通过 iTunes 在 文件共享 中查看,但您需要在 Info.plist 第一:
- UIFileSharingEnabled: 应用程序支持 iTunes 文件共享
为了将文档存储在 Files 中,您需要使用 UIDocumentInteractionController
库:
let documentInteractionController = UIDocumentInteractionController()
func downloadPdf(firebaseStoragePath:String){
let ref = Storage.storage().reference().child(firebaseStoragePath)
let documentsURL: NSURL = FileManager.default.urls(for: .temporaryDirectory, in: .userDomainMask).first! as NSURL
let fileURL = documentsURL.appendingPathComponent("doc.pdf")
let task = ref.write(toFile: fileURL!)
task.observe(StorageTaskStatus.success) { (snap) in
DispatchQueue.main.async {
documentInteractionController.url = documentsURL
documentInteractionController.uti = documentsURL.typeIdentifier ?? "public.data, public.content"
documentInteractionController.name = documentsURL.localizedName ?? url.lastPathComponent
documentInteractionController.presentPreview(animated: true)
}
}
}
extension URL {
var typeIdentifier: String? {
return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier
}
var localizedName: String? {
return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName
}
}
不要忘记在 Info.plist 文件中添加这些权限:
- UIFileSharingEnabled: 应用程序支持 iTunes 文件共享
- LSSupportsOpeningDocumentsInPlace:支持就地打开文档
有关文件和UIDocumentInteractionController
的更多信息,您可以查看此blog post。
我在 'SO' 上查找了所有 "save pdf file" 问题,此刻我正为这个问题撞墙:
我下载了一个 pdf 文件(从 firebase 存储)并尝试使用该代码保存它:
static func getPdf(firebaseStoragePath:String){
let ref = Storage.storage().reference().child(firebaseStoragePath)
let documentsURL:NSURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
let fileURL = documentsURL.appendingPathComponent("doc.pdf")
print("***fileURL: ",fileURL ?? "")
let task = ref.write(toFile: fileURL!)
task.observe(StorageTaskStatus.success) { (snap) in
print("success")
}
}
看起来下载成功了,但是文件没有出现在我 iPhone 的 "files" 文件夹下,而且找不到访问它的方法。 打印出的文件 url 如下所示:
file:///var/mobile/Containers/Data/Application/635B2D57-CA7B-44EF-BDF1-4308CABD8ED5/Documents/doc.pdf
我试图将其写入“.downloadsDirectory”(以及其他一些目录),但出现不允许访问的错误。
我做错了什么?
此处您的 pdf 文件存储在您的应用程序的文档 space 中。所以您无法在 Files 应用程序中看到它。应用程序 Document 文件夹中保存的所有文档都可以通过 iTunes 在 文件共享 中查看,但您需要在 Info.plist 第一:
- UIFileSharingEnabled: 应用程序支持 iTunes 文件共享
为了将文档存储在 Files 中,您需要使用 UIDocumentInteractionController
库:
let documentInteractionController = UIDocumentInteractionController()
func downloadPdf(firebaseStoragePath:String){
let ref = Storage.storage().reference().child(firebaseStoragePath)
let documentsURL: NSURL = FileManager.default.urls(for: .temporaryDirectory, in: .userDomainMask).first! as NSURL
let fileURL = documentsURL.appendingPathComponent("doc.pdf")
let task = ref.write(toFile: fileURL!)
task.observe(StorageTaskStatus.success) { (snap) in
DispatchQueue.main.async {
documentInteractionController.url = documentsURL
documentInteractionController.uti = documentsURL.typeIdentifier ?? "public.data, public.content"
documentInteractionController.name = documentsURL.localizedName ?? url.lastPathComponent
documentInteractionController.presentPreview(animated: true)
}
}
}
extension URL {
var typeIdentifier: String? {
return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier
}
var localizedName: String? {
return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName
}
}
不要忘记在 Info.plist 文件中添加这些权限:
- UIFileSharingEnabled: 应用程序支持 iTunes 文件共享
- LSSupportsOpeningDocumentsInPlace:支持就地打开文档
有关文件和UIDocumentInteractionController
的更多信息,您可以查看此blog post。