在本地与管理员模式下编写plist的问题

时间:2011-04-09 15:43:31

标签: objective-c cocoa macos plist bundle

在我的应用程序中,我将用户首选项(适用于所有用户)存储到plist文件中, 作为一种捆绑形式附加。

问题是,它在管理模式下运行正常,但是当我运行应用程序时,它没有写入文件。我是否需要设置一些属性以在本地模式下写入plist?或者根本不可能?

我写的文件代码如下:

-(void)SavePrefrence:(NSString *)fileName PrefrenceOption:(NSMutableDictionary *)pDict{
    NSString *filePath  = [[[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"] retain];

    NSDictionary *pTemp = [[NSDictionary alloc]initWithDictionary:pDict];
    bool bRet = [pTemp writeToFile:filePath atomically:YES]; 

    if(bRet==YES){
        NSLog(@"File Saved ");
    }
    else {
        NSLog(@"File not saved ");
    }


}

这是调用它的代码:

-(void)SaveListSettings:(NSMutableDictionary *)pListSettings{
    [ self SavePrefrence:@“MyList" PrefrenceOption:pListSettings];
    if(pListInfo)
        [pListInfo release];
    [self LoadListProfile];

}

2 个答案:

答案 0 :(得分:3)

默认情况下,应用程序包只能由所有者写入(如果通过拖动到Applications文件夹安装它,那么无论是谁安装它;如果它是由.pkg安装的,它应该是root用户) 。你这样做的方式,如果我正确地遵循它,需要用户具有对应用程序的Contents / Resources文件夹的写入权限,这是一个非常糟糕的想法(不是它闻所未闻的 - 请参阅犹他大学的{{ 3}}例如)。实际上,无论如何,在应用程序中保存首选项是一个坏主意;这就是各种Library / Preferences文件夹的用途(〜/ Library / Preferences用于个人设置,/ Library / Preferences用于系统范围的设置。但是,当然,/ Library / Preferences只能由管理员写入(出于很好的理由)我真的不知道如何处理这个问题,因为非管理员可修改的系统范围设置并不完全正常。

答案 1 :(得分:0)

您可以使用安装程序要求输入管理员密码,然后创建“/ Library / Application Support / MyApp”,然后使这个世界可写,或者在其中创建一个世界可写的子文件夹。现在,在非管理员帐户下运行的MyApp仍然可以写入此共享文件夹。

如果您不想使文件夹成为可写入的文件夹,那么请在捆绑包中包含一个帮助应用程序以进行编写,并使用安装程序生成帮助程序setuid root,该安装程序要求输入管理员密码...

顺便说一句:这两个选项都将失败Mac App Store规则。也许你可以使用'/ Users / Shared',但我不知道它是否被MAS允许,无论如何它远非标准。这会让你把它存放在网络服务器上......