如何提升权限使用CFPreferencesSetValue为"任何用户" - macos 10.10 - 10.12

时间:2016-11-15 23:28:07

标签: xcode macos cocoa installation

在/ Applications中安装我们的软件之后,我希望我们的最终用户能够在我们的相关框中看到他们输入的序列号。由于该软件是为所有用户激活的,我想我需要将该信息写入公共偏好文件位置。但Apple的文档说CFPreferencesAppSynchronize不能用于kCFPreferencesAnyUser:

  

"请注意,如果有,则只能保存“任何用户”的首选项   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(/ Library / Application Support) - 假设我允许在那里写 - 或者3)把它写入其他一些macos接受的文件夹中?

1 个答案:

答案 0 :(得分:0)

啊哈!

虽然CFPreferencesAppSynchronize()不会使用kCFPreferencesAnyUser参数在/ Library / Preferences中创建新文件,但它会写入现有文件,如果该文件的权限已设置为允许管理员用户写入(并且该用户是登录)。由于我们的安装需要管理员权限,当用户运行Apple Installer时,Apple Installer的提升权限可以在/ Library / Preferences中创建该文件并赋予其管理员写入权限,以便稍后在产品激活期间,用户的序列号可以是为所有用户添加了访问权限。

请注意,此plist文件不是包含用户特定首选项的plist,我们也不希望运行已安装应用程序的最终用户写入该文件(如果他们不是管理员用户,则会失败)

因此,这可以解决我们的问题(尽管我确信更有经验的开发人员可能会有一些想法添加)。