天天看點

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

iPhone/iPad的程式,即使是Free的版本,也可以通過廣告給我們帶來收入。前提是你的程式足夠吸引人,有足夠的下載下傳量。

這裡,我将介紹一下程式中內建廣告的方法。主要有兩種廣告iAd和AdMob。(還有其他多種可被植入的廣告SDK,這裡就不都一一介紹了)

iAd

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

從iOS 4開始,Apple增加了叫做 iAd 的架構,通過它我們可以在程式中提供Apple的廣告服務。Apple會支付給開發者60%的廣告收入。

iAd Framework中有例程,我們可以下載下傳學習。這裡,把簡單的步驟說明一下 :

追加iAD Framework

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

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

建立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廣告的效果。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

AdMob

AdMob是另一家行動電話廣告市場,現在已被Google收購。借助AdMob, 谷歌計劃将其網絡搜尋主導地位從電腦平台擴充向手機平台。

正因為AdMob現在是Google的了,是以在Android上得到廣泛的應用,不過在iPhone上也是同樣可以使用的。下面就介紹一下使用方法。

其實步驟很簡單:在AdMob上注冊使用者→登陸你的程式→得到程式固有的Publisher ID→下載下傳并在程式中組入相應代碼。

登陸

首先注冊使用者
iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

注冊并登陸之後,需要登記你準備添加廣告的程式(這裡,即使程式還沒有開發完畢也沒有關系)。點選下圖marketplace→添加site/Application

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

選擇iPhone/iPad程式,如果是Android的話就選擇Android應用程式。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

接下來填寫程式的詳細資訊。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

其中關于程式的URL的填寫,如果程式已經釋出,那麼填寫App Store上的URL,否則随便先填一個,以後可以修改。

接下來就可以得到程式的Publisher ID,其使用方法會在下面介紹。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

同時,我們可以下載下傳最新的SDK。(其實也可以通過這裡下載下傳)

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

下載下傳并解壓之後,會得到如下圖的幾個檔案。其中README.txt有環境說明,文檔及例程的下載下傳URL。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

注意點

接下來我們看看程式中怎麼使用該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];
      

顯示的廣告如下圖。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

不過,該設定隻對模拟器有效,在實際裝置上運作時,仍然顯示真實的廣告。如下圖。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

例程

接下來,通過一個例程說明一下AdMob廣告的添加過程。

1. Xcode 4中建立一個「Tab Bar Application」新程式「AdMobTabBar」

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

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

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

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

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

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
      

最終效果如下。

iPhone開發技巧之釋出篇(5)— 在程式中添加廣告

繼續閱讀