2011-09-15 24 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