如何提升使用CFPreferencesSetValue作为“任何用户”的权限 - macos 10.10 - 10.12
在/ Applications中安装我们的软件后,我希望我们的最终用户能够看到他们在我们的about box中输入的序列号。由于该软件为所有用户激活,我想我需要将这些信息写入一个通用的首选文件位置。然而苹果的文档说CFPreferencesAppSynchronize不能用于kCFPreferencesAnyUser:如何提升使用CFPreferencesSetValue作为“任何用户”的权限 - macos 10.10 - 10.12
“请注意,您只能保存偏好‘非会员’,如果您有 root权限”
所以当然下面的代码无法正常工作(虽然CFPreferencesAppSynchronize返回true):
void WritePrefTest(void)
{
// Write it out
CFStringRef textKey = CFSTR("myTextKey");
CFStringRef applicationID = CFSTR("com.foo.bar");
CFStringRef textValue = CFSTR("text that should be written");
CFPreferencesSetValue(textKey, textValue, applicationID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
Boolean wasSuccessful = CFPreferencesAppSynchronize(kCFPreferencesAnyUser);
assert(wasSuccessful);
// read it back in
CFStringRef prefText = (CFStringRef)CFPreferencesCopyAppValue(textKey, applicationID);
NSLog(@"The text from com.foo.bar == %@", (__bridge NSString *)prefText);
}
由于激活和序列号的项占用以外的地方安装,我应该1)要求提升特权(以前从未做过),2)在其他文件夹(/库/应用程序支持)中创建一个plist - 假设我被允许在那里写入 - 或者3)将它写入其他macos接受的文件夹中?
啊哈!
虽然CFPreferencesAppSynchronize()不会使用kCFPreferencesAnyUser参数在/ Library/Preferences中创建新文件,但它会写入现有文件,如果该文件的权限已设置为允许管理员用户(以及该用户已登录)。由于我们的安装需要管理员权限,因此当用户运行Apple Installer时,Apple Installer的提升权限可以在/ Library/Preferences中创建该文件并赋予其管理员写入权限,以便在产品激活期间以后,用户的序列号可以是添加给所有用户访问。
请注意,此plist文件不是包含用户特定偏好的plist,我们也不会期望运行已安装应用程序的最终用户正在写入该文件(如果他们不是管理员用户)。
所以这让我们解决了这个问题(尽管我确信更多有经验的开发人员可能有一些想法可以添加)。