如何提升使用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,我们也不会期望运行已安装应用程序的最终用户正在写入该文件(如果他们不是管理员用户)。

所以这让我们解决了这个问题(尽管我确信更多有经验的开发人员可能有一些想法可以添加)。