iPhone开发技巧之发布篇(5)— 在程序中添加广告

iPhone/iPad的程序,即使是Free的版本,也可以通过广告给我们带来收入。前提是你的程序足够吸引人,有足够的下载量。

这里,我将介绍一下程序中集成广告的方法。主要有两种广告iAdAdMob。(还有其他多种可被植入的广告SDK,这里就不都一一介绍了)

iAd

iad

从iOS 4开始,Apple增加了叫做 iAd 的架构,通过它我们可以在程序中提供Apple的广告服务。Apple会支付给开发者60%的广告收入。

iAd Framework中有例程,我们可以下载学习。这里,把简单的步骤说明一下 :

追加iAD Framework

首先,在Xcode的[Frameworks]中添加[iAd.framework]。

iad

创建ADBannerView

广告的显示是在一个叫做ADBannerView的窗口中的。通过控制这个窗口可以控制广告的显示/隐藏。ADBannerView和一般的UIView没有什么两样,将其作为某个画面的subView,然后通过「frame」控制其显示的位置,大小。一般情况下,缺省iPhone上的话,竖屏是:横320pt, 竖50pt;横屏是:横480pt, 竖32pt。

下面的程序显示了ADBannerView的初始化过程,以父窗口的viewDidLoad中实现为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)viewDidLoad {

……【省略】……

    // 初始化ADBannerView
    ADBannerView *adView = [[[ADBannerView alloc] initWithFrame:CGRectZero] autorelease];
    adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
    // 登陆ADBannerView的delegate,这里我们设定其父窗口自己
    adView.delegate = self;
    // 在父窗口下方表示
    adView.frame = CGRectOffset(adView.frame, 0, self.view.frame.size.height - self.adView.frame.size.height);
    // 添加到父窗口中
    [self.view addSubview:adView];
}

接下来,我们来实现ADBannerView的delegate。这里可以实现在父窗口的UIViewController子类中,也可以单独写一个ViewController。这里面实现了ADBannerView广告的读取,错误处理,全画面表示等delegate的处理设定。

下面实现在父窗口的ViewController中。

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>

@interface XXXViewController : UIViewController<UITextFieldDelegate, ADBannerViewDelegate> {

……【省略】……
}

如上所示,这里增加了「ADBannerViewDelegate」protocol的实现。接下来看看都有哪些delegate接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 广告读取过程中出现错误
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError * )error{
    // 切换ADBannerView表示状态,显示→隐藏
    // adView.frame = CGRectOffset(adView.frame, 0, self.view.frame.size.height);
}

// 成功读取广告
- (void)bannerViewDidLoadAd:(ADBannerView *)banner{
    // 切换ADBannerView表示状态,隐藏→显示
    // adView.frame = CGRectOffset(adView.frame, 0, self.view.frame.size.height - adView.frame.size.height);
}

// 用户点击广告是响应,返回值BOOL指定广告是否打开
// 参数willLeaveApplication是指是否用其他的程序打开该广告
// 一般在该函数内让当前View停止,以及准备全画面表示广告
- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave {
    NSLog(@"bannerViewActionShouldBegin:willLeaveApplication: is called.");
}

// 全画面的广告表示完了后,调用该接口
// 该接口被调用之后,当前程序一般会作为后台程序运行
// 该接口中需要回复之前被中断的处理(如果有的话)
- (void)bannerViewActionDidFinish:(ADBannerView *)banner {
    NSLog(@"bannerViewActionDidFinish: is called.");
}

以上都实现之后,我们来看看iAd广告的效果。

AdMob

AdMob是另一家移动电话广告市场,现在已被Google收购。借助AdMob, 谷歌计划将其网络搜索主导地位从电脑平台扩展向手机平台。

正因为AdMob现在是Google的了,所以在Android上得到广泛的应用,不过在iPhone上也是同样可以使用的。下面就介绍一下使用方法。

其实步骤很简单:在AdMob上注册用户→登陆你的程序→得到程序固有的Publisher ID→下载并在程序中组入相应代码。

登陆
首先注册用户

注册并登陆之后,需要登记你准备添加广告的程序(这里,即使程序还没有开发完毕也没有关系)。点击下图marketplace→添加site/Application

选择iPhone/iPad程序,如果是Android的话就选择Android应用程序。

接下来填写程序的详细信息。

其中关于程序的URL的填写,如果程序已经发布,那么填写App Store上的URL,否则随便先填一个,以后可以修改。

接下来就可以得到程序的Publisher ID,其使用方法会在下面介绍。

同时,我们可以下载最新的SDK。(其实也可以通过这里下载)

下载并解压之后,会得到如下图的几个文件。其中README.txt有环境说明,文档例程的下载URL。

注意点

接下来我们看看程序中怎么使用该SDK。首先我们看看例程中有哪些需要注意的。

MY BANNER_UNIT_ID的设定

例程中有下面这样的定义(BannerExampleViewController.m)。

1
2
3
#if !defined(MY_BANNER_UNIT_ID)
  #error "You must define MY_BANNER_UNIT_ID as your AdMob Publisher ID"
#endif

这里就需要上面介绍的注册时得到的程序专有的Publisher ID。没有它,编译的时候将报错。类似下面的样子,我们设定一下。

1
2
3
4
5
#define MY_BANNER_UNIT_ID   @"xxxxxxxxxxxxxxx"

#if !defined(MY_BANNER_UNIT_ID)
  #error "You must define MY_BANNER_UNIT_ID as your AdMob Publisher ID"
#endif
另外,还有一个测试时用的属性

测试的时候将 GADRequest::testing 属性置为 YES。如下For Testing的设置。

