【问题标题】:How can I write "all user" preferences in OS X Lion?如何在 OS X Lion 中编写“所有用户”首选项?
【发布时间】:2011-09-15 11:03:10
【问题描述】:

我正在开发一个应用程序,它为所有用户全局存储一些偏好。它通过将kCFPreferencesAnyUser 作为CFPreferencesSetValueuserName 参数传入。

在 OS X 版本 10.7 (Lion) 之前,这可以正常工作。但是,当此代码在 Lion 上运行时,调用会失败,即使应用程序是从管理员帐户运行的。 CFPreferencesSetValue 的文档指出:

请注意,如果您具有管理员权限,则只能保存“任何用户”的首选项。

...通过搜索,我发现 Snow Leopard 和 Lion 所需的权限发生了变化(从 adminroot)。看来我可以按照 Apple 的 SMJobBless 示例代码继续使用类似的代码...

...安全地安装执行特权操作的辅助工具...

但我注意到kCFPreferencesAnyUser 的文档本身指出:

此域目前不受支持。

使用帮助工具是否是创建所有用户首选项的正确方法?还是我应该使用其他一些受支持的方法?

【问题讨论】:

    标签: macos preferences osx-lion


    【解决方案1】:

    这其实是一个很好的问题,似乎没有特别好的答案。

    SMJobBless 的问题是您需要使用与父应用程序相同的签名对工具进行代码签名。不幸的是,这是系统偏好设置,因此现在只有 Apple 可以为辅助工具生成必要的代码签名。

    鉴于此,我认为有三种选择:

    • 使用较旧的授权 API 来运行帮助工具(例如 AuthorizationExecuteWithPrivileges)
    • 使用独立应用编写首选项
    • 滚动你自己的偏好 API(使用或不使用 prefpane 插件)

    所有这一切最糟糕的是,CFPreference API 似乎完全静默失败 - 只是在设置全局首选项值时实际上没有发生任何事情。

    编辑

    对不起。我想我有点领先了。是的,如果您是通过自己的添加执行此操作,那么 SMJobBless 代码就可以解决问题。然而,编写一个辅助应用程序和某种形式的 IPC 只是为了读取和写入共享偏好值是很痛苦的——如果您的需求足够简单,使用共享文件滚动您自己的偏好系统可能会更容易。

    【讨论】:

    • 感谢您的回答。我对您对系统偏好设置的意思有点困惑。我的示例中的“父应用程序”不是我的应用程序吗?我需要编写的首选项特定于我的应用程序。
    • 我认为它不会完全默默地失败。随后对CFPreferencesSynchronize 的调用返回false,表示发生了错误。
    • 毫无价值,将首选项写入kCFPreferencesAnyUser 域需要使用kCFPreferencesCurrentHost,这让我有一段时间感到厌烦(在此页面的最底部注明:developer.apple.com/library/mac/documentation/CoreFoundation/… )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2011-02-01
    • 1970-01-01
    • 2012-01-23
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多