Обычно в iOS вы можете load constants at runtime using CFBundleGetDataPointerForName
. Тем не менее, я нахожу, что CFBundleGetDataPointerForName
всегда возвращает указатели NULL
для констант, определенных в фреймворках iOS-8, как и те, которые обсуждались в WWDC 2014 Session 416: Building Modern Frameworks.Почему CFBundleGetDataPointerForName не работает для фреймворков iOS 8?
Для репликации я просто создаю фреймворк с шаблоном фреймворка Xcode, добавляя скрипт сборки для создания универсального двоичного файла и перетаскивая созданную структуру в другой проект, имеет проект framework. Тогда я пытаюсь загрузить константу из него так:
void * versionNumberConstant = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), CFSTR("TestFramework2VersionNumber"));
NSLog(@"Version number was %@",versionNumberConstant ? @"PRESENT" : @"NULL"); // Prints NULL
Для целей репликации, this repo имеет рамочный проект, и this repo пытается загрузить константу из этой структуры, используя CFBundleGetDataPointerForName
. Я также могу воспроизвести эту проблему с помощью фреймворков, созданных другими разработчиками, например, AdMob's SDK.
Только в случае, если его проблема с указателем не будучи в CFBundleGetMainBundle()
, я также петельные через каждый CFBundleRef
и не может загрузить константу из любого из них:
CFArrayRef array = CFBundleGetAllBundles();
for (int i = 0; i < CFArrayGetCount(array); i++) {
CFBundleRef bundleRef = (CFBundleRef)CFArrayGetValueAtIndex(array, i);
void * versionPointer = CFBundleGetDataPointerForName(bundleRef, CFSTR("TestFramework2VersionNumber"));
NSLog(@"Version pointer is %@",versionPointer ? @"PRESENT" : @"NULL");
}
Кто-нибудь знает, почему это есть, или если есть какая-то настройка сборки, которую я могу изменить, чтобы исправить ее?
Версия информация:
- Xcode: Версия 6.2 6C131e
- IOS: 8,2 (12D508)
- устройства: iPhone 6/iPhone 6 Simulator