• [cocos2dx 3.0 + ios]如何编写iAd的plugin


    cocos2dx3.0自带的plugin包含推广,收益等各个方面的第三方插件,但是对iAd没有支持,大概是因为专属于IOS,没有单独成库的必要,不过为了统一使用广告的插件化管理,封装一个专属IOS的IAD插件还是有必要的,搞了一天,在这里做个记录,有兴趣的朋友可以参考一下,不完善的地方请指出:

    1:如何创建XCODE库就不说了,创建在其他广告库的同级目录,文件结构也是一样,一共就三个文件:

      .pch

      AdsApple.h

      AdsApple.m

    2:要加入到cocos2dx的PluginManager统一管理,那么我们这个新的类需要继承InterfaceAds,并且链接iAd.framework.

    3:快1点了,直接上代码,完整注释:

      头文件:

    //
    //  AdsApple
    //  AdsApple
    //
    //  Created by kevin on 14-5-2.
    //  Copyright (c) 2014年 kevin. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "iAd/iAd.h"
    
    #import "InterfaceAds.h"
    
    // 广告类型
    typedef enum {
        kTypeBanner = 1,    // 广告栏
        kTypeFullScreen,    // 全屏
    } AppleType;
    
    
    @interface AdsApple : NSObject <InterfaceAds, ADBannerViewDelegate>
    {
    }
    
    @property BOOL debug;
    @property bool bannerVisible;
    @property int bannerPos;
    @property (assign, nonatomic) ADBannerView* bannerView;
    
    // 设置开发者信息
    - (void) configDeveloperInfo: (NSMutableDictionary*) devInfo;
    
    // 显示广告
    - (void) showAds: (NSMutableDictionary*) info position:(int) pos;
    
    // 隐藏广告
    - (void) hideAds: (NSMutableDictionary*) info;
    
    // 位置获取
    - (void) queryPoints;
    
    //
    - (void) spendPoints: (int) points;
    
    // 开关调试模式
    - (void) setDebugMode: (BOOL) isDebugMode;
    
    // 获取SDK版本
    - (NSString*) getSDKVersion;
    
    // 获取插件版本
    - (NSString*) getPluginVersion;
    
    @end
    

      实现:

    //
    //  AdsApple
    //  AdsApple
    //
    //  Created by kevin on 14-5-2.
    //  Copyright (c) 2014年 kevin. All rights reserved.
    //
    
    #import "AdsApple.h"
    #import "AdsWrapper.h"
    
    #define OUTPUT_LOG(...)     if (self.debug) NSLog(__VA_ARGS__);
    #define OUT_POS CGPointMake(-1024, -1024)
    
    @implementation AdsApple
    
    @synthesize debug = __debug;
    
    // 初始化
    - (id)init
    {
        self = [super init];
        if (self) {
            
        }
        
        return self;
    }
    
    // 释放
    - (void)dealloc
    {
        if( self.bannerView != nil ) {
            [self.bannerView removeFromSuperview];
            [self.bannerView release];
            self.bannerView = nil;
        }
        [super dealloc];
    }
    
    #pragma mark InterfaceAds impl
    
    // 设置开发者信息
    - (void) configDeveloperInfo: (NSMutableDictionary*) devInfo
    {
    }
    
    // 显示广告
    - (void) showAds: (NSMutableDictionary*) info position:(int) pos
    {
        NSString* strType = [info objectForKey:@"AppleType"];
        int type = [strType intValue];
        switch (type) {
            case kTypeBanner:
            {
                [self showBanner:pos];
                break;
            }
            case kTypeFullScreen:
                OUTPUT_LOG(@"Now not support full screen view in AppleType");
                break;
            default:
                OUTPUT_LOG(@"The value of 'AppleType' is wrong (should be 1 or 2)");
                break;
        }
    }
    
    - (void) hideAds: (NSMutableDictionary*) info
    {
        NSString* strType = [info objectForKey:@"AppleType"];
        int type = [strType intValue];
        switch (type) {
            case kTypeBanner:
            {
                if (nil != self.bannerView) {
                    [self.bannerView removeFromSuperview];
                    [self.bannerView release];
                    self.bannerView = nil;
                }
                break;
            }
            case kTypeFullScreen:
                OUTPUT_LOG(@"Now not support full screen view in AppleType");
                break;
            default:
                OUTPUT_LOG(@"The value of 'AppleType' is wrong (should be 1 or 2)");
                break;
        }
    }
    
    - (void) queryPoints
    {
        OUTPUT_LOG(@"AdsApple not support query points!");
    }
    
    - (void) spendPoints: (int) points
    {
        OUTPUT_LOG(@"AdsApple not support spend points!");
    }
    
    - (void) setDebugMode: (BOOL) isDebugMode
    {
        self.debug = isDebugMode;
    }
    
    - (NSString*) getSDKVersion
    {
        return @"6.4.2";
    }
    
    - (NSString*) getPluginVersion
    {
        return @"0.2.0";
    }
    
    // 显示广告栏
    - (void) showBanner: (int) pos
    {
        // 如果存在先删除,重新创建
        if (nil != self.bannerView) {
            [self.bannerView removeFromSuperview];
            [self.bannerView release];
            self.bannerView = nil;
        }
        
        // 创建
        self.bannerView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        self.bannerView.frame = CGRectOffset( self.bannerView.frame, 0, -50 );
        self.bannerView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierPortrait];
        self.bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
        self.bannerView.delegate=self;
        [AdsWrapper addAdView:self.bannerView atPos:pos];
        self.bannerView.center = OUT_POS;
        self.bannerPos = pos;
        [UIView commitAnimations];
        self.bannerVisible = false;
    }
    
    // 在加载广告前通告
    - (void)bannerViewWillLoadAd:(ADBannerView *)banner  NS_AVAILABLE_IOS(5_0)
    {
        NSLog( @"bannerViewWillLoadAd" );
    }
    
    // 每次有新广告加载后通告
    - (void)bannerViewDidLoadAd:(ADBannerView *)banner
    {
        NSLog( @"bannerViewDidLoadAd" );
        if( self.bannerVisible == false ) {
            [self.bannerView removeFromSuperview];
            [AdsWrapper addAdView:self.bannerView atPos:self.bannerPos];
            [UIView commitAnimations];
            self.bannerVisible = true;
            // 向监听器发送广告显示的通告
            [AdsWrapper onAdsResult:self withRet:kAdsShown withMsg:@"ok"];
        }
        // 向监听器发送接到数据的通告
        [AdsWrapper onAdsResult:self withRet:kAdsReceived withMsg:@"ok"];
    }
    
    // 发生错误
    - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
    {
        NSLog( @"didFailToReceiveAdWithError" );
        if( self.bannerVisible ) {
            self.bannerView.center = OUT_POS;
            self.bannerVisible = false;
            // 向监听器发送广告隐藏(错过)的通告
            [AdsWrapper onAdsResult:self withRet:kAdsDismissed withMsg:@"ok"];
        }
        // 向监听器发送广告接受数据错误的通告
        [AdsWrapper onAdsResult:self withRet:kNetworkError withMsg:error.domain];
    }
    
    // 当用户点击广告栏通告,返回值BOOL指定广告是否打开
    - (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
    {
        NSLog( @"bannerViewActionShouldBegin" );
        return TRUE;
    }
    
    // 全画面的广告表示完了后,调用该接口
    // 该接口被调用之后,当前程序一般会作为后台程序运行
    // 该接口中需要回复之前被中断的处理(如果有的话)
    - (void)bannerViewActionDidFinish:(ADBannerView *)banner
    {
        NSLog( @"bannerViewActionDidFinish" );
        // 向监听器发送广告点击成功关闭的通告
        [AdsWrapper onPlayerGetPoints:self withPoints:1];
    }
    
    @end
    

     4:使用的时候和其他的插件一样,加载,显示,隐藏,卸载..

        #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
        m_pNowAdsPtl = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin( "AdsApple" ) );
        if( m_pNowAdsPtl ) {
            m_mapAdsInfo["AppleType"] = "1";
            m_bUsingIAD = true;
        }
        #endif
    

     5:iAd有广告点击切换前后的事件通知,为了保证监听接口不变,GetPoint成了点击广告后的监听回调,用于给小费...

     6:iAd在部分国家没有支持,可以根据时区或者其他的检测方法进行广告平台之间的切换,我用的是失败次数检测,这里就不写出来了,各有各的办法.

    结束~ 

  • 相关阅读:
    AOP & 拦截器
    过滤器 & 监听器 & 拦截器
    @PropertySouce注解 读取 properties文件
    SpringBoot整合freemarker 引用基础
    lombok工具插件安装(idea、eclipse)
    Spring Spring boot 获取IOC中的bean,ApplicationContext
    logback 生成 catalina.base_IS_UNDEFINED 问题处理 &如何在eclipse/idea中添加VM参数
    springboot读取系统级环境变量,和读写系统属性以及unittest来获取环境变量的方法
    C#变量命名规则
    C#中的注释
  • 原文地址:https://www.cnblogs.com/KevinYuen/p/3704717.html
Copyright © 2020-2023  润新知