iOS - 如何正确加载和显示插页式广告iAd?

时间:2014-03-03 15:35:35

标签: timer nstimer iad interstitial

我们的应用程序在每个播放级别后显示插页式iAd。 在关卡完成后,我们会制作广告:

_interstitial = [[ADInterstitialAd alloc] init];
_interstitial.delegate = self;

并且委托实现以下回调方法:

- (void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd
{
    [self finish];
}
- (void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error
{
    [self finish];
}
- (void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd
{
    [_interstitial presentFromViewController:self];
}
- (void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd
{
    [self finish];
}

然后,finish方法清理事物并将用户转发到主菜单。 从创建广告对象到调用完成方法的那一刻起,屏幕上就会显示一个旋转轮。

现在的问题是,如果没有加载广告(例如,如果没有可用的互联网连接),则不会调用任何回调函数,因此我们还会在创建广告时添加NSTimer,并在10秒后检查,例如这样:

_interstitial = [[ADInterstitialAd alloc] init];
_interstitial.delegate = self;
_timer = [NSTimer scheduledTimerWithTimeInterval:10
                                          target:self
                                        selector:@selector(checkForAds:)
                                        userInfo:nil
                                         repeats:false];

-(void)checkForAds:(NSTimer *)timer
{
    [_timer invalidate];
    if(!_interstitial.loaded)
        [self finish];
}

但这看起来非常不干净 - 如果没有互联网连接可用,或者如果连接非常糟糕,它也会导致每个级别后10秒的旋转轮延迟。

所以,我的问题:

  1. 处理这个问题的正确方法是什么?我觉得这里的计时器不是正确的。

  2. 我正在考虑在关卡开始之前创建Ad对象,然后在关卡完成后立即检查_interstitial.loaded属性并在这种情况下显示广告,否则跳过它,而不使用计时器。问题是,一个级别的会话可能需要很长时间(我会说1到60分钟)并且我读到广告可能会过期,但是文档中没有任何迹象表明广告到期需要多长时间以及这个案例。如果广告在后台同时到期,_interstitial.loaded属性是否会返回false?是广告到期时调用的一些回调函数?这是在一个关卡开始之前创建广告对象的可行方法(即,在广告实际显示之前的1-60分钟),之后只检查_interstitial.loaded是否为真,在这种情况下是否显示广告?

0 个答案:

没有答案