iOS:阅读原始plist

时间:2014-01-01 09:44:08

标签: ios encoding

我想阅读UserDefaults plist但不是字典或数据。我希望它像字符串一样,当你用编辑器打开它时。

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *homeDir = [documentsPath stringByReplacingOccurrencesOfString:@"Documents" withString:@""];
NSString *defaultsPath = [homeDir stringByAppendingString:[NSString stringWithFormat:@"Library/Preferences/%@.plist", [[NSBundle mainBundle] bundleIdentifier]]];
NSData *data = [NSData dataWithContentsOfFile:defaultsPath];

已经尝试过:

`NSString *contents = [NSString stringWithContentsOfFile:defaultsPath encoding:NSUTF8StringEncoding error:&error];

最终以

结束
  

无法完成操作。 (可可错误261。)

1 个答案:

答案 0 :(得分:3)

属性列表格式可以是二进制格式或文本格式。二进制plist无法加载到NSString中,因为字符串用于文本,而不是任意二进制数据。你得到的错误似乎表明该文件不能被解释为UTF-8,这意味着它使用其他编码进行编码,或者根本不是文本。

如果您确定属性列表是文本属性列表,则可以使用:

NSStringEncoding enc;
NSString *contents = [NSString stringWithContentsOfFile:defaultsPath usedEncoding:&enc error:&error];

这将允许框架为您确定文本plist的编码。如果它不是文本plist,您可以使用plutil命令行实用程序将其转换为一个:

plutil -convert xml1 file.plist

或者,您可以在代码中通过使用NSPropertyListSerialization类加载plist,从中获取表示plist的NSData作为XML格式,然后然后将其转换为字符串。

一个例子是[未编译和未经测试]:

// load the file as-is into a data object
NSData *data = [NSData dataWithContentsOfFile:defaultsPath];

// convert the plist data into actual property list structure
id plistFile = [NSPropertyListSerialization propertyListWithData:data
                                                         options:0
                                                          format:NULL
                                                           error:&error];

// get the XML representation of the property list
NSData *asXML = [NSPropertyListSerialization dataWithPropertyList:plistFile
                                                           format:NSPropertyListXMLFormat_v1_0
                                                          options:0
                                                            error:&error];

// convert the NSData object into an NSString object
NSString *asString = [[NSString alloc] initWithData:asXML encoding:NSUTF8StringEncoding];

无论原始plist是XML还是二进制格式,这都应该有效。在这个例子中,我假设属性列表的XML表示实际上是UTF-8编码的,因为这是XML数据最常见的编码。