當前位置:編程學習大全網 - 源碼下載 - 如何編寫iAd的plugin

如何編寫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在部分國家沒有支持,可以根據時區或者其他的檢測方法進行廣告平臺之間的切換,我用的是失敗次數檢測,這裏就不寫出來了,各有各的辦法.

結束~

  • 上一篇:急求用C語言寫的圖書管理系統源代碼。
  • 下一篇:如何在Java中快速發布WebService服務
  • copyright 2024編程學習大全網