我有一个包含序列化plist的二进制文件。该文件是由PHP在语句中生成的:
namespace CFPropertyList;
require_once(__DIR__.'/../classes/CFPropertyList/CFPropertyList.php');
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
$plist_filename = __DIR__ . '/simple_array.plist';
$plist = new CFPropertyList();
$td = new \CFPropertyList\CFTypeDetector();
$guessedStructure = $td->toCFType($a);
$plist->add($guessedStructure);
$plist->saveBinary($plist_filename);
simple_array.plist文件的二进制内容是:
6270 6c69 7374 3030 d301 0203 0405 0651 6151 6251 6355 6170 706c 6556 6261 6e61 6e61 a307 0809 5178 5179 517a 080f 1113 151b 2226 282a 0000 0000 0000 0101 0000 0000 0000 000a 0000 0000 0000 0000 0000 0000 0000 002C
我可以在Xcode中打开simple_array.plist(通过双击它)没有问题。
我也可以稍后在PHP中使用以下语句重新打开它,也没有问题:
$plist = new CFPropertyList( $plist_filename, CFPropertyList::FORMAT_BINARY );
问题是当我尝试在Objective C中打开文件时。这些是我正在使用的语句:
NSData *tempData = [NSData dataWithContentsOfFile:path_to_plist_file];
NSArray *fileInfoArray = [NSKeyedUnarchiver unarchiveObjectWithData:tempData];
fileInfoArray
是nil
!
最后两个语句打开了在Objective C中生成的其他plist文件,但没有打开PHP生成的文件(在Linux上)。
知道这里发生了什么吗?这个网页http://nshipster.com/nscoding/讨论了NSCoding对NSKeyed Archiver的重要性......这可能是相关的,如果是的话,我该如何在PHP中应用?
答案 0 :(得分:3)
您可以将plist读入字典:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
或者您可以使用NSPropertyListSerialization
:
NSPropertyListFormat format;
NSError *error;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:0 format:&format error:&error];
根据您的数据,这些都适合我。