32

現在サンドボックス化されているアプリを開発しています。これは、基本的なテキスト エディターとして機能します。最近、自分のアプリと別のアプリでファイルを同時に開き、一方のアプリで更新を行い、もう一方のアプリで更新を確認するとどうなるかをテストしたいと考えていました。CodaまたはBBEditを代替エディターとして使用しています。サンドボックスをオフにすると、この問題は発生しません。ただし、3 月 1 日からアプリのサンドボックス化が義務付けられているため、様子見ではなく解決策を実装したいと考えています。

両方のファイルを開いて自分のアプリで編集を行ってから、別のアプリに切り替えると、変更が反映され、それらのエディターは自分のアプリから保存したばかりのバージョンになります。ただし、彼らのアプリから保存してから私のアプリに移動するという逆の操作を実行すると、喜びはありません。アクションを何も実行しないと、コンソールは次の 2 つの特定のエラーdeny file-issue-extensionを報告します。deny file-write-data. アプリでドキュメントを開いた後に外部エディターによって変更されたため、アプリはドキュメントを編集する権限を失っているようです。アプリでファイルを保存しようとすると、元のドキュメントにアクセスできなくなったため、ドキュメントを複製するよう求められます。これらのアプリはサンドボックス化されていないため、私のアプリにない権限があるため、これは逆には起こりません。また、この動作を望まない場合、他のアプリが変更を加えるのを防ぐことはできないようです.

developer.apple.com のドキュメントには、この種の状況については何も言及されていません。これが意図した動作かどうかはわかりません。そうである場合は、ドキュメントのアクセス許可が失われたため、新しいバージョンを保存するか、ファイルを再度開く必要があることをユーザーに伝えることができます。意図した動作ではない場合、NSDocument API のどのメソッドが、失われたファイルに許可を与えるでしょうか? 私は答えが前者であると仮定していますが、これは意図されたものですが、誰でも確認できますか?ドキュメントはありますか?

4

2 に答える 2

1

アクションを何も実行しないと、コンソールは 2 つの特定のエラーを報告します: deny file-issue-extension と deny file-write-data です。アプリでドキュメントを開いた後に外部エディターによって変更されたため、アプリはドキュメントを編集する権限を失っているようです。アプリでファイルを保存しようとすると、元のドキュメントにアクセスできなくなったため、ドキュメントを複製するよう求められます

このような状況での正しい動作は、ファイルを上書きするのではなく、ドキュメントを再読み込みするかどうかをユーザーに確認することです。必要な場合は、再読み込みしてから書き込みます。

OS は、変更されたファイルに対するブラインド書き込みを許可しないことで、正しいことを行っています。

NSFilePresenter - (void)presentedItemDidChange を参照して、変更されたかどうかを確認してください。ファイルを再度読み取り、保存できるかどうかを確認します。ファイルの読み取りが拒否されたとは言いません。

また、コードを投稿していないため、ファイルにアクセスして保存するために使用しているコードを示すと役立つ場合があります。NSDocument には、サンドボックス内のいくつかの種類のファイル変更の処理が組み込まれています。

于 2012-08-08T03:55:15.643 に答える
0

アプリをScottEditと競合他社をStackEditと呼びましょう

いくつかのことが起こっている可能性があります。NSDocumentにはlockDocumentメソッドがあります。StackEditがドキュメントをロックしていて、保存後にロックを解除しなかった可能性があります。アプリを終了すると、ファイルのロックが解除され、アプリで使用できるようになります。この場合、kqueueなどを使用してファイル属性が変更されたときの通知を作成する必要があります。

他のアプリがアプリへのアクセスを「ブロック」している場合。その開発者にメールを送信して、保存後にドキュメントのロックを解除するようにアプリを更新するように依頼できます。この最後のステップは、別の開発者がやって来て同じことをする(アプリを壊す)可能性があるため、通知の設定に追加されます。

于 2012-08-03T14:16:54.433 に答える