2017-07-31 123 views
-1

后,我有一个使用CloudKit作为后端的应用程序,其中有一些CKRecords一些CKAssets无法访问文件将其移动到文件目录

其中有些资产是PDF文件,我没有在打开它们所述QuickLook Previewer

撷取记录后,我保存CKAssetURLs在阵列中,用下面的代码:

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

什么可以造成这个问题?

为什么在模拟器中可以正常工作,并且不能在设备上工作?

我试了很多不同的东西,这让我疯狂。

任何提示?

谢谢。

回答

-1

嗯,我解决了这个问题,说实话有点尴尬,我会解释一下。

由于我使用的是苹果,这在我看来是相当惊人的QuickLook框架,我不得不实施,以便在QuickLook protocol方法,填补了datasource能够呈现所需的文件,问题是在这里。

获取所需文件后,我将URLs保存在[URL]阵列中。

QuickLook protocol方法numberOfPreviewItems(:_)我返回[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) 

因为我想访问给定的缓存URLPath,并通过这样一切都工作正常。

令人头疼的是,以前实施的方法在iOS Simulator中工作,但不在真实的设备上,这导致我以不同的方式寻求答案。

+0

仍然没有得到downvote –

相关问题