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

Имам приложение, което чете информация от I 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
@Moshe може ли да ми свържеш някакъв пример? Мога ли да конфигурирам 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
Благодаря Deepak, как мога да направя това? Така че проблемът е, че файлът settings.plist присъства в директорията на приложението на друг потребител, но те могат да го напишат, нали? Как мога да коригирам разрешението? Благодаря - person paul_1991; 01.06.2011
comment
Опитайте да прочетете файла от директорията Library и ако установите, че файлът не съществува, копирайте главния файл (settings.plist, който се доставя с вашето приложение) в директорията Library. Сега започнете да използвате файла за четене и запис. - person Deepak Danduprolu; 01.06.2011
comment
благодаря deeppack, къде се намира директорията на библиотеката? Как мога да копирам този файл в библиотеката, когато приложението се стартира? - person paul_1991; 01.06.2011
comment
Добавен пример. Можете или да го направите, когато приложението е стартирано, както в application:didFinishLaunchingWithOptions:, или можете да го проверявате и копирате мързеливо само когато е необходимо. - person Deepak Danduprolu; 01.06.2011
comment
@deepak: можеш ли да ми помогнеш с нещо - person Legolas; 23.06.2011