繁体   English   中英

在OS X沙箱中就地保存

[英]Non in-place saving in OS X sandbox

我正在为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>

值得注意的是,苹果在其《 应用沙箱设计指南》中指出:

如果要使用NSDocument类以外的任何技术管理文档,则必须转换为使用此类。 NSDocument类自动与Powerbox配合使用。 如果用户使用Finder移动文档,NSDocument还提供了将文档保留在沙箱中的支持。

沙箱仅允许您从应用程序的容器读取和写入。 如果启用了读/写权限,则您只能访问通过OpenSavePanel打开的文件(或将图标拖到用户专门打开文件的扩展坞中的某种方法)。 这将严重限制应用程序如何处理文件系统上的文件。

因此,只要您的应用程序有权覆盖有问题的文档,就可以将临时文件写入应用程序容器,然后检索临时文件的内容,然后保存到原始位置。 但是,这假设您的应用在整个过程中都保留了对原始文件的权限。

因此,我的建议是确保在应用程序容器中完成所有写操作,然后在调用保存功能之前,确保您的应用程序仍然有权写入真实文件位置。

我最近写了一个类似的问题,我的应用程序无法访问打开的文件,因为另一个(非沙盒装)应用程序已保存到同一文件。 然后,沙盒为该应用程序提供了访问我的文档的权限,并从该应用程序中删除了权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM