Google AdMob integration in SwiftUI

后端 未结 3 1631
春和景丽
春和景丽 2021-01-01 02:56

I found nowhere an example how to integrate it with swiftui. Does anybody found a tutorial? The problem is the part with the root controller.

相关标签:
3条回答
  • 2021-01-01 03:16

    You should use UIViewRepresentable instead of UIViewControllerRepresentable.

    I implemented the Adaptive banner with this code:

    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>) {
        }
    }
    

    Then you can call on your Stack using

    AdView().frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 300)
                    .frame(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)
    
    0 讨论(0)
  • To improve on Mcatach and avoid adding the view to the app's root view controller:

    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
    }
    

    }

    The layout code:

        private func adSection() -> some View {
        HStack {
            let size = GADBannerViewController.getAdBannerSize()
            Spacer()
            GADBannerViewController()
                .frame(width: size.size.width, height: size.size.height)
            Spacer()
        }
    }
    
    0 讨论(0)
  • 2021-01-01 03:20

    in the Apple SwiftUI tutorial - integration in SwiftUI

    you can find that how to solve this question with UIViewControllerRepresentable

    and I create an example like this

    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) {}
    }
    

    then you can using GADBannerViewController in your SwiftUI view's body like that

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

    if you have any questions, please let me know.

    0 讨论(0)
提交回复
热议问题