В итоге я посмотрел исходный код Core Foundation (в конце концов, NSBundle основан на CFBundle) и понял, в чем проблема. Так..
За сбор содержимого info.plist отвечает функция CFBundleGetInfoDictionary а>. Это вызывается каждый раз, когда запрашивается информация, теоретически содержащаяся в plist.
Глядя на CFBundle.c, реализация CFBundleGetInfoDictionary проверяет, инициализировано ли поле _infoDict пакета, и, если это не так, инициализирует его:
if (!bundle->_infoDict) bundle->_infoDict = _CFBundleCopyInfoDictionaryInDirectoryWithVersion(CFGetAllocator(bundle), bundle->_url, bundle->_version);
При вызове этой функции в моем CFBundle мне не повезло, поэтому я предположил, что что-то не так должно происходить в _CFBundleCopyInfoDictionaryInDirectoryWithVersion.
Глядя на исходный код, я заметил, что в зависимости от bundle->_version, для поиска в информационном списке используется другой путь. Версия в этом случае зависит от структуры каталога, используемой для установки пакета. Если быть точным, моя версия была 0, потому что, как указано в функции _CFBundleURLLooksLikeBundleVersion (используется во время инициализации пакета), пакет с каталогом Resources:
// check for existence of "Resources" or "Contents" or "Support Files"
// but check for the most likely one first
// version 0: old-style "Resources" bundles
// version 1: obsolete "Support Files" bundles
// version 2: modern "Contents" bundles
// version 3: none of the above (see below)
// version 4: not a bundle (for main bundle only)
Итак, чтобы закончить историю, базовый URL-адрес Info.plist инициализируется в _CFBundleCopyInfoDictionaryInDirectoryWithVersion на основе версии 0
infoURLFromBase = _CFBundleInfoURLFromBase0;
что определяется как:
#define _CFBundleInfoURLFromBase0 CFSTR("Resources/Info.plist")
Тааак... Я поместил свой Info.plist в каталог Resources, а не снаружи, и теперь он работает.
Наверное, я какой-то идиот из-за того, что проделал всю эту поездку, учитывая, что этот материал, вероятно, написан где-то в документе, но я не мог его найти :(
person
Nicola Miotto
schedule
26.03.2013