1
2
3
4
5
6
7
8
9
10
11
  // Let the runtime know which UIViewController to restore after taking
  // the user wherever the ad goes and add it to the view hierarchy.
  bannerView_.rootViewController = self;
  [self.view addSubview:bannerView_];

  // For Testing
  GADRequest *rq = [GADRequest request];
  rq.testing = YES;

  // Initiate a generic request to load it with an ad.
  [bannerView_ loadRequest:rq];

显示的广告如下图。

不过,该设定只对模拟器有效,在实际设备上运行时,仍然显示真实的广告。如下图。

例程

接下来,通过一个例程说明一下AdMob广告的添加过程。

1. Xcode 4中创建一个「Tab Bar Application」新程序「AdMobTabBar」

2. 将 AdMob SDK 放到该工程中。

3. 添加 AdMob 所必须的 Framework( AudioToolbox, MediaPlayer, MessageUI, SystemConfiguration。)

4. 创建GADBannerView

与iAD中的ADBannerView类似,AdMob也有一个GADBannerView,用来显示广告。其创建过程如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    // Create a view of the standard size at the bottom of the screen.
    bannerView_ = [[GADBannerView alloc]
                            initWithFrame:CGRectMake(0.0,
                                            self.view.frame.size.height -
                                            TABBAR_HEIGHT,
                                            GAD_SIZE_320x50.width,
                                            GAD_SIZE_320x50.height)];

    // delegate の設定
    bannerView_.delegate = self;

    // Specify the ad's "unit identifier." This is your AdMob Publisher ID.
    bannerView_.adUnitID = MY_BANNER_UNIT_ID;

    // Let the runtime know which UIViewController to restore after taking
    // the user wherever the ad goes and add it to the view hierarchy.
    bannerView_.rootViewController = self;
    [self.view addSubview:bannerView_];

    // For Testing
    GADRequest *rq = [GADRequest request];
    rq.testing = YES;

    // Initiate a generic request to load it with an ad.
    [bannerView_ loadRequest:rq];

同样,也有一个叫做GADBannerViewDelegate的delegate。可以实现在父窗口的UIViewController子类中,也可以单独写一个ViewController。

1
2
3
4
5
6
7
8
9
10
#import <UIKit/UIKit.h>

#import "GADBannerView.h"

@interface FirstViewController : UIViewController <GADBannerViewDelegate> {
    GADBannerView *bannerView_;

}

@end
或者
1
2
3
4
5
6
7
#import "GADBannerView.h"
#import "GADBannerViewDelegate.h"

@interface MyBannerView : GADBannerView <GADBannerViewDelegate> {
}

@end

这里的delegate接口与ADBannerViewDelegate其实很类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Admob成功取得
- (void)adViewDidReceiveAd:(GADBannerView *)adMobView {
    NSLog(@"Admob:adViewDidReceiveAd");

    // 动画表示
    adMobAd.frame = CGRectMake(0.0,
             self.view.frame.size.height,
             adMobView.frame.size.width,
             adMobView.frame.size.height);
    [UIView beginAnimations:@"AdMobBannerMoveOnScreen" context:NULL];
    adMobAd.frame = CGRectMake(0.0,
             self.view.frame.size.height - adMobView.frame.size.height,
             adMobView.frame.size.width,
             adMobView.frame.size.height);
    [UIView commitAnimations];
}

// Admob取得失败
- (void)adView:(GADBannerView *)adMobView didFailToReceiveAdWithError:(GADRequestError *)error {
    NSLog(@"Admob:didFailToReceiveAdWithError:%@", [error localizedDescription]);
}

// AdMob广告被打开时
- (void)adViewWillPresentScreen:(GADBannerView *)adView {
}

// 从AdMob的广告跳到其他程序时
-(void) applicationDidEnterBackground:(UIApplication*)application {
}

// 从其他被打开的程序返回到AdMob广告显示
-(void) applicationWillEnterForeground:(UIApplication*)application {
}

// AdMob广告显示被关闭时
- (void)adViewWillDismissScreen:(GADBannerView *)adView {
}

整体的代码如下所示 。这里GADBannerView的delegate实现在父窗口的ViewController中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#import "FirstViewController.h"

#define MY_BANNER_UNIT_ID   @"xxxxxxxxxxxxxxx"
#define ANIMATION_DURATION  0.5f
#define TABBAR_HEIGHT       49.0f

@implementation FirstViewController

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create a view of the standard size at the bottom of the screen.
    bannerView_ = [[GADBannerView alloc]
                            initWithFrame:CGRectMake(0.0,
                                            self.view.frame.size.height -
                                            TABBAR_HEIGHT,
                                            GAD_SIZE_320x50.width,
                                            GAD_SIZE_320x50.height)];

    // delegate の設定
    bannerView_.delegate = self;

    // Specify the ad's "unit identifier." This is your AdMob Publisher ID.
    bannerView_.adUnitID = MY_BANNER_UNIT_ID;

    // Let the runtime know which UIViewController to restore after taking
    // the user wherever the ad goes and add it to the view hierarchy.
    bannerView_.rootViewController = self;
    [self.view addSubview:bannerView_];

    // For Testing
    GADRequest *rq = [GADRequest request];
    rq.testing = YES;

    // Initiate a generic request to load it with an ad.
    [bannerView_ loadRequest:rq];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}


- (void)viewDidUnload
{
    [super viewDidUnload];

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc
{
    bannerView_.delegate = nil;
    [bannerView_ release];

    [super dealloc];
}

- (void)adViewDidReceiveAd:(GADBannerView *)view {
    [UIView animateWithDuration:ANIMATION_DURATION
                     animations:^{
                         bannerView_.center = CGPointMake(bannerView_.center.x, bannerView_.center.y-TABBAR_HEIGHT);
                     }];
}

@end

最终效果如下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值