我想阅读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。)
答案 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数据最常见的编码。