如何使用iAd在应用程序中展示Banner广告

Posted 漂泊_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用iAd在应用程序中展示Banner广告相关的知识,希望对你有一定的参考价值。

虽然,你可能即将开始开发下一个超级应用程序,你的一切规划和设计都已就绪,但还是有一件事可能你并没有把它考虑进去--如何通过它盈利呢?有两种选择,要么使它成为一个付费应用程序,那些潜在的用户可以付费下载;或者使它成为一个免费的应用程序,添加一些广告,从广告中赚取收入。
 
如今的趋势表明,用户更有可能下载免费的应用,而不是收费的应用程序。他们只会购买真正值得购买的应用,或者它是超有名气,并获得良好的评价。然而,如果你决定让你的app免费时,就可以在其内整合广告。要做到这一点,你有不同的服务选择来显示广告,其中一个是由苹果提供的iAd网络。毋庸置疑,你甚至已经从教程的标题看出,今天的话题是关于如何使用iAd广告,但是在行动所有之前让先看一些介绍性的东西。
 
在实际开发开始前确定你的应用是免费还是付费非常重要,因为它会直接影响到你的工作。对于付费应用,就没有必要做任何特别的考虑,但是免费的应用程序需要考虑在应用中的什么地方展示广告,并在相应界面进行设置。说到位置,广告应放置到视图控制器的底部或者顶部。如果你的app不包含tab bar,那么广告应该放在屏幕的底部,否则应该放置在屏幕顶部。请注意,退一步讲,如果您在视图中其他地方显示广告,就违背了Human Interface Guidelines,苹果将会拒绝你的应用。
技术分享
 
除了上述所有关于广告位置的规定外,还有一组规则你更应该考虑。首先,不要指望广告是始终可用。各种网络或服务器端的问题可能会给广告带来麻烦,并且你还要考虑当没有广告显示时可能出现难看的空白。当没有广告时显示另一个有意义的视图是个不错的选择。其实,这完全取决于你的应用程序的设计是否应该显示另一个视图,而不是广告横幅显示与否。
 
另外,banner广告不应该一直被其他视图控制器遮蔽。你必须确保他们会出现在最可见的视图控制器上,用户与应用程序交互时,会花更多的时间在上面,这为您的广告获得用户点击和盈利提供了最大的可能性。
 
至于收入,当用户点选广告时苹果和开发者都会受益。实际上,开发商的分得了百分之70%的收入,其余30%是提供iAd网络服务的苹果所持有。同样的分成也适用于付费应用程序。
 
这是很常见的,独立开发者们和公司遵循另一种方法,创建同一应用程序的两个版本。第一个版本,收费,全功能。第二个版本是免费的,但它不包含所有付费版本特性的功能。该免费版本,也被称为精简版,可以有广告,你以后可能从这些广告获得收入;如果用户喜欢的应用程序并且购买付费版本,那你可以获得额外的收入。请记住,你永远不应该在付费应用程序添加广告。即使苹果允许这样的事情发生,我对这件事也表示严重怀疑,你可能会收到很坏的批评和评分,因为用户是不会花钱看广告的。
 
在本教程的下一节中,我们将一如既往实现一个示例应用程序,并通过这一点,你将学习如何将苹果的广告服务整合到你的项目中。即使你对此不熟悉,但你也会发现,使用广告是一个超级简单的过程。所以,请继续阅读并了解如何这一新的伟大工程!
 
APP概述
与往常一样,我们的教程将根据创建的一个示例应用程序。在一个我们将开始开发之前,我们先看如何通过几步操作整合iAd广告并显示广告横幅。更具体地说,我们将做到以下几点:
1.我们将在视图的底部添加一个banner广告。这将是该广告将在可用时显示的容器。如果没有可用的广告,我们就将其隐藏,直到我们有内容显示。
2.一般来说, 当点击广告时会弹出一个全屏的模态视图,会覆盖屏幕上所有内容。在这种情况下,任何关于视觉更新的关键或重要任务,都必须暂停或停止,并在该广告关闭后重新启动。为了演示如何管理这个过程,我们将使用一个定时器计数,来计算用户观看默认视图控制器的视图秒数,并使用一个标签来展示信息包含的计时器的值。当广告被点击时,我们将停止计数,我们将在它再次关闭后重启计数。
 
此外,在本教程中,我们将使用一个额外的框架,即iAd框架。没有它,就不可能展示和处理iAd广告了。
 
下图说明了本教程中所用的示例应用:
技术分享
工程创建
让我们首先为示例应用程序创建一个新项目。启动Xcode和在欢迎窗口中选择相应的选项,如下图:
技术分享
在出现的向导中,根据该节的ios应用程序类别,选择单一视图应用程序模板(Single View Application):
技术分享
 
单击下一步,在Product Name字段中设置的iAdDemo作为项目的名称。此外,请确保设备菜单选项选择的是iPhone。其他设置保持原样,并继续:
技术分享
在引导的最后一步选择一个目录来保存项目,然后单击创建。
 
界面配置
现在我们已经建立了一个空项目,让我们在应用程序的界面上开始工作吧。点击Main.storyboard文件展示Interface Builder。下面你看到的是所有你应添加的子视图以及他们的属性,所以我们在这部分工作的最后结果类似于前面所示的程序图。请注意,您可以跳过描述子视图的这部分,如果你只是想集中讨论了banner广告。
 
UILabel
1. Frame: X=20, Y=60, Width=280, Height=40
2. Text: iAd Integration
3. Font: Avenir Black, 24.0pt
4. Text Alignment: Center
 
UILabel
1. Frame: X=20, Y=108, Width=280, Height=21
2. Text: by Appcoda
3. Font: Avenir Medium Oblique, 17.0pt
4. Text Alignment: Center
5. Text Color: Red=255, Green=128, Blue=0
 
UILabel
1. Frame: X=20, Y=360, Width=280, Height=40
2. Text: None
3. Font: Noteworthy Light, 15.0pt
4. Text Alignment: Center
5. Text Color: Light Gray
 
UILabel
1. Frame: X=0, Y=518, Width=320, Height=50
2. Text: Ad banner will appear here
3. Font: Avenir Medium, 14.0pt
4. Text Alignment: Center
5. Text Color: White
6. Background Color: Red=255, Green=128, Blue=0
 
ADBannerView
1. Frame: X=0, Y=518, Width=320, Height=50
 
加入上述所有子视图,并设置其属性后如图所示,你的界面看起来应该像这样:
技术分享
因此有必要现在就创建并连接两个IBOutlet属性。第一个连接banner广告视图,而第二个将连接到一个不包含文本的标签。对于这个标签,我们将稍后显示的时间计数器的值。打开ViewController.h文件,添加如下两行:
  1. @interface ViewController : UIViewController <ADBannerViewDelegate> 
  2.  
  3. @property (weak, nonatomic) IBOutlet ADBannerView *adBanner; 
  4.  
  5. @property (weak, nonatomic) IBOutlet UILabel *lblTimerMessage; 
  6.  
  7. @end 
 
此时Xcode将发出错误和一些警告。那是因为我们还没有加入iAd的框架。我们并没有在文件中加入相应的库。让我们来解决它,让我们开始加入框架。在项目导航器(Project Navigator)中,单击iAdDemo项目,然后点击General选项卡。
技术分享
接着,在屏幕的底部,在Linked Frameworks and Libraries部分,单击加号图标添加新的框架。在出现的新窗中,开始输入文字:“iAd Framework”,Xcode会立即显示它。选中它,然后点击Add按钮:
技术分享
现在,回到ViewController.h头文件,并导入下一个库:
  1. #import <iAd/iAd.h> 
此时,Xcode中将不会再显示任何错误和警告。最后,我们的类必须采取banner广告协议,这样我们就可以访问所有必要的委托方法。修改界面标题行,如下所示:
  1. @interface ViewController : UIViewController <ADBannerViewDelegate> 
 
最后的步骤,这两个IBOutlet属性必须被连接到相应的子视图。打开Main.storyboard文件,并把adBanner属性连接到该banner视图, 同时把lblTimerMessage标签连接到无文字标签视图。
技术分享
iAd的整合
通过将banner广告添加到界面以及把iAd框架到项目中,广告已经能够被传递到应用程序。然而,没有处理是可用的,因此我们的目标是采取一切行为让广告横幅的管理可行的。
 
iAd框架提供了几个委托方法来管理广告。这些方法让我们知道一个广告即将被显示或它已经显示出;当用户点击一个广告时发生错误以及没有更多的广告可以送达;当用户点击广告以查看它的全屏视图时模态视图丢失等。除了所有这些,你应该时刻记得广告可能不会被传达。因此,直到第一个广告准备好要显示时,横幅广告必须是不可见的。它也应该成为隐藏在iAd网络将停止投放广告的一些原因。当iAd网络因为一些原因停止广告服务时它也应该是隐藏的。
 
在深入代码之前,我们开始必须执行两件事情:我们先构造横幅广告视图的委托的类,其次将其隐藏。打开ViewController.m文件,并转到viewDidLoad方法并补充下几行:
  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.     // Do any additional setup after loading the view, typically from a nib. 
  4.  
  5.     // Make self the delegate of the ad banner. 
  6.     self.adBanner.delegate = self; 
  7.  
  8.     // Initially hide the ad banner. 
  9.     self.adBanner.alpha = 0.0; 
 
