UIDocumentPickerViewController
バックエンドにアップロードするためにユーザーがiCloudドライブからファイルを選択できるようにするために使用しています。
ほとんどの場合、正しく動作します。ただし、場合によっては (特にインターネット接続が不安定な場合) 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()
}
OS X の iCloud Drive に 2 つの大きなイメージ (それぞれ ~5MiB) を追加し、そのうちの 1 つだけをa synced file.bmp
iPhone で開き ( )、もう1 つは開かない ( ) ことで、これを再現しました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"}}