我有一个从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商店提交应用程序,但其他用户无法读取/写入此文件。 为什么这个? 谢谢 保罗
答案 0 :(得分:10)
您无法回写应用程序包。您必须先将原始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];