2

Mac OS X 10.7 用のサンドボックス アプリを開発しており、次のような方法でファイル保存を実装しようとしていますNSDocument

  1. ファイルの新しい内容を一時ファイルに書き換えます
  2. 元のファイルを一時ファイルで上書きする

私が抱えている問題は、サンドボックスがステップ 2 を拒否していることです。コンソールに次の行が表示されます。

sandboxd: XXXX deny file-write-create /Volumes/Home/sbooth/Test Files/Test

私はすでにこのファイルを読み書き用に開いており、ファイル システムの読み取り/書き込みアクセス権を有効にしています。NSDocument が特別な資格なしでこれを行うことを知っているので、見逃したものを見つけようとしています。

これが私が今やっている方法です(アプリのこの部分はC++であり、Objective-C/C++ではありません):

FSRef tempFileFSRef;
if(noErr != FSPathMakeRef((const UInt8 *)tempFileName, &tempFileFSRef, NULL))
  ; // Handle it
CFURLRef destinationDirURL = CFURLCreateCopyDeletingLastPathComponent(kCFAllocatorDefault, mURL);
FSRef destinationDirFSRef;
if(!CFURLGetFSRef(destinationDirURL, &destinationDirFSRef))
  ; // Handle it
CFRelease(destinationDirURL), destinationDirURL = NULL;
CFStringRef destinationName = CFURLCopyLastPathComponent(mURL);
FSRef target;
OSStatus result = FSCopyObjectSync(&tempFileFSRef, &destinationDirFSRef, destinationName, &target, kFSFileOperationOverwrite | kFSFileOperationSkipSourcePermissionErrors);
if(noErr != result)
  ; // Handle it

サンドボックスを無効にすると、コードは正しく機能します。

編集: Femi から追加情報が要求されました。C stdio を使用してファイルを開きます。

FILE *f = fopen(reinterpret_cast<const char *>(buf), "r");

fclose一時ファイルが作成される前に使用して閉じました。

私の資格は次のとおりです。

<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.assets.music.read-write</key>
    <true/>
    <key>com.apple.security.files.downloads.read-write</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
</dict>

また、Apple がApp Sandbox Design Guideで次のように述べていることも注目に値します。

NSDocument クラス以外のテクノロジを使用してドキュメントを管理している場合は、このクラスを使用するように変換する必要があります。NSDocument クラスは Powerbox で自動的に動作します。NSDocument は、ユーザーが Finder を使用して文書を移動した場合に、サンドボックス内に文書を保持するためのサポートも提供します。

4

1 に答える 1

0

サンドボックスでは、アプリケーションのコンテナーからの読み取りと書き込みのみが許可されます。読み取り/書き込み権限が有効になっている場合は、OpenSavePanel (または、ユーザーがファイルを開いたドックにアイコンをドラッグするなどの方法) を介して開かれたファイルにのみアクセスできます。これにより、アプリケーションがファイル システム上のファイルを処理する方法が大幅に制限されます。

そのため、アプリケーションが問題のドキュメントを上書きする権限を持っている限り、一時ファイルをアプリケーション コンテナーに書き込み、一時ファイルの内容を取得して元の場所に保存できます。ただし、これは、アプリがプロセス全体で元のファイルへのアクセス許可を維持していることを前提としています。

したがって、保存機能を呼び出す前に、書き込みがアプリケーション コンテナーで行われていることを確認し、実際のファイルの場所への書き込み権限がアプリにまだあることを確認することをお勧めします。

最近、別の (サンドボックス化されていない) アプリが同じファイルに保存されたために、アプリが開いているファイルにアクセスできなくなったという同様の質問を書きました。その後、サンドボックスはそのアプリにドキュメントへのアクセスを許可し、アプリから権限を削除しました。

于 2012-01-14T18:46:46.050 に答える