提问人:Sergio 提问时间:11/9/2022 更新时间:5/11/2023 访问量:2747
为什么所有这些ShareSheet错误?
Why all these ShareSheet errors?
问:
与此相关。
当我使用 打开文件并按下“共享”按钮时,控制台会打印以下日志:QLPreviewController
[cloudthumbnails.generation] 无法确定是否 file:///Users/xxxxxx/Library/Developer/CoreSimulator/Devices/XXXXXX/data/Containers/Data/Application/XXXXXX/Documents/xxxxxx.pdf 是一个目录:Error Domain=NSCocoaErrorDomain Code=260
[共享表]无法请求默认共享模式 文件URL:file:///Users/xxxxxx/Library/Developer/CoreSimulator/Devices/XXXXXX/data/Containers/Data/Application/XXXXXX/Documents/xxxxxx.pdf
[共享表]仅支持 CKShare 和 SWY 类型的加载选项。
[ShareSheet] 提取项目时出错 网址:file:///Users/xxxxxx/Library/Developer/CoreSimulator/Devices/XXXXXX/data/Containers/Data/Application/XXXXXX/Documents/xxxxxx.pdf
[ShareSheet] 加载元数据时出错 documentURL:file:///Users/xxxxxx/Library/Developer/CoreSimulator/Devices/XXXXXX/data/Containers/Data/Application/XXXXXX/Documents/xxxxxx.pdf
但是,路径是正确的(在应用程序的“文档”文件夹中),并且可以通过任何方式成功打开和共享文件:保存在我的文档、Gmail、AirDrop、Slack 等上。
那么,为什么会有这些错误呢?我相信我在 Firebase Crashlytics 上收到的以下崩溃可能与此有关:
-[UIDocumentPickerViewController initForExportingURLs:asCopy:] 必须使用指向现有文件的 URL 调用:Error Domain=NSCocoaErrorDomain Code=260 UserInfo (NSURL=file:///var/mobile/Containers/Data/Application/APP_ID/Documents/FILE.pdf, NSFilePath=/var/mobile/Containers/Data/Application/APP/ Documents/FILE.pdf, (Error Domain=NSPOSIXErrorDomain Code=2 “No such file or directory”))
因为我没有在应用程序的其他地方打电话。调用该方法的唯一方法是从应用程序共享文件并将其存储在 iPhone 文件系统中。[UIDocumentPickerViewController initForExportingURLs:asCopy:]
答:
问题原来是以下几点。
当应用程序移动到后台时,为了安全起见,所有文件都被删除了,并在 .applicationDidEnterBackground(application:)
AppDelegate
我很困惑,因为当我从后台来时,我正在查看的文件仍然存在,我没有意识到它正在被删除。QLPreviewController
如何重现错误?
- 使用 可视化文件。
QLPreviewController
- 将该文件保存到 iPhone 的本地文件中(这将调用 )。
[UIDocumentPickerViewController initForExportingURLs:asCopy:]
- 将应用发送到后台(或删除文件的任何其他操作)。
- 回到前台,该文件仍处于打开状态,您可以对其进行可视化,但它在预期路径上不存在,因为它已被删除。
- 再次尝试将该文件保存到 iPhone 的本地文件中(这将再次调用 )。
[UIDocumentPickerViewController initForExportingURLs:asCopy:]
执行这些步骤将导致应用程序崩溃,因为当我们第二次尝试导出文件时,即使它仍然打开并在 上可见,它也不存在于预期的路径中。QLPreviewController
溶液
当我们从后台下载文件时,从其 URL 再次下载文件(因为它在本地不再可用)。为此,请订阅 上的通知。didBecomeActive
QLPreviewController
notificationCenter.addObserver(self, selector: #selector(self.downloadFile), name: UIApplication.didBecomeActiveNotification, object: nil)
评论