1

我有一个包含序列化 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];

fileInfoArraynil

最后两个语句打开了在 Objective C 中生成的其他 plist 文件,但不是 PHP 生成的文件(在 Linux 上)。

知道这里发生了什么吗?这个网页http://nshipster.com/nscoding/讨论了 NSCoding 对 NSKeyed​Archiver 的重要性......这可能是相关的,如果是的话,我如何在 PHP 中应用?

4

1 回答 1

3

您可以使用以下命令将 plist 读入字典:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];

或者您可以使用NSPropertyListSerialization

NSPropertyListFormat format;
NSError *error;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:0 format:&format error:&error];

有了你的数据,这两个都对我有用。

有关详细信息,请参阅属性列表编程指南

于 2016-05-19T18:59:53.023 回答