将文件移动到文档目录后无法访问文件
Cannot access file after moving it to documents directory
我有一个使用 CloudKit
作为后端的应用程序,它有一些 CKRecords
和一些 CKAssets
其中一些资产是 PDF
文件,我无法在 QuickLook Previewer
中打开它们
获取记录后,我将 CKAsset
URLs
保存在一个数组中,代码如下:
guard let assets = attachment["attachments"] as? [CKAsset] else { return }
assets.forEach({ (asset) in
attachmentsURLs.append(asset.fileURL)
})
每个 fileURL
都会像这样打印:
file:///private/var/mobile/Containers/Data/Application/C4406091-B55C-46AC-A612-69052F2275BB/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/85DEDDB6-FB5B-4BC9-AB93-D8951AC304F7.012af7f83e322df6d0d1829b94956e4b829edbe974
最后一个字符串:85DEDDB6-FB5B-4BC9-AB93-D8951AC304F7.012af7f83e322df6d0d1829b94956e4b829edbe974
是文件本身,有了这个我尝试将这个文件移动到 DocumentsDirectory
。
我尝试移动它们并重命名它们并给它们特定的扩展名,在这种特殊情况下将是 .pdf
我使用以下代码执行此操作:
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
var url = URL.init(fileURLWithPath: documentsPath)
let component = NSUUID().uuidString + "." + fileExtensions[index]
url.appendPathComponent(component)
do {
try FileManager.default.moveItem(at: fileURL as URL, to: url)
} catch {
print("Failed to save attachment with extension with error:", error)
return
}
如您所见,我将缓存文件移动到文档目录并使用随机字符串 + 文件扩展名重命名。
使用 iOS 模拟器,一切都按预期工作。
文件从此处移动:
file:///Users/ivancantarino/Library/Developer/CoreSimulator/Devices/CCE2FCA5-05F0-4BB7-9A25-CBC168398A62/data/Containers/Data/Application/561A3461-0048-4676-808F-2D96B74DBDCD/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/FADF0479-E7AE-4340-83C5-C9E0889E4E87.012af7f83e322df6d0d1829b94956e4b829edbe974
到这里:
file:///Users/ivancantarino/Library/Developer/CoreSimulator/Devices/CCE2FCA5-05F0-4BB7-9A25-CBC168398A62/data/Containers/Data/Application/561A3461-0048-4676-808F-2D96B74DBDCD/Documents/52CAC8CD-EF0E-4E55-8D1B-8B267D07BAAA.pdf
然后我填充 QuickLook
数据源,我可以按预期可视化文件,但是在真实的 iPhone 设备中这不起作用。
预览显示一个空文件,ZERO KB
。
在真实设备上,文件从此处移动:
file:///private/var/mobile/Containers/Data/Application/6870DDC2-32FD-4FF2-89F4-04F87BBE534B/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/A187A987-BE4E-4C6A-9CBE-E66F3FEF7333.012af7f83e322df6d0d1829b94956e4b829edbe974
到这里:
file:///var/mobile/Containers/Data/Application/6870DDC2-32FD-4FF2-89F4-04F87BBE534B/Documents/FD501C6D-9E95-46DD-BC58-EA2C45B62DAC.pdf
什么可能导致此问题?
为什么这在模拟器中有效而在设备上无效?
我尝试了很多不同的东西,这让我发疯。
有什么提示吗?
谢谢。
嗯,我解决了这个问题,说实话有点尴尬,我会解释的。
由于我使用的是 Apple 的 QuickLook
框架,在我看来这非常了不起,因此我必须实现 QuickLook protocol
方法才能填充 datasource
能够呈现想要的文件,问题就出在这里
获取所需文件后,我将 URLs
保存在 [URL]
数组中。
在 QuickLook protocol
方法 numberOfPreviewItems(:_)
中,我 return [URL].count
作为项目的数量,在 previewController(:_)->QLPreviewItem
中,我正在执行以下操作:
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let doc = URL(fileURLWithPath: attachmentURLs[index].absoluteString)
return doc as QLPreviewItem
}
但是如果你注意到,doc
变量是用 URL(fileWithPath)
启动的,我传递的 URL.absoluteString
没有指向特定文件;
相反,我将该行转换为以下内容:
let doc = URL(fileURLWithPath: attachmentURLs[index].path)
因为我想访问给定缓存 URL
的 Path
,通过这样做一切都完美无缺。
令人头疼的是,以前的实现方式在 iOS Simulator
上有效,但在真实设备上却不起作用,这导致我以不同的方式寻求答案。
我有一个使用 CloudKit
作为后端的应用程序,它有一些 CKRecords
和一些 CKAssets
其中一些资产是 PDF
文件,我无法在 QuickLook Previewer
获取记录后,我将 CKAsset
URLs
保存在一个数组中,代码如下:
guard let assets = attachment["attachments"] as? [CKAsset] else { return }
assets.forEach({ (asset) in
attachmentsURLs.append(asset.fileURL)
})
每个 fileURL
都会像这样打印:
file:///private/var/mobile/Containers/Data/Application/C4406091-B55C-46AC-A612-69052F2275BB/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/85DEDDB6-FB5B-4BC9-AB93-D8951AC304F7.012af7f83e322df6d0d1829b94956e4b829edbe974
最后一个字符串:85DEDDB6-FB5B-4BC9-AB93-D8951AC304F7.012af7f83e322df6d0d1829b94956e4b829edbe974
是文件本身,有了这个我尝试将这个文件移动到 DocumentsDirectory
。
我尝试移动它们并重命名它们并给它们特定的扩展名,在这种特殊情况下将是 .pdf
我使用以下代码执行此操作:
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
var url = URL.init(fileURLWithPath: documentsPath)
let component = NSUUID().uuidString + "." + fileExtensions[index]
url.appendPathComponent(component)
do {
try FileManager.default.moveItem(at: fileURL as URL, to: url)
} catch {
print("Failed to save attachment with extension with error:", error)
return
}
如您所见,我将缓存文件移动到文档目录并使用随机字符串 + 文件扩展名重命名。
使用 iOS 模拟器,一切都按预期工作。
文件从此处移动:
file:///Users/ivancantarino/Library/Developer/CoreSimulator/Devices/CCE2FCA5-05F0-4BB7-9A25-CBC168398A62/data/Containers/Data/Application/561A3461-0048-4676-808F-2D96B74DBDCD/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/FADF0479-E7AE-4340-83C5-C9E0889E4E87.012af7f83e322df6d0d1829b94956e4b829edbe974
到这里:
file:///Users/ivancantarino/Library/Developer/CoreSimulator/Devices/CCE2FCA5-05F0-4BB7-9A25-CBC168398A62/data/Containers/Data/Application/561A3461-0048-4676-808F-2D96B74DBDCD/Documents/52CAC8CD-EF0E-4E55-8D1B-8B267D07BAAA.pdf
然后我填充 QuickLook
数据源,我可以按预期可视化文件,但是在真实的 iPhone 设备中这不起作用。
预览显示一个空文件,ZERO KB
。
在真实设备上,文件从此处移动:
file:///private/var/mobile/Containers/Data/Application/6870DDC2-32FD-4FF2-89F4-04F87BBE534B/Library/Caches/CloudKit/34af81edf8344be1cf473ef394e06ccc8e1bc8cf/Assets/A187A987-BE4E-4C6A-9CBE-E66F3FEF7333.012af7f83e322df6d0d1829b94956e4b829edbe974
到这里:
file:///var/mobile/Containers/Data/Application/6870DDC2-32FD-4FF2-89F4-04F87BBE534B/Documents/FD501C6D-9E95-46DD-BC58-EA2C45B62DAC.pdf
什么可能导致此问题?
为什么这在模拟器中有效而在设备上无效?
我尝试了很多不同的东西,这让我发疯。
有什么提示吗?
谢谢。
嗯,我解决了这个问题,说实话有点尴尬,我会解释的。
由于我使用的是 Apple 的 QuickLook
框架,在我看来这非常了不起,因此我必须实现 QuickLook protocol
方法才能填充 datasource
能够呈现想要的文件,问题就出在这里
获取所需文件后,我将 URLs
保存在 [URL]
数组中。
在 QuickLook protocol
方法 numberOfPreviewItems(:_)
中,我 return [URL].count
作为项目的数量,在 previewController(:_)->QLPreviewItem
中,我正在执行以下操作:
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let doc = URL(fileURLWithPath: attachmentURLs[index].absoluteString)
return doc as QLPreviewItem
}
但是如果你注意到,doc
变量是用 URL(fileWithPath)
启动的,我传递的 URL.absoluteString
没有指向特定文件;
相反,我将该行转换为以下内容:
let doc = URL(fileURLWithPath: attachmentURLs[index].path)
因为我想访问给定缓存 URL
的 Path
,通过这样做一切都完美无缺。
令人头疼的是,以前的实现方式在 iOS Simulator
上有效,但在真实设备上却不起作用,这导致我以不同的方式寻求答案。