Mac OS X 10.7 用のサンドボックス アプリを開発しており、次のような方法でファイル保存を実装しようとしていますNSDocument
。
- ファイルの新しい内容を一時ファイルに書き換えます
- 元のファイルを一時ファイルで上書きする
私が抱えている問題は、サンドボックスがステップ 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 を使用して文書を移動した場合に、サンドボックス内に文書を保持するためのサポートも提供します。