2

AdMob 広告にフォールバックする iAd を使用する iPhone アプリがあります。

- (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」への呼び出し) は、ViewController.view 参照に従って loadView を呼び出します。これは、AdBannerView を再度レイアウトしようとします。これにより、失敗が再びトリガーされます。

iPadのウィンドウの境界がiPhoneよりも大きい/異なること、およびAdBannerをロードするかどうかを決定するルールに関係があると思います。

1 つの解決策はおそらく、ハードコーディングした境界をさらに外側 (つまり、iPad のより広い範囲の外側) に調整することです。もう 1 つの解決策は、self.view 呼び出し / 再帰のリスクを完全に回避し、別の方法で実行することrequestAdWithDelegateです。

どのアプローチが賢明ですか?

4

2 に答える 2

1

解決策は、新しい広告をリクエストしないことです。広告の非表示と表示はお客様ADBannerViewDelegateの責任であり、それ以外の責任はありません。iAd エラー処理に関する Apple のドキュメントから:

デリゲートにエラーが送信された後でも、バナー ビューは引き続き新しい広告をダウンロードしようとします。したがって、これらのデリゲート メソッドの両方を実装すると、アプリケーションは、広告が読み込まれたときにのみバナーを表示できます。

于 2012-10-22T17:29:26.003 に答える