Google Admob中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

