Ios 如何在Objective-C中运行时加载GADAdSize常量?

Ios 如何在Objective-C中运行时加载GADAdSize常量?,ios,objective-c,runtime,admob,constants,Ios,Objective C,Runtime,Admob,Constants,我的公司开发了一个广告SDK,用于协调其他广告网络。在运行时,它使用CFBundleGetDataPointerForName从这些SDK加载常量,如本文所述 但是,我无法使用这种方法来加载AdMob的banner SDK使用的GADAdSize常量。我的代码是这样的: HZGADAdSize *hzlookupAdMobAdSizeConstant(NSString *const constantName) { return CFBundleGetDataPointerForName(

我的公司开发了一个广告SDK,用于协调其他广告网络。在运行时,它使用
CFBundleGetDataPointerForName
从这些SDK加载常量,如本文所述

但是,我无法使用这种方法来加载AdMob的banner SDK使用的
GADAdSize
常量。我的代码是这样的:

HZGADAdSize *hzlookupAdMobAdSizeConstant(NSString *const constantName) {
    return CFBundleGetDataPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)constantName);
}

HZGADAdSize *hzAdMobAdSizeFlexibleWidthPortrait(void) {
    return hzlookupAdMobAdSizeConstant(@"kGADAdSizeBanner");
}
上面的代码可以很好地加载类似的常量,比如Facebook的
FBAdSize
struct,但是当尝试加载任何
GADAdSize
常量时,返回的指针是
NULL

以下是如何在AdMob SDK中定义常量:

/// Do not create a GADAdSize manually. Use one of the kGADAdSize constants. Treat GADAdSize as an
/// opaque type. Do not access any fields directly. To obtain a concrete CGSize, use the function
/// CGSizeFromGADAdSize().
typedef struct GADAdSize {
  CGSize size;
  NSUInteger flags;
} GADAdSize;

#pragma mark Standard Sizes

/// iPhone and iPod Touch ad size. Typically 320x50.
extern GADAdSize const kGADAdSizeBanner;
到目前为止我试过的东西
  • 正在尝试应用程序中的所有捆绑包:

    CFArrayRef array = CFBundleGetAllBundles();
    for (int i = 0; i < CFArrayGetCount(array); i++) {
        CFBundleRef bundle = (CFBundleRef)CFArrayGetValueAtIndex(array, i);
        void *ptr = CFBundleGetDataPointerForName(bundle, (__bridge CFStringRef)@"kGADAdSizeBanner");
        if (ptr == NULL) {
            NSLog(@"pointer was NULL");
        } else {
            NSLog(@"pointer was present!!");
        }
    }
    
  • extern
    方法允许我引用常量,但是如果在编译应用程序时AdMob不存在,我会收到关于缺少常量的编译器错误,因此我认为此选项不可行,因为我们的许多开发人员不会使用AdMob

  • 从同一类加载函数指针。编辑:我错了;我也不能加载函数指针。我也无法加载字符串常量

    void *ptr = CFBundleGetFunctionPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)@"CGSizeFromGADAdSize"); // returns NULL
    

  • 为了避免XY问题:我们的SDK在运行时加载常量,这样,如果存在AdMob SDK,我们就可以将它定义的常量传递给它。如果SDK不存在(例如,当开发人员不使用AdMob但使用其他广告网络时),我们仍然需要在没有AdMob的情况下编译SDK。如果有一种方法可以在不在运行时加载值的情况下实现这一点,那对我来说也是一个很好的解决方案

    版本信息:

    • AdMob SDK 7.0.0
    • iPhone6模拟器
    • iOS 8.2
    • Xcode 6.2

    是否在代码中的任何位置设置了
    kGADAdSizeBanner
    ?还有,为什么要使用常量访问它?
    kGADAdSizeBanner
    是AdMob SDK中的常量,由他们在SDK中的编译时语句中设置。除了常量之外,没有其他方法可以访问它,所以我不理解你的第二个问题。我与AdMob合作的时间不够长,不知道是否还有其他方法可以访问常量,但我非常确定必须有其他方法,但是这个输出是什么<代码>GADBannerView*bannerView=[[GADBannerView alloc]initWithAdSize:kGADAdSizeSmartBannerPortrait]
    NSLog(@“%f,%f”,bannerView.frame.size.height,bannerView.frame.size.width)打印:
    50.000000375.000000
    似乎可以工作,请检查读取常量的代码!我在度假,没有互联网和电脑。我会在星期一回来。在那之前,试着追踪你的代码,看看哪里出了问题。
    void *ptr = CFBundleGetFunctionPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)@"CGSizeFromGADAdSize"); // returns NULL