この質問をしたので、次の解決策を実装しました。
- ユーザーをまったく関与させずに、ドキュメントのやり取りを介して渡されたファイルをすぐに処理するように、アプリを再設計しました。ファイルの処理中にアプリがクラッシュしたり、一時停止して強制終了されたりしない限り、これは常にクリーンなままにする必要があります
Documents/Inbox
。
- クラッシュまたはサスペンド/キルの (まれな) ケースをカバーするために、私のアプリは
Documents/Inbox
通常の起動時にフォルダーを削除します (つまり、ドキュメントの操作を目的とせずに)。これを実現するには、Documents/Inbox
フォルダー パスをハードコードする必要があります。
解決策に至った考えは次のとおりです。
- アプリの再設計
- 最初は、ユーザーがファイルを処理する方法を選択できるようにするのは良い考えのように思えました。結局、選択を提供すると、アプリがより柔軟になり、ユーザーにより多くの自由が与えられるのではないでしょうか?
- その後、ドキュメントのやり取りをどのように処理するかを決定する責任をユーザーに転嫁しようとしていることに気付きました。それで、私は弾丸をかみ砕き、前もって難しい決定を下し、それから喜んでアプリにシンプルでわかりやすいドキュメント インタラクション システムを実装しました。
- 結局のところ、ユーザー インタラクションがないということは、アプリが使いやすくなることも意味するため、開発者としての私とアプリのユーザーの両方にとって、これは win-win の状況です。
Documents/Inbox
アプリの起動中にフォルダーを
削除する
- アプリの起動中にフォルダーを削除することは、アプリがドキュメントのやり取りを処理する方法の本質的な
Documents/Inbox
部分ではなく、単なる後付けです。
- したがって、Apple が将来のある時点で inbox フォルダのファイルシステム パスを変更する可能性があるというリスクを冒しても構わないと思っています。起こり得る最悪の事態は、私のアプリが、クラッシュまたはサスペンド/キル シナリオからの残り物であるいくつかのファイルを蓄積し始めることです。
そして最後に、さらなる開発のためのいくつかの考え:
- アプリがドキュメントのやり取りを処理する方法が本当に複数あることが判明した場合は、ユーザー設定を追加して、ユーザーが事前に決定を下す必要があり、アプリがその操作を停止する必要がないようにします。ユーザーに選択を求める処理。
- ドキュメント インタラクション処理プロセスの途中でユーザー インタラクションが絶対に避けられないことが判明した場合は、次のアプローチを検討します。1) ユーザーがインタラクションを許可される前に、ファイル
Documents/Inbox
を何らかの「ステージング」フォルダに移動します。 ; 2) ユーザーとのやり取りをさせます。3) ユーザーが選択した方法で、「staging」フォルダー内のファイルを処理します。ここで重要なことは、「ステージング」フォルダーが既知の場所にあり、アプリによって完全に管理されていることです。ユーザーがユーザー インタラクション ステップの途中でアプリを一時停止して強制終了した場合、次にアプリを起動するときに適切なアクションを簡単に実行できます。
編集
Documents/Inbox
iOS 7 では、一度作成すると削除できなくなりました。このNSFileManager
メソッドは、 removeItemAtPath:error:
Cocoa エラー 513 を返します。このエラーは解決されます(この Foundation 定数のリストをNSFileWriteNoPermissionError
参照)。このエラーは POSIX パーミッションに関連しているようには見えませんが、システム自体が削除の試みを妨害しているように見えます (おそらくアプリ バンドル構造の保護?)。
また注目に値するのは、最近では AppleがメソッドDocuments/Inbox
のドキュメントで明示的に名前を付けていることです。彼らはまた言いますUIApplicationDelegate
application:openURL:sourceApplication:annotation:
[...] あなたのアプリには、このディレクトリ内のファイルを読み取り、削除する権限がありますが、それらに書き込む権限がありません。ファイルを変更する場合は、最初に別のディレクトリに移動する必要があります。
docsには、ファイルの暗号化の可能性に関する詳細が記載されていますが、それについては自分で読む必要があります。