将文件移动到文档目录后无法访问文件

时间:2017-07-31 00:19:19

标签: ios swift3 cloudkit nsdocumentdirectory

我有一个使用url = 'api' def last_price(): localtime = time.asctime( time.localtime(time.time())) uh = urllib.request.urlopen(url) data = uh.read().decode() js = json.loads(data) print(js['last']) print(localtime) threading.Timer(1.0, last_price).start() last_price() 作为后端的应用,其中有CloudKitCKRecords

其中一些资产是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

如您所见,我将缓存的文件移动到文档目录,并使用随机字符串+文件扩展名重命名。

使用iOS模拟器,一切都按预期工作。

文件从此处移开: 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 }

到这里:

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数据源,我可以按预期显示文件,但是在真正的iPhone设备中,这不起作用。

预览显示一个空文件,QuickLook

在真实设备上,文件从此处移开:

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

导致此问题的原因是什么?

为什么这在模拟器中有效并且不能在设备上工作?

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

任何提示?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

由于我正在使用Apple的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)

因为我想访问给定缓存Path的{​​{1}},所以一切都运行得很好。

令人头疼的是,先前实施的方式在URL中有效但在真实设备上无效,这导致我以不同的方式寻求答案。