You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Admob中bannerViewDidReceiveAd方法未调用问题求助

问题:Admob横幅广告辅助类BannerAdsManager的bannerViewDidReceiveAd方法始终未触发

我编写了一个Admob辅助类BannerAdsManager来管理横幅广告,已经设置了代理,但bannerViewDidReceiveAd方法始终没有被调用。以下是我的代码实现:

BannerAdsManager代码

protocol BannerAdsManagerProtocol: AnyObject {
    func bannerDidReceiveAd(bannerView: GADBannerView)
}

class BannerAdsManager: NSObject {

    var bannerView: GADBannerView!

    weak var delegate: BannerAdsManagerProtocol?
    var rootViewController: UIViewController

    init(rootViewController: UIViewController, delegate: BannerAdsManagerProtocol?) {
        self.rootViewController = rootViewController
        self.delegate = delegate
    }


    func loadAd(with unitId: String, adSize: GADAdSize) {
        self.bannerView = GADBannerView(adSize: adSize)
        self.bannerView.adUnitID = unitId
        self.bannerView.rootViewController = rootViewController
        self.bannerView.delegate = self
        let request = GADRequest()
        self.bannerView.load(request)
    }
}

extension BannerAdsManager: GADBannerViewDelegate {

    func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
        print(#function)
        delegate?.bannerDidReceiveAd(bannerView: bannerView)
    }


    func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
        print(error.localizedDescription)
    }
}

ViewController调用代码

override func viewDidLoad() {
    super.viewDidLoad()

    let bannerAdsManager = BannerAdsManager(rootViewController: self,
                                            delegate: self)
    bannerAdsManager.loadAd(with: adId, adSize: GADAdSizeLargeBanner)
}

extension ListViewController: BannerAdsManagerProtocol {
    func bannerDidReceiveAd(bannerView: GADBannerView) {
        addBannerViewToView(bannerView, attritube: .bottom)
    }
}

可能的原因及解决办法

  • BannerAdsManager实例被提前释放:你在viewDidLoad里创建的bannerAdsManager是局部变量,方法执行完毕后就会被ARC回收,导致后续广告加载回调无法触发。
    解决:把bannerAdsManager改成ViewController的类属性,比如在ListViewController里声明:

    var bannerAdsManager: BannerAdsManager?
    

    然后在viewDidLoad里初始化:

    self.bannerAdsManager = BannerAdsManager(rootViewController: self, delegate: self)
    self.bannerAdsManager?.loadAd(with: adId, adSize: GADAdSizeLargeBanner)
    
  • AdMob SDK未正确初始化:检查AppDelegate中是否在启动时初始化了AdMob SDK,必须调用:

    GADMobileAds.sharedInstance().start(completionHandler: nil)
    

    没有初始化的话,广告请求根本发不出去。

  • Ad Unit ID错误:确认你使用的adUnitID是否正确——测试广告要用官方提供的测试ID(比如横幅测试ID:ca-app-pub-3940256099942544/2934735716),正式ID需要在AdMob后台正确配置,ID错误会导致广告请求失败。

  • 忽略了错误日志:你已经实现了didFailToReceiveAdWithError方法,查看控制台的错误输出,里面会明确说明广告加载失败的原因(比如无填充、请求被拒绝、网络问题等),根据错误信息针对性排查。

  • 网络或ATS配置问题:确保App允许网络请求,iOS 10+需要在Info.plist中配置NSAppTransportSecurity,允许HTTP请求(测试广告可能用HTTP,正式广告是HTTPS),或者直接添加NSAllowsArbitraryLoads为YES(注意正式上线的合规性)。

内容的提问来源于stack exchange,提问作者john douglas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:13:17