1

我们的应用程序在每个播放关卡后显示插页式 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。

4

0 回答 0