¿Cómo puedo cargar constantes GADAdSize en time de ejecución en Objective-C?

Mi compañía desarrolla un SDK publicitario que media en otras networkinges publicitarias. En time de ejecución, carga constantes de esos SDK usando CFBundleGetDataPointerForName , como se describe en esta publicación de StackOverflow .

Sin embargo, no puedo lograr que ese enfoque funcione para cargar las constantes de GADAdSize que utiliza el banner SDK de AdMob. Esto es como se ve mi código:

 HZGADAdSize *hzlookupAdMobAdSizeConstant(NSString *const constantName) { return CFBundleGetDataPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)constantName); } HZGADAdSize *hzAdMobAdSizeFlexibleWidthPortrait(void) { return hzlookupAdMobAdSizeConstant(@"kGADAdSizeBanner"); } 

El código anterior funciona bien para cargar constantes similares, como la estructura FBAdSize de Facebook, pero el puntero devuelto es NULL al intentar cargar cualquier constante GADAdSize .

A continuación, se explica cómo se define la constante en el SDK de AdMob:

 /// 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; 

Cosas que he intentado hasta ahora

  1. Intentando con todos los packages de la aplicación:

     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!!"); } } 

Ninguno de los packages de la aplicación tiene la constante, así que no creo que sea un problema de que los pointers estén en un package diferente.

  1. Marcar las constantes como extern en mi código

     extern HZGADAdSize const kGADAdSizeSmartBannerPortrait; 

El enfoque extern me permite hacer reference a las constantes, pero si AdMob no está presente cuando se comstack la aplicación, obtengo errores de compilation sobre las constantes faltantes, por lo que no creo que esta opción sea factible, ya que muchos de nuestros desarrolladores no utilizarán AdMob

  1. Carga de pointers de function de la misma class. Edit: Me equivoqué; Tampoco puedo cargar pointers de function. Tampoco puedo cargar constantes de cadena.

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

Para evitar problemas XY: nuestro SDK carga constantes en time de ejecución, de modo que si, por ejemplo, el SDK de AdMob está presente, podemos pasar las constantes que define. Si el SDK no está presente (por ejemplo, cuando el desarrollador no está utilizando AdMob pero está utilizando otras networkinges publicitarias), aún necesitamos nuestro SDK para comstackr sin que AdMob esté allí. Si hay una forma en que podemos lograr esto sin cargar valores en time de ejecución, esa es una solución tan buena para mí.

Información de versión:

  • AdMob SDK 7.0.0
  • iPhone 6 Simulator
  • iOS 8.2
  • Xcode 6.2