从 icloud 打开文件时,Swift 4 应用程序崩溃

Posted

技术标签:

【中文标题】从 icloud 打开文件时,Swift 4 应用程序崩溃【英文标题】:Swift 4 app crashes when open file from icloud 【发布时间】:2018-11-21 17:51:24 【问题描述】:

我的应用程序在从 iCloud 打开文件时崩溃。如果我使用 Document Picker 从我的应用程序中打开此文件,一切都很好。但是,如果我尝试从我的应用程序外部打开,例如从 iCloud 或 Safari 下载,它会崩溃。如果我从本地存储“我的 iphone”打开它,它也可以工作。这很有趣,因为一周前还不错:)

所以在 AppDelegate 中,我实现了以下方法:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool 

根据日志,发生崩溃是因为文件不存在。

file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/Desktop/twic1121.pgn

如果我从参数中打印 URL,这就是结果。我认为这意味着文件在那里。

但如果我这样做:print(fm.fileExists(atPath: url.path)) 那么这是 false

所以很明显let dataFromFile = fm.contents(atPath: url.path)之后 这是nil

我不知道这可能是什么问题。所以这里真正的问题是为什么这是 nil?

【问题讨论】:

先尝试在您的网址上调用startAccessingSecurityScopedResource()。 (见developer.apple.com/documentation/foundation/nsurl/…) 如果文件已下载到手机,此方法有效。因此,如果文件的右上角有一个小云图标,这不起作用,无论如何我比以前领先一步,所以谢谢! 对不起,我也不知道所有细节。尝试查看FileManager 方法startDownloadingUbiquitousItem(at:)isUbiquitousItem(at:)。也可以尝试直接使用 URL 而不是获取路径。 这很有趣,因为如果我想打开一个尚未下载的文件,只有占位符图标在那里,如果我从文档选择器尝试这个,那么它会先下载然后打开.但是从应用程序外部,如果我点击它,它会立即打开(当然,此时文件不存在,只是它的图标)。我之前已经找到了这个 startDownloadingUbiquitousItem ,但我不明白为什么它没有任何回调?它只是开始下载,但我不知道它何时完成。感谢您的帮助,我真的很感激。 【参考方案1】:

似乎错误可能有很多,都与您应用代码的类(AppDelegate)或您正在调用的方法无关。

我的猜测是 您调用的 URL 没有正确构建(没有指向您尝试指向的正确对象)。有很多原因。

查看其中一个原因是否能解决您的问题:

(1) 您调用的 URL 的结尾带有后缀“pgn”。如果您要加载图片,则后缀可能是错误的。在这种情况下,它可能是某种已知且受支持的格式,例如“png”、“jpeg”或“jpg”。

(2) 代码中间的 "%20" 符号也提升了一个标志。似乎不是 swift 的正确 URL 对象。可能您使用的 URL 没有以正确的方式表示。

(3) com~apple~CloudDocs 也举起一个标志,因为它不太可能在传递的 URL 中有一个“~”符号。这也强烈表明您使用的 URL 可能没有以正确的方式表示。

我认为您的 URL 没有指向您尝试指向的位置,导致“确实存在”方法返回 false 并且加载结果为 nil。

如果所有这些都不能解决您的问题,请发布代码的更多详细信息。 特别是你调用什么方法来构建/创建你正在使用的这个 URL 对象,指向:file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/Desktop/twic1121.pgn

【讨论】:

此 URL 来自委托方法,当您打开具有应用程序已注册文件类型的文件时会调用该方法。 网址不是问题。 %20 是在 URL 中编码空格的正确方法。 com~apple~CloudDocs 部分是 iCloud 中存储文件的典型 URL。也没有人说它应该是图像文件 - pgn 是存储国际象棋游戏的常用文件格式。

以上是关于从 icloud 打开文件时,Swift 4 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Icloud Swift 上的文件中获取数据

从 iCloud 文件中取消归档对象时出错

无需用户从 DocumentBrowser 中选择即可呈现 iCloud 文件

swift:从自定义应用程序加载时,iCloud 文档似乎被禁用

从 iCloud 打开 txt 文件

未登录 iCloud 时的 Swift CloudKit 读取