正如你看到的,通过把它的Alpha值设为0,我们隐藏了banner视图。随后,当一个委托方法会通知我们,广告已准备好要显示时,我们再将这个值设置为1,另外我们也使用动画让其更具吸引力。更改alpha值,显然不是隐藏或显示广告横幅的唯一途径。还有许多其他的方法来做到这一点,例如设置更改隐藏显示栏的属性的值,或一开始就把banner广告放置在可见屏幕区域之外。用什么方法,你最终的选择完全取决于你,选择最适合你应用的方法。为了简便起见,我只是选择使用alpha值。
 
该ADBannerViewDelegate协议总共提供5个委托方法。通过它们,我们可以管理广告和应用程序的最终行为。我们会逐个进行简单的分析。需要注意的是在每一个委托方法体里,我特意加了NSLog命令,所以当我们运行应用程序后可以知道调用了哪一种方法。
 
第一种方法:
  1. -(void)bannerViewWillLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner will load ad."); 
 
从方法的名称很容易得出结论,当一个新的广告即将被载入时调用。请注意,当这个方法被调用时广告还没有准备好要显示。
 
第二个委托方法:
  1. -(void)bannerViewDidLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner did load ad."); 
当新广告已加载并准备显示时调用该方法。随后,在这个方法中,我们需要添加能让banner广告再次可见的代码,这样我们就知道有广告可以显示。
 
第三个委托方法:
  1. -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{ 
  2.     NSLog(@"Ad Banner action is about to begin."); 
  3.  
  4.     return YES; 
当用户点击banner广告时将调用此方法,并且该广告将以全尺寸模式视图显示。当发生这种情况时,需要暂停用户的任何视觉上的进程或关键任务,直到解除模态视图。这种方法有趣之处是它返回的值。当返回值是YES,那么广告将显示在全屏视图。但是,如果返回值是NO,当用户点击该广告时,什么都不会发生。
 
第四个委托方法:
  1. -(void)bannerViewActionDidFinish:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner action did finish"); 
 
全屏视图添加解除时调用该方法。这是非常有用的,因为在这里任何暂停或停止任务都应该被再次放到Action里了。
 
最后,第五个委托方法:
  1. -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
  2.     NSLog(@"Unable to show ads. Error: %@", [error localizedDescription]); 
这个方法也是非常有用和重要的,因为它调用的时候没有广告可被传递到应用程序。当它被调用时,我们的工作就是隐藏banner视图,以便在没有广告展示时,不会给用户一个空白区。
 
正如你所了解的,所有这些委托方法都使广告处理变得非常容易。现在,正如我们之前所说,我们必须在广告已准备好要显示时展示banner广告,所以要修改bannerViewDidLoadAd:委托方法,如下所示:
  1. -(void)bannerViewDidLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner did load ad."); 
  3.  
  4.     // Show the ad banner. 
  5.     [UIView animateWithDuration:0.5 animations:^{ 
  6.         self.adBanner.alpha = 1.0; 
  7.     }]; 
你看,我们用动画的形式设置我们的banner广告视图的alpha值设置为1。该动画将设置成一个淡入效果。
 
最后,当没有广告将显示时,我们应该隐藏的广告横幅视图。在bannerView:didFailToReceiveAdWithError:添加与上述相同的代码,这一次设置Alpha值为0:
  1. -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
  2.     NSLog(@"Unable to show ads. Error: %@", [error localizedDescription]); 
  3.  
  4.     // Hide the ad banner. 
  5.     [UIView animateWithDuration:0.5 animations:^{ 
  6.         self.adBanner.alpha = 0.0; 
  7.     }]; 
与广告最重要的相关工作已经完成。在本教程的下一节中,我们将看到如何使用其他委托方法,但是我们的应用程序已经可以使用了。所以,你可以对它进行一次尝试,等待第一个广告被显示。
 
添加计数器
广告横幅现在已经能很好的工作了,最重要的环节--正确地显示和隐藏的横幅广告已经实现。然而,本教程并不只是讨论所有重要的委托方法,所以在这一节中我们要做一个有趣的项目。我们将使用一个定时器(一个NSTimer对象),将计算用户看到视图控制器场景的秒数,并利用iAd的框架提供的委托方法,在广告以全屏模式展示时,我们将暂停计数。当广告视图解除后,计数器将重新工作。
 
让我们开始通过声明三个属性,以实现我们需要的目的。第一个属性是定时器对象,第二个将用于计算秒数的整数值,最后第三个属性是一个boolean标志,将指示计数是否应该暂停。在ViewController.m文件,转到私有类部分,并添加如下所示的属性:
  1. @interface ViewController () 
  2.  
  3. @property (nonatomic, strong) NSTimer *timer; 
  4.  
  5. @property (nonatomic) int secondsElapsed; 
  6.  
  7. @property (nonatomic) BOOL pauseTimeCounting; 
  8.  
  9.  
  10. @end 
 
现在,在viewDidLoad方法中,让我们做一些初始化:
  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.       ... 
  4.      ... 
  5.  
  6.     // Start the timer. 
  7.     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showTimerMessage) userInfo:nil repeats:YES]; 
  8.  
  9.     // Set the initial value for the elapsed seconds. 
  10.     self.secondsElapsed = 0; 
 
