У меня есть двоичный файл, который содержит сериализованный список. Файл был сгенерирован в 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
002С
Я могу открыть simple_array.plist в Xcode (дважды щелкнув по нему) без проблем.
Я также могу открыть его позже в 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
!
Эти последние два оператора открывают другие файлы plist, которые были сгенерированы в Objective C, но не файл, сгенерированный PHP (в Linux).
Есть идеи, что здесь происходит? Эта веб-страница http://nshipster.com/nscoding/ говорит о важности NSCoding для NSKeyed Archiver … это может быть актуально, и если да, то как мне применить в PHP?
Вы можете прочитать список в словаре с помощью:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
Или вы можете использовать NSPropertyListSerialization
:
NSPropertyListFormat format;
NSError *error;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:0 format:&format error:&error];
И с вашими данными, оба из них работали на меня.
Для получения дополнительной информации см. Руководство по программированию списка свойств.
Других решений пока нет …