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

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

【问题讨论】:

    标签: 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()
    }
    

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

    【讨论】:

    【解决方案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()
        }
    }
    

    【讨论】:

    • 不错的补充!这样更好
    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多