Методы делегата 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
прозрачно, когда нет рекламы для показа. Таким образом, добавление его к вашему мнению и ничего не делать тоже будет работать.