IOS Cocos2dx 添加Admob 广告错误

依照官方教程添加文件及其 frameWork后 发现运行报错 错误如下

Undefined symbols for architecture i386:

  "_OBJC_CLASS_$_ASIdentifierManager", referenced from:

      objc-class-ref in libGoogleAdMobAds.a(GADIdentifierUtilities.o)

ld: symbol(s) not found for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)

 

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKStoreProductViewController", referenced from:

  objc-class-ref in RevMobAds(RevMobStoreController.o)

"_SKStoreProductParameterITunesItemIdentifier", referenced from:

  -[RevMobStoreController openStoreWithITunesItemId:] in RevMobAds(RevMobStoreController.o)

ld: symbol(s) not found for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)

最终通过添加 frameWork搞定  添加了 StoreKit.framework    AdSupport.framework  CoreData.framework .

运行继续报错

ld: duplicate symbol _OBJC_CLASS_$_AppDelegate in /Users/AbhilashReddy/Library/Developer/Xcode/DerivedData/santabantaa-bykvybsbvqshqshfqxdlsxiqhehc/Build/Intermediates/santabantaa.build/Debug-iphonesimulator/santabantaa.build/Objects-normal/i386/AppDelegate-C7A14BE43C5E8C81.o and /Users/AbhilashReddy/Library/Developer/Xcode/DerivedData/santabantaa-bykvybsbvqshqshfqxdlsxiqhehc/Build/Intermediates/santabantaa.build/Debug-iphonesimulator/santabantaa.build/Objects-normal/i386/AppDelegate-A37C3709371E4892.o for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)

 

原来很是2的把demo也给弄进来了,删除demo的那个文件夹Add-ons 就好了

再次报错 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[GADObjectPrivate changeState:]: unrecognized selector sent to instance 0x95c17d0'

解决方案 add -ObjC to the Other Linker Flags of your application target's build setting。

加了个广告 他妹的把所有能碰到的问题都碰到了 真是技术不纯熟害死人啊。~~~

PS:要弄个全屏的Admob 看了下SDK 似乎没有 就自己动手写  

[[GADBannerView alloc] initWithFrame:self.view.bounds];  结果报错 errors = "Ad size will not fit on screen"  

但是改为 [[GADBannerView alloc] initWithFrame:CGRectMake(0,0,320,480)];  就可以。 但是同时写了下半屏的CGRect,发现半屏的 frame 显示的不完全,左右被压缩得很厉害,造成了只显示了一个icon和一个按钮。不知道怎么解决。



//------------------------------------添加广告的方法


先加入以上这么些,然后在 AppController.mm里面

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
                                     pixelFormat: kEAGLColorFormatRGBA8
                                     depthFormat: GL_DEPTH_COMPONENT16
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples:0 ];

    // Use RootViewController manage EAGLView
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;
    viewController.view = __glView;

    //------------------- Add Admob
   GADBannerView * bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
    
    bannerView_.rootViewController = viewController;
    
    bannerView_.adUnitID = @"a1517648ecd9c44";
    
    GADRequest *request = [GADRequest request];
    
    request.testing = NO;
    
//    request.testDevices = [NSArray arrayWithObjects:
//                           
//                           GAD_SIMULATOR_ID,
//                           
//                           @"YOU IPAD IDF",
//                           
//                           nil];
    //----------------------------
    
    // Set RootViewController to window
    if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
    {
        // warning: addSubView doesn't work on iOS6
        [window addSubview: viewController.view];
    }
    else
    {
        // use this method on ios6
        [window setRootViewController:viewController];
    }
    
    [viewController.view addSubview: bannerView_];
    [viewController.view bringSubviewToFront:bannerView_];
    
    [window makeKeyAndVisible];

    [[UIApplication sharedApplication] setStatusBarHidden: YES];

  
    [bannerView_ loadRequest: request];
    
    cocos2d::CCApplication::sharedApplication()->run();
    return YES;
}

广告就能显示了


广告显示之后,需要在不同的Scene切换广告的位置

实现方式为:

定义一个OC类:

#import 
#import 
@interface MyAdManager : NSObject
{
    
}
+(void)showAddAtTop;
+(void)showAddAtBottom;
@end

#import "MyAdManager.h"
#import "myoc.h"

@implementation MyAdManager

+ (void)showAddAtTop {

        if (view && size.width > 0) {
            [view setFrame:CGRectMake(0, -13, 320, 50)];
        }
}

+ (void)showAddAtBottom {
        if (view && size.width > 0) {
            [view setFrame:CGRectMake(0, size.height - 50, 320, 50)];
        }
}

@end

添加一个全局的 UIView* view,和CGSize size放置到myoc.h

#import 
#import 

UIView* view;
CGSize size;

#endif

由于OC和c++进行混编时,文件后缀需要改成.mm

为了不修改需要添加广告Scene的文件后缀(方便Android编译)

添加一个中间类  AdBridge

#include 
class AdBridge{
    
public:
    static void showAdAtTop();
    static void showAdAtBottom();
};

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "MyAdManager.h"
#endif

void AdBridge::showAdAtTop(){
    
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    [MyAdManager showAddAtTop];
#endif

}
void AdBridge::showAdAtBottom(){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    [MyAdManager showAddAtBottom];
#endif
}

然后将AdBridge.cpp后缀改为mm

再将其加到到需要广告的Scene





你可能感兴趣的:(cocos2dx)