写入app自己的bundle时,'sandboxd:deny file-write-create'

时间:2012-05-30 17:01:34

标签: macos osx-lion sandbox appstore-sandbox

我在Mac App商店中编写了一个显示一些图形的程序。偶尔它会在互联网上更新这些内容。和大多数人一样,我现在必须使用Sandbox我的应用程序。

几乎所有内容都有效,但在更新时会将文件保存在我应用自己的捆绑包中,并且失败并显示' sandboxd:deny file-write-create'

我只是使用fopen(...," wb")

传递给fopen的路径是: /Users/MyUser/Library/Developer/Xcode/DerivedData/MyApp-czuwveatgjffaggwqjdqpobjqqop/Build/Products/Debug/My.app/Contents/Resources/the_file.foo

使用以下命令创建路径:

CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourcesDirectoryURL(bundle);
CFURLGetFileSystemRepresentation(url, true, (UInt8*)buf, sizeof(buf));

我在做一些明显错误的事吗?我的应用程序是多平台的,所以理想情况下我一直在使用fopen / etc。据我所知,应该允许应用程序写入自己的捆绑包,即使它被禁止在其他地方做任何事情?

谢谢!

1 个答案:

答案 0 :(得分:6)

OS X应用永远不会写入应用包(即使它们没有沙盒)。在OS X中,应用程序对文件系统的访问权限不会超过用户自己的访问权限,并且用户(通常)无权修改/ Applications中的任何内容。请注意,这与iOS应用程序完全不同,iOS应用程序通常将数据存储在应用程序包中。

在OS X中,应用程序数据通常存储在每个用户的Library文件夹中,在多个子文件夹中的一个子文件夹中,具体取决于它的数据类型;请参阅Apple关于主要版本的“The Library Directory Stores App-Specific Files”注释。沙盒化使这变得复杂,因为每个应用程序都有自己的Container inside the user's Library。 Apple提供了许多方法来确定各种数据的正确位置;见“Determining Where to Store Your App-Specific Files”。