集成AdMob插屏广告遇控制台报错,求问题排查方案
解决AdMob插屏广告加载失败(SSL错误+代码逻辑问题)
嘿,我来帮你搞定这个AdMob插屏广告的问题。从你贴的日志和代码来看,主要有两个核心问题需要解决:ATS SSL信任错误,以及代码里的广告加载逻辑漏洞。
一、先处理ATS SSL信任错误(日志里的-1200/9802错误)
你日志里的ATS failed system trust和NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)是App Transport Security(ATS)在阻止不安全的网络请求。虽然AdMob的官方域名都是支持HTTPS的,但模拟器或本地环境偶尔会出现这个问题,试试下面的方案:
- 临时开启ATS任意加载(测试用):
打开项目的Info.plist,添加以下配置(注意上线前要改成针对AdMob域名的例外,不要一直开着):<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - 重置模拟器缓存:
有时候模拟器的SSL缓存会出问题,你可以通过Simulator -> Device -> Erase All Content and Settings重置模拟器,然后重启项目重试。 - 关闭代理/VPN:
如果你的Mac开了代理或VPN,可能会干扰SSL证书验证,先关掉再试试加载广告。
二、修复代码里的广告加载逻辑错误
你的代码在viewDidLoad里有重复初始化的问题,导致第一个广告实例被直接丢弃,而且代理设置的顺序也不对。我帮你调整了代码:
var interstitial: GADInterstitial! @IBOutlet weak var startButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // 直接调用创建并加载广告的方法,避免重复初始化 interstitial = createAndLoadInterstitial() } @IBAction func startButtonAd(_ sender: Any) { if interstitial.isReady { interstitial.present(fromRootViewController: self) } else { // 广告未准备好时,可以提示用户或者重新加载 print("广告尚未准备就绪,正在重新加载...") interstitial = createAndLoadInterstitial() } } func createAndLoadInterstitial() -> GADInterstitial { let interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910") interstitial.delegate = self // 按照日志提示添加测试设备ID,避免被AdMob限制 let request = GADRequest() request.testDevices = [kGADSimulatorID] // 模拟器测试专用 interstitial.load(request) return interstitial } func interstitialDidDismissScreen(_ ad: GADInterstitial) { // 广告关闭后重新加载下一个广告 interstitial = createAndLoadInterstitial() }
这里几个关键的调整点:
- 去掉了
viewDidLoad里重复的interstitial初始化,直接调用createAndLoadInterstitial()完成初始化和加载。 - 添加了测试设备ID,对应日志里的提示,防止频繁请求触发AdMob的限制。
- 在按钮点击事件里增加了广告未准备好的处理逻辑,提升用户体验。
先按上面的步骤修复,应该就能正常加载插屏广告了。
内容的提问来源于stack exchange,提问作者jon wilson
相关产品推荐
相关产品推荐

