Странная проблема с чтением и записью файла plist

У меня есть приложение, которое считывает информацию из файла plist. Для этого я использую этот код ниже:

  NSData *plistData;  
    NSString *error;  
    NSPropertyListFormat format;  
    id plist;  
    localizedPath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];  
    plistData = [NSData dataWithContentsOfFile:localizedPath];   

    plist = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];  
    if (!plist) {  
        NSLog(@"Error reading plist from file '%s', error = '%s'", [localizedPath UTF8String], [error UTF8String]);  
        [error release];  
    }  




    NSString *tel=[NSString stringWithFormat:@"tel:%@",[plist objectForKey:@"number"]];
    NSURL *telephoneURL = [NSURL URLWithString:tel];
    [[UIApplication sharedApplication] openURL:telephoneURL];

И чтобы написать это, я использую этот код:

- (IBAction) saveSetting:(id)sender{



    NSData *plistData;  
    NSString *error;  
    NSPropertyListFormat format;  
    id plist;  

    NSString *localizedPath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];  
    plistData = [NSData dataWithContentsOfFile:localizedPath];   

    plist = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListMutableContainers format:&format errorDescription:&error];  
    if (!plist) {  
        NSLog(@"Error reading plist from file '%s', error = '%s'", [localizedPath UTF8String], [error UTF8String]);  
        [error release];  
    }  

    NSLog([plist objectForKey:@"message"]);
    [plist setValue:textMex.text forKey:@"message"];
    NSLog([plist objectForKey:@"message"]);

    NSLog([plist objectForKey:@"number"]);
    [plist setValue:textNumero.text forKey:@"number"];
    NSLog([plist objectForKey:@"number"]);

    [plist setValue:@"NO" forKey:@"firstTime"];

    [plist writeToFile:localizedPath atomically:YES];

    [self aggiorna];




    [settingScreen removeFromSuperview];

}

Теперь у меня большая проблема: приложение работает правильно на всех моих устройствах разработчика и в симуляторе, и приложение правильно читает и записывает файл. Я отправляю приложение в магазин Apple, но другие пользователи не могут читать/записывать этот файл. Почему это? Спасибо, Паоло.


person paul_1991    schedule 31.05.2011    source источник
comment
Apple отклонила его или приняла, но у пользователей возникли проблемы? Вы знаете, что говорит сообщение об ошибке?   -  person Rayfleck    schedule 01.06.2011
comment
Почему бы просто не использовать NSArray или NSDictionary для чтения и записи списка свойств? Вроде в десять раз легче. WTP?   -  person    schedule 01.06.2011
comment
Почему бы не использовать NSUserDefaults? Он предназначен для настроек и по сути представляет собой plist.   -  person Moshe    schedule 01.06.2011
comment
@WTP, можете ли вы опубликовать тот же пример? Благодарность   -  person paul_1991    schedule 01.06.2011
comment
Вы уверены, что не получили никакой ошибки при вызове метода saveSetting? Этот код вообще не должен работать.   -  person Black Frog    schedule 01.06.2011
comment
@ Моше Моше, можешь привести мне пример? Могу ли я настроить NSUserDefaults как мой файл settings.plist?   -  person paul_1991    schedule 01.06.2011
comment
@paul_1991 Написать: [[NSDictionary dictionaryWithObjectsAndKeys:…stuff here…] writeToURL:myPlistURL atomically:YES]; | Читать: NSDictionary *settingsDict = [NSDictionary dictionaryWithContentsOfURL:myPlistURL];   -  person    schedule 01.06.2011


Ответы (1)


Вы не можете написать обратно в пакет приложений. Вам нужно будет скопировать исходный файл plist в каталог документов или любое другое доступное для записи место, прежде чем его можно будет записать.

Пример

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString libraryPath = [paths objectAtIndex:0];
NSString plistPath = [libraryPath stringByAppendingPathComponent:@"settings.plist"];

// Checks if the file exists at the writable location.
if ( ![[NSFileManager defaultManager] fileExistsAtPath:plistPath] ) {
    NSString *masterFilePath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];

    // Try to copy the master file to the writable location
    NSError *error;
    if ( ![[NSFileManager defaultManager] copyItemAtPath:masterFilePath toPath:plistPath error:&error] ) {
        NSLog(@"Error: %@", [error localizedDescription]); 
        // Serious error.
    }
}

...
// Ready for use.
NSData *plistData = [NSData dataWithContentsOfFile:plistPath];
person Deepak Danduprolu    schedule 31.05.2011
comment
Спасибо Дипак, как я могу это сделать? Итак, проблема в том, что файл settings.plist присутствует в каталоге приложений другого пользователя, но они могут это написать, верно? Как я могу исправить разрешение? Благодарность - person paul_1991; 01.06.2011
comment
Попробуйте прочитать файл из каталога библиотеки, и если вы обнаружите, что файл не существует, скопируйте основной файл (файл settings.plist, поставляемый с вашим приложением) в каталог библиотеки. Теперь начните использовать файл для чтения и записи. - person Deepak Danduprolu; 01.06.2011
comment
спасибо, Deepack, где находится каталог библиотеки? Как я могу скопировать этот файл в библиотеку при запуске приложения? - person paul_1991; 01.06.2011
comment
Добавил пример. Вы можете сделать это, когда приложение запущено, как в application:didFinishLaunchingWithOptions:, или вы можете проверять и копировать его лениво только тогда, когда это необходимо. - person Deepak Danduprolu; 01.06.2011
comment
@deepak: ты не мог бы мне кое с чем помочь - person Legolas; 23.06.2011