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
相关产品推荐
相关产品推荐

