通常在iOS中,您可以使用CFBundleGetDataPointerForName。但是,我发现CFBundleGetDataPointerForName总是返回NULL指针,指向在iOS-8风格框架中定义的常量,就像WWDC 2014会议416:建立现代框架中讨论的那样。
为了进行复制,我只是使用Xcode框架模板创建一个框架,添加一个构建脚本来生成一个通用二进制文件,并将创建的框架拖到另一个具有框架项目的项目中。然后,我尝试从其中加载一个常量,如下所示:
void * versionNumberConstant = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), CFSTR("TestFramework2VersionNumber"));
NSLog(@"Version number was %@",versionNumberConstant ? @"PRESENT" : @"NULL"); // Prints NULL出于复制目的,这个回购有框架项目,这个回购尝试使用CFBundleGetDataPointerForName从该框架加载常量。我也可以将这个问题复制到其他开发人员已经开发的框架中,比如AdMob的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");
}有人知道为什么会这样吗?或者,如果有一些构建设置,我可以更改以修复它?
版本信息:
发布于 2015-03-21 00:31:19
好的,问题是我需要加载该框架使用的特定包,如下所示:
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()函数时肯定犯了错误。
https://stackoverflow.com/questions/29157468
复制相似问题