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

Gor*_*ams 0 macos sandbox osx-lion 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));
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Gor*_*son 6

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

在OS X中,应用程序数据通常存储在每个用户的Library文件夹中,根据数据的类型,存储在多个子文件夹中的一个子文件夹中; 请参阅Apple关于" 图书馆目录存储特定应用程序文件 "的说明,了解主要文件.沙盒化使这变得复杂,因为每个应用程序在用户的库中都有自己的Container.Apple提供了许多方法来确定各种数据的正确位置; 请参阅" 确定应用程序特定文件的存储位置 ".

  • 100%正确 - 但是您永远不应该在应用程序包中写入的另一个原因是您将使代码签名无效.(是的,你可以在密封的地方留下空白并写入这些空白,或者你甚至可以在自己编辑之后重新签署你的包,但显然你不应该这样做.) (3认同)