2011-09-15 22 views
3

我正在为所有用户在全球范围内存储一些首选项的应用程序工作。它通过kCFPreferencesAnyUser in作为CFPreferencesSetValueuserName参数。如何在OS X Lion中编写“所有用户”首选项?

在OS X版本10.7(狮子)之前,这工作得很好。但是,当此代码在Lion上运行时,即使从管理员帐户运行应用程序,调用也会失败。 CFPreferencesSetValue的文档声明:

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

...我看到搜索周围所需的权限雪豹和狮子之间的变化(从管理)。它也似乎,我可以继续按照苹果的SMJobBless示例代码使用类似的代码...

...牢固地安装一个辅助工具,执行特权操作...

但我注意到,kCFPreferencesAnyUser本身的文档声明:

此域当前不支持。

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

回答

1

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

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

鉴于此,我认为有三个选项:

  • 使用旧授权API运行一个辅助工具(如AuthorizationExecuteWithPrivileges)
  • 使用一个独立的应用程序写的喜好
  • 卷 - 您自己的偏好API(可用于预发布插件或不使用)

最糟糕的是所有这些都是CFPreference API似乎失败了co完全默默地 - 只是在设置全局偏好值时实际上没有发生任何事情。

编辑

对不起。我认为我有点跳跃。是的,如果你是从你自己的添加这样做,那么SMJobBless代码就可以实现。但是,编写帮助程序和某种形式的IPC来读取和写入共享的首选项值是一件很痛苦的事情 - 如果您的需求足够简单,使用共享文件推出您自己的首选项系统可能会更容易。

+0

感谢您的回答。我对你对系统偏好的含义有些困惑。我的例子中的应用程序不是“父应用程序”吗?我需要编写的偏好特定于我的应用程序。 – Rich

+1

我不认为它*完全*失败*失败。随后对'CFPreferencesSynchronize'的调用返回false,表示发生了错误。 – Rich

+1

值得一提的是,为'kCFPreferencesAnyUser'域写入首选项需要使用'kCFPreferencesCurrentHost',这会让我耽搁一段时间(在本页底部提到:https://developer.apple.com/库/ MAC /文档/的CoreFoundation /参考/ CFPreferencesUtils /参考/#的reference.html // apple_ref/DOC/UID/20001450-CH1g-130209) – Matthematics