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

加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:13