1

我在 Mac App Store 中编写了一个显示一些图形的程序。有时它会从互联网上更新这些内容。和大多数人一样,我现在不得不对我的应用程序进行沙箱处理。

几乎一切正常,但在更新时会将文件保存在我的应用程序自己的包中,并因“沙盒:拒绝文件写入创建”而失败

我只是使用 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。据我了解,应该允许应用程序写入自己的包,即使它被阻止在其他地方做任何事情?

谢谢!

4

1 回答 1

8

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

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

于 2012-05-30T23:28:57.343 回答