2015-03-20 3 views
0

Обычно в 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

ответ

0

Хорошо, проблема в том, что Мне нужно было загрузить конкретный пакет, который использовался этой картой, например:

NSURL *testFramework2URL = [[[[NSBundle mainBundle] resourceURL] URLByAppendingPathComponent:@"Frameworks" isDirectory:YES] URLByAppendingPathComponent:@"TestFramework2.framework"]; 

CFBundleRef bundleRef = CFBundleCreate(NULL, (__bridge CFURLRef)testFramework2URL); 
NSLog(@"Bundle Ref = %@",bundleRef); 

double * manualVersion = CFBundleGetDataPointerForName(bundleRef, CFSTR("TestFramework2VersionNumber")); 
NSLog(@"Manual version = %@",manualVersion ? @"present" : @"NULL"); // Manual version = present 

double version = *manualVersion; 
NSLog(@"Version = %g",version); // Version = 1 

Я также могу достичь этого, используя CFBundleGetAllBundles(), несмотря на то, что я сказал в вопросе (я, должно быть, ошибся, когда первоначально использовал функцию CFBundleGetAllBundles() или что-то в этом роде.

Смежные вопросы