【问题标题】:GADBannerView delegate methods not called if the view is not in the view hierarchy如果视图不在视图层次结构中,则不会调用 GADBannerView 委托方法
【发布时间】:2016-06-10 14:33:20
【问题描述】:

我正在 iOS 上使用 Google 移动广告 SDK 并尝试展示一些广告。我的代码:

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 不在视图层次结构中,则根本不会调用委托方法。此外,我找到了this answer,这与我所观察到的一致。另一方面,这是来自 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;

这表明即使视图不在层次结构中,也应该可以接收这些委托回调,这正是我想要的。那么,有什么想法可以实现吗?

【问题讨论】:

  • 您已将GADBannerViewDelegate 添加到您的ViewController,对吗?例如,@interface ViewController () <GADBannerViewDelegate>
  • @Daniel 是的,我已经声明了我的视图控制器来实现协议,我没有收到任何警告。

标签: ios objective-c delegates admob gadbannerview


【解决方案1】:

好的,这里的问题是我没有保留对bannerView 的引用。它在方法返回后被释放,这就是没有调用委托方法的原因。

【讨论】:

    【解决方案2】:

    从 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

    【讨论】:

    • 重命名后现在可以使用了,谢谢,奇怪的是编译器没有警告它?
    【解决方案3】:

    您应该将GADBannerView 添加到您的视图中,并将其隐藏属性最初设置为YES。另外,我建议使用 AdMob 提供的 AdSize 常量 kGADAdSizeBanner。以下是其他 AdSize Constants 的列表。

    例如:

    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 在没有广告可显示时是透明的。因此,将其添加到您的视图中并且不执行任何其他操作也可以。

    【讨论】:

    • 感谢您的回答,但我不想将视图添加到层​​次结构中,实际上我想不惜一切代价避免它,因为这个横幅是集合视图中的一个单元格,所以如果它没有加载,我对它不感兴趣。此外,大小定义为 300x250,因此大小常量对我没有用。 300x250 或所谓的中矩形非常流行,所以我不担心缺少广告展示。
    • @lawicko 我很高兴。您应该编辑您的问题以包含此信息。
    • 您提到横幅视图“应该”最初位于视图层次结构中。 SDK 文档明确声明您可以在将其添加到层次结构之前请求它。
    猜你喜欢
    • 2017-07-11
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2015-12-17
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多