正如你在创建定时器对象过程中看到的那样,选择器参数被设置为showTimerMessage方法。这是一个尚不存在的私有方法,由定时器每隔一秒调用(设置为1.0的间隔参数)。当然,我们希望我们的计时器反复工作,所以我们重复设置参数值为YES。
 
现在Xcode显示警告,因为它无法找到上述声明的方法。让我们首先声明这个方法来解决它,然后我们将定义它。回到私有类部分,并添加下一行:
  1. @interface ViewController () 
  2.  
  3. ... 
  4. ... 
  5.  
  6. -(void)showTimerMessage; 
  7.  
  8. @end 
 
现在在它的定义中,你会看到下面的代码片段,代码执行流程依赖于pauseTimeCounting标志。如果它的值是false,那么我们将继续计数和更新lblTimerMessage中的文本。显然,当它的值为true,我们就不计数了。注意,任何文本更新之前有必要增加secondsElapsed属性的值。实现是非常简单的,所以你看:
  1. -(void)showTimerMessage{ 
  2.     if (!self.pauseTimeCounting) { 
  3.         self.secondsElapsed++; 
  4.  
  5.         self.lblTimerMessage.text = [NSString stringWithFormat:@"You‘ve been viewing this view for %d seconds", self.secondsElapsed]; 
  6.     } 
  7.     else
  8.         self.lblTimerMessage.text = @"Paused to show ad..."
  9.     } 
 
让我们来看看如何使用其他两个iAd的委托方法。我们看到的第一个是bannerViewActionShouldBegin:willLeaveApplication:。正如我已经说过,这种方法在用户已点击了广告之后被调用,以全屏视图显示该广告。当然,有必要将方法的返回值设置为YES,否则将没有广告显示。当调用此方法时我们所要的就非常简单了: 告诉我们的应用程序应该暂停时间计数。想要做到这一点,我们可简单地改变pauseTimeCounting标志的值。让我们先来看看方法:
  1. -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{ 
  2.     NSLog(@"Ad Banner action is about to begin."); 
  3.  
  4.     self.pauseTimeCounting = YES; 
  5.  
  6.     return YES; 
 
除了暂停计数过程, 当一个带有广告的全图像视图被关闭时,我们还必须允许它可以继续下去。为了这个目的,我们将使用bannerViewActionDidFinish:委托方法。在这里面,我们将简单地再次更改标志的值。如下:
  1. -(void)bannerViewActionDidFinish:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner action did finish"); 
  3.  
  4.     self.pauseTimeCounting = NO; 
 
这是我们最后的环节!现在,当广告横幅被点击时计数将暂停;当banner解除时,它会再次计数。
 
编译并运行应用程序
此时,你可以自由地编译和运行应用程序。你会发现,广告横幅将会在屏幕底部出现一段时间,计数器的值会显示在消息标签上。点击广告横幅,就会看到一个全屏模式广告。当您返回到视图控制器的场景,并显示正在观看广告时,你看到的计数器并不是活跃的。如果突然没有广告被服务,不用担心,这是正常的。广告投放可能随时会停止。
 
作为一个额外的练习,你可以尝试在视图的顶部显示的广告横幅。
技术分享
总结
广告集成到应用程序中是一个相当常见的策略,而且是一个很好的方式,让你的免费应用程序也能带来一些收入。说实话,也许你不会通过广告赚一大笔,但如果你的应用程序获得大的下载量是,那么你就可能有一个显著的收益。正如你在本教程中所看到的,有关于广告横幅简单的规则,以及所需的代码仅几行而已。所以,如果你还在想着是否应该在你的应用程序中添加广告以及如何添加,那么这是一个不错的机会。当然,官方文档也是如此建议并鼓励使用他们的。我希望这个教程对大家能有一些帮助,并希望你一如既往地随时与我们分享任何想法或意见。

以上是关于如何使用iAd在应用程序中展示Banner广告的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 上同时展示 iAd 和 AdMobAd

iAd 不显示广告

从少数国家下载的应用程序中没有 iAd

iAd 没有出现在我刚刚发布的应用中

iAd.frameWork 设置app底部广告启动显示不同步问题

iAd Banner 不出现但代码和正确