Я использую UIDocumentPickerViewController
, чтобы пользователь мог выбрать файл из iCloud Drive для загрузки на сервер.UIDocumentPickerViewController возвращает url в файл, который не существует
В большинстве случаев он работает правильно. Однако иногда (особенно, когда интернет-соединение является пятнистым) documentPicker:didPickDocumentAtURL:
дает URL-адрес, который фактически не существует в файловой системе, и любая попытка его использования возвращает NSError «Нет такого файла или каталога».
Каков правильный способ справиться с этим? Я думаю об использовании 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()
}
Я воспроизведен путем добавления двух больших изображений (~ 5MiB каждое) ICloud Drive на OS X и открытие только один из них (a synced file.bmp
) на iPhone и не открывая другое (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"}}
У меня есть аналогичная проблема с импортом изображений с Google Диска с помощью UIDocumentPickerViewController. Возвращается верный URL, но fileExistsAtPath возвращает нуль (но только спорадически). Мне нужно использовать режим импорта (как и у вас), но я заметил, что проблема, кажется, исчезает, если я переключусь в режим Open. Кроме того, я считаю, что вам нужно только вызвать startAccessingSecurityScopedResource при использовании режима Open или Move. В моем тестировании этот вызов всегда возвращает false при использовании режима импорта. Сделали ли вы дальнейшие шаги по этому поводу после публикации? – grfryling
@grfryling Я остановился на том, что дал пользователю сообщение об ошибке. Я попробовал Open mode, и я обнаружил, что могу использовать этот несуществующий url с [«вездесущими» функциями] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index .html # // apple_ref/doc/uid/20000305-SW76), например 'startDownloadingUbiquitousItemAtURL: error:'. Однако я не использовал его, потому что Dropbox не поддерживает режим Open. – imgx64