如何在OS X Lion中编写“所有用户”的首选项?

3
我正在开发一个应用程序,它可以为所有用户存储一些全局偏好设置。它通过将 kCFPreferencesAnyUser 作为 CFPreferencesSetValueuserName 参数来实现。
在 OS X 版本 10.7(Lion)之前,这个方法很有效。然而,在 Lion 上运行此代码时,即使从管理员帐户运行该应用程序,调用也会失败。 CFPreferencesSetValue 的文档说明如下:
注意,只有具备管理员权限才能保存“任何用户”的首选项。
我从搜索中了解到,在 Snow Leopard 和 Lion 之间所需的特权已更改(从管理员更改为根)。似乎我可以继续使用类似的代码,遵循 Apple 的 SMJobBless 示例代码,安装一个执行特权操作的辅助工具。
...以安全地安装执行特权操作的辅助工具...
但是,我注意到kCFPreferencesAnyUser 的文档本身声明:
此域目前不受支持。
使用一个辅助工具是否是创建所有用户首选项的正确方法?还是我应该使用其他支持的方法?
1个回答

1

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

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

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

  • 使用旧的授权API运行辅助工具(例如AuthorizationExecuteWithPrivileges)
  • 使用独立的应用程序编写首选项
  • 自己编写首选项API(从prefpane插件或其他方式使用)

所有这些中最糟糕的事情是,CFPreference API似乎完全无声地失败了 - 当设置全局首选项值时实际上什么也不会发生。

编辑

抱歉。我想我有点过于急躁了。是的,如果您是从自己的添加程序执行此操作,则SMJobBless代码将起作用。但是,必须编写一个辅助应用程序和某种IPC来读取和写入共享首选项值,这很麻烦 - 如果您的需求足够简单,使用共享文件编写自己的首选项系统可能更容易。


谢谢你的回答。我有点困惑你所说的“系统偏好设置”是什么意思。在我的例子中,“父应用程序”不就是我的应用程序吗?我需要编写的首选项是特定于我的应用程序的。 - Rich
1
我认为它并不完全是悄无声息地失败了。随后对 CFPreferencesSynchronize 的调用返回 false,表示发生了错误。 - Rich
1
值得注意的是,要将偏好写入kCFPreferencesAnyUser域,需要使用kCFPreferencesCurrentHost,这曾经让我困扰了一段时间(在此页面的底部有注释:https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFPreferencesUtils/Reference/reference.html#//apple_ref/doc/uid/20001450-CH1g-130209) - Matthemattics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接