UIDocumentPickerViewController
,让用户从iCloud Drive中选择文件进行上传到后端。大部分时间它都是正常的。然而,有时(特别当网络连接不稳定时),documentPicker:didPickDocumentAtURL:
会返回一个在文件系统上并不存在的url,任何试图使用该url的尝试都会返回NSError "No such file or directory"。
如何正确处理这个问题? 我考虑使用 NSFileManager fileExistsAtPath:
方法,并告诉用户如果路径不存在,则请再次尝试。但是这听起来并不太用户友好。 有没有一种方法可以从iCloud Drive获得真实的错误原因,或者告诉iCloud Drive尝试再次上传?
以下是相关代码:
@IBAction func add(sender: UIBarButtonItem) {
let documentMenu = UIDocumentMenuViewController(
documentTypes: [kUTTypeImage as String],
inMode: .Import)
documentMenu.delegate = self
documentMenu.popoverPresentationController?.barButtonItem = sender
presentViewController(documentMenu, animated: true, completion: nil)
}
func documentMenu(documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) {
documentPicker.delegate = self
documentPicker.popoverPresentationController?.sourceView = self.view
presentViewController(documentPicker, animated: true, completion: nil)
}
func documentPicker(controller: UIDocumentPickerViewController, didPickDocumentAtURL url: NSURL) {
print("original URL", url)
url.startAccessingSecurityScopedResource()
var error: NSError?
NSFileCoordinator().coordinateReadingItemAtURL(
url, options: .ForUploading, error: &error) { url in
print("coordinated URL", url)
}
if let error = error {
print(error)
}
url.stopAccessingSecurityScopedResource()
}
我通过在OS X上将两个大图像(每个约5MiB)添加到iCloud Drive,并仅在iPhone上打开其中一个文件(
a synced file.bmp
),而不打开另一个文件(an unsynced file.bmp
)来复现此问题。然后关闭了WiFi。然后我尝试在我的应用程序中选择它们:同步的文件:
original URL file:///private/var/mobile/Containers/Data/Application/CE70EE57-B906-4BF8-B351-A57110BE2B01/tmp/example.com.demo-Inbox/a%20synced%20file.bmp
coordinated URL file:///private/var/mobile/Containers/Data/Application/CE70EE57-B906-4BF8-B351-A57110BE2B01/tmp/CoordinatedZipFileDR7e5I/a%20synced%20file.bmp
未同步的文件:
original URL file:///private/var/mobile/Containers/Data/Application/CE70EE57-B906-4BF8-B351-A57110BE2B01/tmp/example.com.demo-Inbox/an%20unsynced%20file.bmp
Error Domain=NSCocoaErrorDomain Code=260 "The file “an unsynced file.bmp” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///private/var/mobile/Containers/Data/Application/CE70EE57-B906-4BF8-B351-A57110BE2B01/tmp/example.com.demo-Inbox/an%20unsynced%20file.bmp, NSFilePath=/private/var/mobile/Containers/Data/Application/CE70EE57-B906-4BF8-B351-A57110BE2B01/tmp/example.com.demo-Inbox/an unsynced file.bmp, NSUnderlyingError=0x15fee1210 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
startDownloadingUbiquitousItemAtURL:error:
来使用那个不存在的url。但是,我没有使用它,因为Dropbox不支持Open模式。 - imgx64