私はUIDocumentPickerViewController
を使用して、iCloud Driveからバックエンドにアップロードするファイルを選択させます。UIDocumentPickerViewControllerは存在しないファイルにURLを返します
ほとんどの場合、正常に動作します。しかし、時々(特にインターネット接続が不安定な場合)、documentPicker:didPickDocumentAtURL:
はファイルシステム上に実際に存在しないURLを与え、それを使用しようとするとNSError "No such file or directory"を返します。
これを処理する正しい方法は何ですか?私はNSFileManager fileExistsAtPath:
を使用することを考えていて、存在しなければ再度試してみるようユーザーに指示します。しかし、それは非常にユーザーフレンドリーではありません。 iCloudドライブの実際のエラー原因を取得し、iCloudドライブに再試行するよう指示する方法はありますか?
コードの関連部分:
@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()
}
私はiPhone上でOS Xと開口部にそれらの一つだけ(a synced file.bmp
)上のiCloudドライブに二つの大きな画像(〜5MiBそれぞれ)を追加することでこれを再現し、もう一方は開かない(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"}}
私は、UIDocumentPickerViewControllerを使用してGoogleドライブから画像をインポートする際に同様の問題が発生しています。有効な見た目のURLが返されますが、fileExistsAtPathはnilを返します(ただし散発的にしか発生しません)。インポートモードを使用する必要がありますが、Openモードに切り替えると問題が解決しないようです。また、OpenまたはMoveモードを使用する場合は、startAccessingSecurityScopedResourceを呼び出すだけでよいと考えています。私のテストでは、インポートモードを使用すると、その呼び出しは常にfalseを返します。投稿してからこれ以上の進歩はありませんか? – grfryling
@grfrylingあいまいなエラーメッセージをユーザーに伝えて解決しました。私はオープンモードを試しましたが、存在しない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