Как проанализировать содержимое стороннего файла, созданного с помощью NSKeyedArchiver - PullRequest
4 голосов
/ 11 августа 2011

Мне нужно сравнить две версии файла plist, созданного с помощью NSKeyedArchiver.В частности, это файл «elements», созданный в Xcode для файла .xcdatamodeld.

Поскольку я сам не создал этот файл, я не могу воссоздать его объектную модель.Вместо этого мне нужно понять, какие классы и ключевые свойства содержатся в архиве.

В идеале я хочу создать дерево, содержащее строки, представляющие имена классов вместе с именами и значениями их свойств.Я предполагаю, что вся эта информация хранится в архиве, поэтому должна быть возможность общего анализа этого архива, верно?

Я читал о NSKeyedUnarchiver и его делегате.Я получил только как это:

Разархивировать данные файла:

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = self;
id graph = [unarchiver decodeObjectForKey:@"root"];

Вот метод делегата, который вызывается при запросе неизвестного класса.Я возвращаю прокси-класс, в котором я надеюсь собрать его значения:

- (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames
{
    NSLog(@"wants: %@", name);
    return [ObjProxy class];
}

Прокси-класс реализует

- (id)initWithCoder:(NSCoder *)aDecoder

, в котором я не знаю, как действовать, не знаяактуальные свойства классов.NSCoder, похоже, не предоставляет никаких функций для изучения доступных ключей.Есть ли хитрость, чтобы добраться до них, возможно, переопределив некоторые методы низкоуровневого objc?

Пока, с помощью этого небольшого кода, показанного выше, при разборе файла "elements" я получаю только запрос наодин класс, "XDPMModel", и тогда все готово.

Есть идеи, как заставить это работать, то есть пройти по дереву глубже?

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Вы можете использовать PlistExplorer , это инструмент Какао для проверки файлов, написанных NSKeyedArchiver.

2 голосов
/ 11 августа 2011

Я уже делал это раньше, чтобы декодировать объекты, хранящиеся в файле настроек для Panic's Coda.Я использовал class-dump в приложении (в вашем случае Xcode и связанные с ним структуры), что позволяет вам видеть свойства реальных объектов и использовать их для создания прокси-объектов, соответствующихэти свойства.Затем вы можете успешно использовать NSKeyedUnarchiver и запрашивать у прокси-объектов их значения.

Это довольно трудоемкий процесс, но он работает отлично.В моем случае я работал с plist по умолчанию для пользователя, поэтому мне нужно было определить только пару прокси-классов для объектов, которые меня интересовали, но я думаю, что вам придется определить довольно много для Xcode.

Мне также было бы очень интересно узнать, есть ли способ сделать это без необходимости идти по маршруту class-dump (возможно, как вы говорите, с помощью некоторых функций Objective-C более низкого уровня), потому что этозначительно упростит этот тип реверс-инжиниринга.

...