【问题标题】:'sandboxd: deny file-write-create' when writing to app's own bundle写入应用程序自己的包时“沙盒:拒绝文件写入创建”
【发布时间】:2013-04-19 17:38:05
【问题描述】:

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

几乎一切正常,但更新时会将文件保存在我的应用程序自己的包中,并因“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。据我了解,应该允许应用程序写入自己的包,即使它被阻止在其他地方做任何事情?

谢谢!

【问题讨论】:

    标签: macos osx-lion sandbox appstore-sandbox


    【解决方案1】:

    OS X 应用程序应该从不写入应用程序包(即使它们没有被沙盒化)。在 OS X 中,应用程序对文件系统的访问权限不比用户自己的权限多,并且用户(通常)没有权限修改 /Applications 中的任何内容。请注意,这与通常将数据存储在应用程序包中的 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”。

    【讨论】:

    • 100% 正确——但您永远不应该写入应用程序包的另一个原因是您将使代码签名无效。 (是的,您可以在密封的内容中留下空白并写入这些空白,或者您甚至可以在自己编辑后重新签署您的包,但显然您不应该这样做。)
    • 谢谢!很抱歉延迟回复。有趣的是,在退出时编写设置文件似乎不会触发沙箱的任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2021-07-28
    • 2020-03-28
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多