iOS设备上的.plist路径

时间:2012-09-02 14:10:29

标签: ios xcode ios-simulator

-(void)login{
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:@"login" ofType:@"plist"];

    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    [plistDict setObject:@"si" forKey:@"stato"];

    [plistDict writeToFile:path atomically: YES];
}

在iOS模拟器中,plist已正确编写,但当我尝试在我的iPhone上编写.plist时,它不起作用。我想这是因为错误的.plist路径。 iOS设备是否使用不同的路径?

5 个答案:

答案 0 :(得分:5)

首先,您必须检查文档目录中是否存在该文件。如果它不存在,那么您可以将其复制到文档目录。你可以这样做

-(void)login{
    BOOL doesExist;
    NSError *error;
    NSString *filePath= [[NSBundle mainBundle] pathForResource:@"login" ofType:@"plist"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString * path =[[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"login.plist"]];

    doesExist= [fileManager fileExistsAtPath:path];
    if (doesExist) {
        NSMutableDictionary* plistDict=[[NSMutableDictionary alloc] initWithContentsOfFile:path];                
    }
    else
    {    

        doesExist= [fileManager copyItemAtPath:filePath  toPath:path error:&error];
        NSMutableDictionary* plistDict=[[NSMutableDictionary alloc] initWithContentsOfFile:filePath];        
    }  

    [plistDict setObject:@"si" forKey:@"stato"];

    [plistDict writeToFile:path atomically: YES];
}

答案 1 :(得分:2)

您无法写入[NSBundle mainBundle]位置。为了像plist一样写文件,你应该保存在documents文件夹中,这样:

NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *filePathToSave = [arrayPaths objectAtIndex:0];

如果plist是您应用的一部分,我会建议您在第一次启动时使用相同的filePathToSave将其复制到文档文件夹,因此您将始终在那里查看它,两者都是阅读或保存。

答案 2 :(得分:1)

这是一个很大的错误,因为主捆绑只是可读的,只能在App Bundle的编译时编写。 App Bundle位于一个单独的位置,而应写入磁盘的数据应放在沙箱的Documents,Temporary或Library文件夹中。

要获得更多理解,请阅读官方File System Programming Guide 你需要知道的一切都写在那里 您也可以写入子文件夹,在与iTunes或iCloud同步时,您应该在备份方面选择上述3个主目录。例如,tmp文件夹中的内容不会被备份。

答案 3 :(得分:0)

您无法在iOS设备上写入mainBundle。您必须将文件保存到目录并在那里进行修改。

答案 4 :(得分:0)

只是为了将答案带入现代世界 - 你应该真正使用基于URL的方法来获取目录:

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSURL *URLForDocumentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]