xcode 为什么会出现这些ShareSheet错误?

mdfafbf1  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(156)

this相关。

当我使用QLPreviewController打开一个文件,并按下“共享”按钮时,控制台将打印以下日志:
无法确定文件是否为目录:错误域= NSCocoa错误域代码=260
[共享表]请求文件的默认共享模式失败URL:file:///用户/xxxxxx/库/开发人员/核心模拟器/设备/XXXXXX/数据/容器/数据/应用程序/XXXXXX/文档/xxxxxx.pdf
[ShareSheet]仅支持CKShare和SWY类型的加载选项。
[ShareSheet]提取以下URL的项目时出错:文件:///用户/xxxxxx/库/开发人员/核心模拟器/设备/XXXXXX/数据/容器/数据/应用程序/XXXXXX/文档/xxxxxx.pdf
[ShareSheet]加载文档的元数据时出错URL:file:///用户/xxxxxx/库/开发人员/核心模拟器/设备/XXXXXX/数据/容器/数据/应用程序/XXXXXX/文档/xxxxxx.pdf
但是,路径是正确的(在应用程序的“文稿”文件夹中),并且可以通过任何方式成功打开和共享文件:在我的文档、Gmail、AirDrop、Slack等上保存
那么,为什么所有这些错误?我相信下面的崩溃,我收到的Firebase Crashlytics可能有关:

  • 必须使用指向现有文件的URL调用[UIDocumentPickerViewController initForExportingURLs:asCopy:]:错误域=NSCocoaErrorDomain代码=260用户信息(NSURL=文件:///var/移动设备/容器/数据/应用程序/应用程序ID/文档/文件. pdf,NSFilePath=/var/移动设备/容器/数据/应用程序/应用程序/文档/文件. pdf,(错误域=NSPOSIXErrorDomain代码=2“没有这样的文件或目录”))
    因为我不会在应用程序的其他地方调用[UIDocumentPickerViewController initForExportingURLs:asCopy:]。调用该方法的唯一方式是共享应用程序中的文件并将其存储在iPhone文件系统中。
c0vxltue

c0vxltue1#

原来问题是这样的。
当应用程序移到后台时,出于安全考虑,所有文件都被删除,并且在AppDelegate上调用了applicationDidEnterBackground(application:)
我很困惑,因为当我从后台回来时,我正在使用QLPreviewController查看的文件仍然在那里,我没有意识到它被删除了。

如何重现错误?

1.使用QLPreviewController可视化文件。
1.将该文件保存到iPhone的本地文件中(这将称为[UIDocumentPickerViewController initForExportingURLs:asCopy:])。
1.将应用程序发送到后台(或任何其他删除文件的操作)。
1.回到前台,文件仍然打开,您可以看到它,但它不存在于预期的路径上,因为它已被删除。
1.再次尝试将该文件保存到iPhone的本地文件中(这将调用[UIDocumentPickerViewController initForExportingURLs:asCopy:])。
按照这些步骤操作将导致应用崩溃,因为我们第二次尝试导出文件时,即使文件在QLPreviewController上仍然打开并可见,它也不存在于预期路径中。

溶液

当我们从后台返回时,从其URL重新下载文件(因为它在本地不再可用)。要做到这一点,请订阅QLPreviewController上的didBecomeActive通知。

notificationCenter.addObserver(self, selector: #selector(self.downloadFile), name: UIApplication.didBecomeActiveNotification, object: nil)

相关问题