开发者

Problem writing plist in local vs. admin mode

In my application, I am storing user preferences (which are applicable for all users) into a plist file, which is attached as a form of bundle.

The problem is, it runs fine in admin mode, but when I run the application, it's not writing the file. Do I need to set some attribute to write to the plist in local mode? Or is it not possible at all?

My code for writing t开发者_如何学Che file is below:

-(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 ");
    }


}

This is the code which calls it:

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

}


The application bundle will, by default, only be writable by the owner (if it's installed by dragging into the Applications folder, this'll be whoever installed it; if it's installed by a .pkg, it should probably be root). The way you're doing this, if I follow it properly, requires a user to have write access to the app's Contents/Resources folder, which is a really bad idea (not that it's unheard of -- see the University of Utah's documentation about "Poorly-Made Applications" for examples). Actually, saving preferences inside the application is a bad idea anyway; that's what the various Library/Preferences folders are for (~/Library/Preferences for personal settings, /Library/Preferences for system-wide settings. But, of course, /Library/Preferences is only writable by admins (for very good reasons). I don't really know of a good way to handle this, as system-wide settings modifiable by non-admins is not exactly normal.


You could use an installer which asks for an admin password and then create "/Library/Application Support/MyApp" and then either make this world writable, or make a sub-folder inside it which is world-writeable. Now MyApp running under a non-admin account can still write to this shared folder.

If you don't want to make the folder world-writeable then include a helper app to the bundle to do the writing and make the helper setuid root by using an installer which asks for an admin password...

BTW: Both of those options will fail Mac App Store rules. Maybe you can use '/Users/Shared', but I don't know if it is allowed by MAS, and anyway it is far from standard. Which would leave you with storing it on a web server...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