我正在为 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 一起使用。如果用户使用 Finder 移动文档,NSDocument 还支持将文档保存在沙箱中。