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

SwiftUI集成UMP SDK时,如何将插页广告替换为横幅广告加载?

SwiftUI集成UMP SDK时,如何将插页广告替换为横幅广告加载?

嘿,我来帮你搞定这个问题!在SwiftUI里把插页广告换成横幅广告其实没那么复杂,核心是要处理好UIKit和SwiftUI的视图桥接——毕竟Google的横幅广告组件GADBannerView是基于UIKit的,咱们得给它做个“包装”才能在SwiftUI里正常使用。

下面是具体的实现步骤和代码调整:

第一步:创建SwiftUI兼容的横幅广告包装视图

首先,咱们需要写一个UIViewRepresentable结构体,把GADBannerView包装成SwiftUI能识别的视图:

import SwiftUI
import GoogleMobileAds

struct BannerAdView: UIViewRepresentable {
    let adUnitID: String // 你的横幅广告单元ID
    @Binding var adLoaded: Bool // 可选:用来标记广告是否加载完成

    func makeUIView(context: Context) -> GADBannerView {
        let bannerView = GADBannerView(adSize: GADAdSizeBanner)
        bannerView.adUnitID = adUnitID
        bannerView.rootViewController = UIApplication.shared.windows.first?.rootViewController
        bannerView.delegate = context.coordinator
        // 触发广告加载
        bannerView.load(GADRequest())
        return bannerView
    }

    func updateUIView(_ uiView: GADBannerView, context: Context) {
        // 状态变化时的刷新逻辑,按需添加
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, GADBannerViewDelegate {
        let parent: BannerAdView

        init(_ parent: BannerAdView) {
            self.parent = parent
        }

        // 广告加载成功回调
        func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
            parent.adLoaded = true
        }

        // 广告加载失败回调,可添加错误处理
        func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
            print("横幅广告加载失败:\(error.localizedDescription)")
            parent.adLoaded = false
        }
    }
}

第二步:调整广告SDK初始化逻辑

你原来的startGoogleMobileAdsSDK方法只需要保留SDK初始化的部分就行,不需要在里面直接请求插页广告了——横幅广告的加载会和咱们的包装视图绑定,在视图渲染时自动触发:

// 可以把这段逻辑放在ViewModel或者View中
@State private var isMobileAdsStartCalled = false
@State private var isBannerAdLoaded = false
// 测试用广告单元ID,上线记得替换成你的正式ID
let bannerAdUnitID = "ca-app-pub-3940256099942544/2934735716"

private func startGoogleMobileAdsSDK() {
    DispatchQueue.main.async {
        guard !self.isMobileAdsStartCalled else { return }
        self.isMobileAdsStartCalled = true
        // 初始化Google Mobile Ads SDK
        GADMobileAds.sharedInstance().start(completionHandler: { status in
            print("Google Ads SDK初始化完成:\(status)")
        })
    }
}

第三步:在SwiftUI视图中展示横幅广告

最后,在你的主视图里调用初始化方法,并添加咱们的横幅广告视图就行:

struct ContentView: View {
    @State private var isBannerAdLoaded = false
    @State private var isMobileAdsStarted = false

    var body: some View {
        VStack {
            // 你的主内容区域
            Text("这是你的应用主内容")
                .padding()
                .font(.title)
            
            // 横幅广告,放在你需要的位置(比如底部)
            if isBannerAdLoaded {
                BannerAdView(adUnitID: bannerAdUnitID, adLoaded: $isBannerAdLoaded)
                    .frame(height: 50) // 对应GADAdSizeBanner的标准高度
            }
        }
        .onAppear {
            startGoogleMobileAdsSDK()
        }
    }
}

几个小提醒

  • 测试阶段可以用代码里的测试广告单元ID,上线前一定要替换成你在AdMob后台创建的正式横幅广告单元ID
  • 确保项目已经正确配置了UMP和Google Mobile Ads SDK的依赖,还有Info.plist里的相关权限配置
  • 横幅广告的尺寸可以按需调整,比如用GADAdSizeLargeBanner(更高的横幅),记得同步调整视图的frame高度

备注:内容来源于stack exchange,提问作者SoftGuru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:45:28