在iPad上避免递归bannerView:didFailToReceiveAdWithError:

时间:2012-07-25 01:29:14

标签: ios ipad iad

我有一个使用iAd的iPhone应用程序,后备AdMob广告:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3f];

    adBannerView.frame = CGRectMake(0, 410, 320, 50);

    [UIView commitAnimations];

    // hide the admob ad
    if(adMobView != nil && adMobView.superview != nil) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3f];
        adMobView.frame = CGRectMake(0, 460, 320, 48);
        [UIView commitAnimations];
    }
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3f];

    // hide banner
    adBannerView.frame = CGRectMake(0, 460, 320, 50);
    [UIView commitAnimations];

    if(adMobView != nil && adMobView.superview != nil) {
        [adMobView requestFreshAd];
    } else {
        adMobView = [AdMobView requestAdWithDelegate:self];
        adMobView.frame = CGRectMake(0, 460, 320, 48);
        [self.view addSubview:adMobView];
    }
}

这在iPhone上运行得非常好。但是,当应用程序在iPad上运行时,这会递归; [self.view addSubview:adMobView];(特别是对'self.view'的调用)按the ViewController.view reference调用loadView,它会尝试再次布局AdBannerView,这会再次触发失败。

我认为它与iPad上的窗口界限大于/不同于iPhone上的界限以及决定是否尝试加载AdBanner的规则有关。

一种解决方案可能是调整我硬编码的边界以进一步向外(因此超出iPad的更大范围)。另一个解决方案是完全避免self.view调用/递归风险并以另一种方式执行 - 但是,AdMobView有点不耐烦并且真的希望由requestAdWithDelegate实例化,如果我把它放到现在就为时过早在viewDidLoad。

哪种方法是明智的?

2 个答案:

答案 0 :(得分:2)

我在iPad上遇到类似的问题,只有以self.view开头的所有调用都在bannerView:didfailToReciveAdWithError上引起了递归错误。我认为它与self中的视图有关。当调用didfailToReciveAdWithError方法时,尚未分配视图。为了解决这个问题,我从该方法中删除了对self.anything的所有调用。

答案 1 :(得分:1)

解决方案不是要求新广告。您的ADBannerViewDelegate负责隐藏和展示广告,而不是其他内容。来自Apple's documentation on iAd Error Handling

  

即使在向您的代理发送错误后,横幅视图仍会继续尝试下载新的广告。因此,实现这两种委托方法只允许应用程序在加载广告时显示横幅。