加载AdMob激励广告时主线程阻塞问题求助
解决AdMob激励广告加载时主线程阻塞及加载失败问题
问题根源
你遇到的主线程同步查询未加载网络资源属性的错误,是旧版AdMob SDK的已知问题——这类同步操作会阻塞主线程,干扰广告加载流程,最终导致广告加载失败或无法就绪。
具体解决方案
- 更新AdMob SDK到最新版本
旧版本SDK存在主线程阻塞的bug,更新到最新版是最直接的解决方式。如果用CocoaPods,修改Podfile:
pod 'Google-Mobile-Ads-SDK', '~> 11.0.0' # 替换为当前最新版本号
执行pod update Google-Mobile-Ads-SDK完成更新。
- 延迟触发广告加载
在onAppear中立刻调用loadAd会和视图初始化抢占主线程资源,加重同步查询的阻塞问题。可以延迟几百毫秒再加载:
// 在View的onAppear回调中 .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { adCoordinator.loadAd() } }
- 完善错误日志排查
原代码仅打印错误的本地化描述,无法获取详细错误信息。修改loadAd的错误回调:
if let error = error { print("广告加载失败详情: \(error)") // 打印完整错误对象,包含错误码和具体原因 return }
通过详细日志可以确认是否是网络问题、SDK配置问题或其他加载失败原因。
- 检查基础配置
确保App已正确配置AdMob的Info.plist项(如GADApplicationIdentifier),且App拥有网络访问权限(在Info.plist中配置NSAppTransportSecurity允许HTTPS请求)。
代码优化示例
修改后的AdCoordinator增加广告加载状态监听,方便判断广告是否就绪:
class AdCoordinator: NSObject, GADFullScreenContentDelegate, ObservableObject { private var ad: GADRewardedAd? @Published var isAdReady = false // 新增:广告就绪状态标记 func loadAd() { GADRewardedAd.load( withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest() ) { [weak self] ad, error in guard let self = self else { return } if let error = error { print("广告加载失败详情: \(error)") self.isAdReady = false return } self.ad = ad self.ad?.fullScreenContentDelegate = self self.isAdReady = true print("广告加载就绪") } } func presentAd(from viewController: UIViewController) { guard let fullScreenAd = ad else { print("广告未加载完成") return } fullScreenAd.present(fromRootViewController: viewController, userDidEarnRewardHandler: self.didEarnedReward) } private func didEarnedReward() { print("获得奖励") // 执行奖励逻辑 self.isAdReady = false // 广告展示后重置状态,需重新加载 } // 处理广告展示失败 func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { print("广告展示失败: \(error)") self.isAdReady = false } // 广告关闭后重置状态 func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { self.isAdReady = false // 可在此触发下一次广告加载 // self.loadAd() } }
内容的提问来源于stack exchange,提问作者Dipanshu
相关产品推荐
相关产品推荐

