SwiftUI中的Google AdMob集成

时间:2019-08-24 21:14:52

标签: swiftui

我在哪里都找不到如何将其与swiftui集成的示例。有人找到教程了吗? 问题出在根控制器上。

3 个答案:

答案 0 :(得分:10)

在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()
}

如有任何疑问,请告诉我。?

答案 1 :(得分:3)

您应该使用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)

答案 2 :(得分:0)

要改善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()
    }
}