24

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.bmpiPhone で開き ( )、もう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"}}
4

7 に答える 7

0

これに興味深いものを追加できます。

この問題は、同じファイルを繰り返しインポートした場合にも発生します。ローカル ファイル システム上の非常に小さなファイル (~900 バイト) でこの問題に遭遇しました。

iOS は、ファイルを受信トレイに入れてデリゲートに通知してからちょうど 60 秒後にファイルを削除します。同じ名前 (または最後のパス コンポーネント) でファイルを再度インポートすると、これらの削除操作がキューに入れられ、60 秒後に大混乱を引き起こし始める可能性があるようです。これは、iOS 13 (非推奨の初期化子) と 14 (新しい初期化子) の両方で発生します。

十分にテストされたコード スニペットを使用して調整された削除を実行しようとしましたが、役に立ちませんでした。

この問題は現在も続いており、インポート機能に大きな損害を与えています。ユースケースが非常にまれまたは風変わりだとは思いません。これに関する投稿はあまりないようですが、おそらく誰もがインポートから開くように切り替えたのではないでしょうか (善良な市民になりたい場合は、調整されたファイル操作が義務付けられていても)?

于 2021-12-15T18:35:21.360 に答える