[英]Non in-place saving in OS X sandbox
我正在为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>
值得注意的是,苹果在其《 应用沙箱设计指南》中指出:
如果要使用NSDocument类以外的任何技术管理文档,则必须转换为使用此类。 NSDocument类自动与Powerbox配合使用。 如果用户使用Finder移动文档,NSDocument还提供了将文档保留在沙箱中的支持。
沙箱仅允许您从应用程序的容器读取和写入。 如果启用了读/写权限,则您只能访问通过OpenSavePanel打开的文件(或将图标拖到用户专门打开文件的扩展坞中的某种方法)。 这将严重限制应用程序如何处理文件系统上的文件。
因此,只要您的应用程序有权覆盖有问题的文档,就可以将临时文件写入应用程序容器,然后检索临时文件的内容,然后保存到原始位置。 但是,这假设您的应用在整个过程中都保留了对原始文件的权限。
因此,我的建议是确保在应用程序容器中完成所有写操作,然后在调用保存功能之前,确保您的应用程序仍然有权写入真实文件位置。
我最近写了一个类似的问题,我的应用程序无法访问打开的文件,因为另一个(非沙盒装)应用程序已保存到同一文件。 然后,沙盒为该应用程序提供了访问我的文档的权限,并从该应用程序中删除了权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.