macOS 開發 - NSUserDefaults 和 cfprefsd


假設我們的測試bundleID 爲 com.ms.test


一、關閉沙盒模式下

偏好設置數據地址:

~/Library/Preferences/com.ms.test


如果刪掉這個 plist 文件,依舊可以讀出相應數據;(重啓之後如何?親們可以嘗試)

這個情況下,執行下面命令可以解決:

killall -SIGTERM cfprefsd


二、沙盒模式下

偏好設置文件保存地址:

~/Library/Containers/com.aaa.MacProcessDemo/Data/Library/Preferences/com.ms.test


如果刪掉 plist 文件,不會再自動生成 plist(即使clean build folder 和刪掉 Containers 內對應的文件夾)。這時還是可以讀取數據,但寫入數據會報下述錯誤:

[User Defaults] Couldn't read values in CFPrefsPlistSource<0x6040000e1980> (Domain: com.ms.test, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: Yes): accessing preferences outside an application's container requires user-preference-read or file-read-data sandbox access, detaching from cfprefsd

[User Defaults] attempt to set 123 for key in key in non-persistent preferences domain CFPrefsPlistSource<0x6040000e1980> (Domain: com.ms.test, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: Yes)


這時你可能會想到去沙盒開啓 user-preference-readfile-read-data 權限。但是,沒有這兩個權限。

原因:本質還是因爲缺失 plist 造成。

解決方法:在終端輸入 $ killall -SIGTERM cfprefsd;然後重新 build,就會再次生成 plist 文件。不需要開任何權限。


三、關於 cfprefsd

此時你可能和我一樣,好奇在刪除plist 之後,app 是去哪裏獲取的數據;也好奇 cfprefsd 是何方神聖。也許他們之前有關聯。

cfprefsd 這個名字,讓人聯想到 CFPreference,尾部的d 像是一個守護進程 daemon 名字。

打開活動監視器,確是有這個進程的存在。
它的執行地址位於 /usr/sbin/cfprefsd

在這裏插入圖片描述
使用 $ killall -SIGTERM cfprefsd 命令後,第三個(用戶級的 )cfprefsd 被殺掉,2s 後重啓了(PID 變化了)。
前面兩個是更深的守護?
猜想執行命令後,讓之前的緩存數據被清理了。


看到這篇文章:What Is cfprefsd, and Why Is It Running on my Mac? 明確了我的想法。

通過 man cfprefsd 查看 cfprefsd 的使用手冊,會得到這樣一段話 cfprefsd provides preferences services for the CFPreferences and NSUserDefaults APIs.There are no configuration options to cfprefsd manually.

cfprefsd 這個守護進程給 CFPreferences 和 NSUserDefaults APIs 提供偏好設置服務。沒有手動配置選項。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章