SwiftUI 中的 Google AdMob 集成

Posted

技术标签:

【中文标题】SwiftUI 中的 Google AdMob 集成【英文标题】:Google AdMob integration in SwiftUI 【发布时间】:2019-08-24 21:14:52 【问题描述】:

我没有找到如何将其与 swiftui 集成的示例。有人找到教程吗? 问题在于根控制器的部分。

【问题讨论】:

【参考方案1】:

在 Apple SwiftUI 教程中 - integration in SwiftUI

你可以通过UIViewControllerRepresentable找到如何解决这个问题

我创建了一个这样的示例

import GoogleMobileAds
import SwiftUI
import UIKit

struct GADBannerViewController: UIViewControllerRepresentable 
    func makeUIViewController(context: Context) -> UIViewController 
        let view = GADBannerView(adSize: kGADAdSizeBanner)
        let viewController = UIViewController()
        view.adUnitID = "your ad unit id in there."
        view.rootViewController = viewController
        viewController.view.addSubview(view)
        viewController.view.frame = CGRect(origin: .zero, size: kGADAdSizeBanner.size)
        view.load(GADRequest())
        return viewController
    

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) 

那么您可以像这样在 SwiftUI 视图的主体中使用 GADBannerViewController

HStack 
    Spacer()
    GADBannerViewController()
        .frame(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)
    Spacer()

如果您有任何问题,请告诉我。?

【讨论】:

非常感谢! SwiftUI 和 AdMob 广告的绝妙技巧。 你觉得我的实现怎么样? ***.com/questions/60200602/… 如何使用智能横幅尺寸?【参考方案2】:

您应该使用UIViewRepresentable 而不是UIViewControllerRepresentable

我使用以下代码实现了自适应横幅:

struct AdView : UIViewRepresentable 
    @State private var banner: GADBannerView = GADBannerView(adSize: kGADAdSizeBanner)
    
    func makeUIView(context: UIViewRepresentableContext<AdView>) -> GADBannerView 
        #if DEBUG
        banner.adUnitID = "ca-app-pub-debug"
        #else
        banner.adUnitID = "ca-app-pub-prod"
        #endif

        guard let rootViewController = UIApplication.shared.windows.first?.rootViewController else 
            return banner
        
        
        banner.rootViewController = rootViewController
        
        let frame =  () -> CGRect in
            return banner.rootViewController!.view.frame.inset(by: banner.rootViewController!.view.safeAreaInsets)
        ()
        let viewWidth = frame.size.width

        banner.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)

        banner.load(GADRequest())
        return banner
    
    
    func updateUIView(_ uiView: GADBannerView, context: UIViewRepresentableContext<AdView>) 
    

然后你可以调用你的堆栈使用

AdView().frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 300)
                .frame(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)

【讨论】:

究竟为什么比 UIViewControllerRepresentable 更好? 因为您想向视图控制器添加视图,而不是视图控制器。 我尝试了您的解决方案,但横幅放错了位置 - 不仅覆盖了状态栏,而且还高了一点。 工作得很好!非常感谢? 这就是我实施横幅广告的方式,但我发现我有成千上万的请求。例如,在 AdMob 上,我看到 6.35K 请求仅获得 153 次展示,因为它不断调用 updateUIView。可以吗?【参考方案3】:

要改进 Mcatach 并避免将视图添加到应用的根视图控制器:

struct GADBannerViewController: UIViewControllerRepresentable 

@State private var banner: GADBannerView = GADBannerView(adSize: kGADAdSizeBanner)

func makeUIViewController(context: Context) -> UIViewController 
    let bannerSize = GADBannerViewController.getAdBannerSize()
    let viewController = UIViewController()
    banner.adSize = bannerSize
    banner.adUnitID = "ca-pub-ad-id-12345678"
    banner.rootViewController = viewController
    viewController.view.addSubview(banner)
    viewController.view.frame = CGRect(origin: .zero, size: bannerSize.size)
    banner.load(Ads.createRequest())
    return viewController


func updateUIViewController(_ uiViewController: UIViewController, context: Context)
    let bannerSize = GADBannerViewController.getAdBannerSize()
    banner.frame = CGRect(origin: .zero, size: bannerSize.size)
    banner.load(Ads.createRequest())


static func getAdBannerSize() -> GADAdSize 
    if let rootView = UIApplication.shared.windows.first?.rootViewController?.view 
        let frame = rootView.frame.inset(by: rootView.safeAreaInsets)
        return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.width)
    
    //No root VC, use 320x50 ad banner
    return kGADAdSizeBanner

布局代码:

    private func adSection() -> some View 
    HStack 
        let size = GADBannerViewController.getAdBannerSize()
        Spacer()
        GADBannerViewController()
            .frame(width: size.size.width, height: size.size.height)
        Spacer()
    

【讨论】:

不错的补充!这样更好

以上是关于SwiftUI 中的 Google AdMob 集成的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的 Google AdMob 集成

Google Admob 横幅广告在 swiftui 中不起作用

Unity 中的 Google Admob 崩溃修复?

我在 AdMob 控制台中的应用不再与 Google Play 关联?

配置中的google adMob的phonegap构建错误

AdMob/Firebase 使用 cocoapods 与 SwiftUI 集成:发现意外的 Mach-O 标头代码:0x72613c21