Методы делегата GADBannerView не вызывают, если представление не находится в иерархии представления

Я работаю с Google Mobile Ads SDK на iOS и пытаюсь показать некоторые объявления. Мой код:

GADBannerView* bannerView = [[GADBannerView alloc] initWithAdSize:GADAdSizeFromCGSize(CGSizeMake(300, 250))];
bannerView.adUnitID = @"hidden";
bannerView.rootViewController = self;
bannerView.delegate = self;

GADRequest* request = [GADRequest request];
request.testDevices = @[ kGADSimulatorID ];

[bannerView loadRequest:request];

Это прекрасно работает, если я добавлю bannerView в иерархию представления сразу после кода, который вы видите выше. Однако я не хочу добавлять его до тех пор, пока не загрузится объявление, поэтому я хотел отложить его. Я заметил, что если bannerView не находится в иерархии представления, методы делегата не вызываются вообще. Кроме того, я нашел этот ответ, который соответствует тому, что я наблюдаю. С другой стороны, это цитата из заголовка GADBannerViewDelegate:

/// Tells the delegate that an ad request successfully received an ad. The delegate may want to add
/// the banner view to the view hierarchy if it hasn't been added yet.
- (void)adViewDidReceiveAd:(GADBannerView *)bannerView;

Это говорит о том, что должна быть возможность получать эти обратные вызовы делегатов, даже если представление не находится в иерархии, а это именно то, что я хочу. Итак, есть идеи, как я могу этого достичь?

3 ответа

Решение

Хорошо, проблема в том, что я не сохранил ссылку на bannerView, Он был освобожден после возврата метода, и поэтому методы делегата не были вызваны.

У меня была такая же проблема после обновления Admob SDK 7.56 до 8.2:

Они изменили имена методов протокола GADBannerViewDelegate.
Например, вместо

      -(void)adViewDidReceiveAd:(GADBannerView *)adView;

сейчас

      -(void)bannerViewDidReceiveAd:(GADBannerView *)bannerView;

см. также руководство по переходу на Admob SDK версии 8:
https://developers.google.com/admob/ios/migration#methods_removedreplaced

Вы должны добавить GADBannerView на ваш взгляд и установите его скрытое свойство YES первоначально. Кроме того, я бы предложил использовать константу AdSize kGADAdSizeBanner что обеспечивает AdMob. Вот список дополнительных констант AdSize.

Например:

bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView.adUnitID = @"YourAdUnitID";
bannerView.rootViewController = self;
bannerView.delegate = self;
[bannerView loadRequest:[GADRequest request]];
bannerView.hidden = YES; // Hide banner initially
[self.view addSubview:bannerView];
// This will put the banner at the bottom of the screen and stretch to fit the screens width
[bannerView setFrame:CGRectMake(0, self.view.frame.size.height - bannerView.frame.size.height, self.view.frame.size.width, bannerView.frame.size.height)];

Затем, когда вы получаете объявление, вы показываете баннер. Например:

-(void)adViewDidReceiveAd:(GADBannerView *)adView {
    // We've received an ad so lets show the banner
    bannerView.hidden = NO;
    NSLog(@"adViewDidReceiveAd");
}

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error {
    // Failed to receive an ad from AdMob so lets hide the banner
    bannerView.hidden = YES;
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]);
}

Вы также можете оживить это, если хотите, установив баннер alpha собственность на 0.0 изначально вместо того, чтобы использовать это hidden имущество. Затем анимируйте alpha когда вы получаете объявление. Например:

-(void)adViewDidReceiveAd:(GADBannerView *)adView {
    // We've received an ad so lets fade in the banner
    [UIView animateWithDuration:0.2 animations:^{
        bannerView.alpha = 1.0;
    }];
    NSLog(@"adViewDidReceiveAd");
}

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error {
    // Failed to receive an ad from AdMob so lets fade out the banner
    [UIView animateWithDuration:0.2 animations:^{
        bannerView.alpha = 0.0;
    }];
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]);
}

Кроме того, как примечание, GADBannerView прозрачно, когда нет рекламы для показа. Таким образом, добавление его к вашему мнению и ничего не делать тоже будет работать.

Другие вопросы по тегам