【问题标题】:Avoiding recursive bannerView: didFailToReceiveAdWithError: on iPad避免递归bannerView:didFailToReceiveAdWithError:在iPad上
【发布时间】:2012-07-25 01:29:14
【问题描述】:

我有一个使用 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 中就为时过早.

哪种方法是明智的?

【问题讨论】:

    标签: ios ipad iad


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      解决方法是不要请求新广告。您的 ADBannerViewDelegate 负责隐藏和展示广告,仅此而已。来自Apple's documentation on iAd Error Handling

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

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2017-01-31
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        相关资源
        最近更新 更多