2012-07-25 129 views
2

我有一個使用iAd系統,具有回退到AdMob廣告的iPhone應用程序:避免遞歸bannerView:didFailToReceiveAdWithError:iPad上

- (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'的調用)將調用loadView,按照the ViewController.view reference,它會嘗試再次佈局AdBannerView,從而再次觸發失敗。

我認爲它與iPad上的窗口邊界比iPhone上的邊界更大/不同,以及決定是否嘗試加載AdBanner的規則。

一個解決方案可能是調整我已經硬編碼的邊界以進一步到外部(並因此超出iPad的更大範圍)。另一種解決方案是完全避免self.view調用/遞歸風險,並以另一種方式執行 - 但是,AdMobView有點難以置信,並且真的想要通過requestAdWithDelegate實例化,如果我將其放在viewDidLoad中,那麼這會過早。

哪種方法是明智的?

回答

1

解決方案不是要求新的廣告。您的ADBannerViewDelegate負責隱藏和展示廣告,而不是其他內容。從Apple's documentation on iAd Error Handling

Even after an error is sent to your delegate, the banner view continues to try to download new advertisements. Thus, implementing both of these delegate methods allows your application to display the banner only when advertisements are loaded.

2

我有一個類似的問題在iPad上僅是開始self.view所有呼叫引起的bannerView遞歸誤差:didfailToReciveAdWithError。我認爲它與self.view中的視圖有關,尚未在調用didfailToReciveAdWithError方法時分配。爲了解決它,我從該方法中刪除了對self.anything的所有調用。