ios - 如何在多个 View Controller 中放置 Admob 广告 - Swift、Xcode?

标签 ios swift xcode admob

我是制作应用程序的新手。我目前正在开发一个应用程序,我在第一个 View Controller 上放了一个横幅广告,它可以工作。我找不到将广告添加到其余 View Controller 的方法。如果有人可以向我展示那将是多么棒!

最佳答案

查看此代码,如果您需要,我也可以使用插页式支持发布:

import Foundation
import UIKit
import GoogleMobileAds

protocol AdSimpleBannerPowered: UIViewController {
    var placeholder: UIView? { get }
    func addBannerToAdsPlaceholder(_ banner: UIView)
}

extension AdSimpleBannerPowered {
    func addBannerToAdsPlaceholder(_ banner: UIView) {
        placeholder?.addSubview(banner)
    }
}

private struct AdsConstants {
    static let admobAppID = "YOUR_APP_ID"
    static let adBottomBannerUnitID = "YOUR_BANNER_ID"
}

final class AdsManager : NSObject {
        
    var loadedSimpleBannerAd = false
    
    private var bannerView: GADBannerView?
    var rootViewController: UIViewController? {
        didSet {
            setupSimpleBannerAdsIfPossible()
        }
    }

    public override init() {
        super.init()
        
        GADMobileAds.sharedInstance().start()
        
        configureSimpleBanner()
    }
    
    private func configureSimpleBanner() {
        bannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        bannerView?.delegate = self
        bannerView?.adUnitID = AdsConstants.adBottomBannerUnitID
    }
    
    private func setupSimpleBannerAdsIfPossible() {
        assert(self.bannerView != nil, "WTF: simple banner has not been configured (call Ads.configure() before any usage)!")
        if let root = rootViewController as? AdSimpleBannerPowered {
            if let banner = self.bannerView {
                banner.rootViewController = root
                if !loadedSimpleBannerAd {
                    banner.load(GADRequest())
                } else {
                    root.addBannerToAdsPlaceholder(banner)
                }
            }
        }
    }
    
}

// Simple Bottom Admob Banner delegate methods
extension AdsManager: GADBannerViewDelegate {
    
    func adViewDidReceiveAd(_ bannerView: GADBannerView) {
        print("adViewDidReceiveAd")
        loadedSimpleBannerAd = true
        if let root = rootViewController as? AdSimpleBannerPowered {
            root.addBannerToAdsPlaceholder(bannerView)
        }
    }
    
    func adView(_ bannerView: GADBannerView,
                didFailToReceiveAdWithError error: GADRequestError) {
        print("adView:didFailToReceiveAdWithError: \(error.localizedDescription)")
    }
    
}
想法是分享一个GADBannerView跨应用程序的对象 - 这样您就不会在每个 UIViewController 的每个横幅实例中向 Admob 发送垃圾邮件
用法
在每个 UIViewController您希望横幅可见:
  • 符合 AdSimpleBannerPowered 协议(protocol)
  • 添加 占位符 在 Storyboard 或通过代码查看
  • 添加 Ads.rootViewController = selfviewWillAppear()方法——这将实例化并将横幅添加到占位符。
  • class MyViewController: UIViewController, AdSimpleBannerPowered {
        
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            
            Ads.rootViewController = self
        }
    
    }
    

    关于ios - 如何在多个 View Controller 中放置 Admob 广告 - Swift、Xcode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933279/

    相关文章:

    ios - Xcode 没有嵌入框架部分

    ios - 如何在 Swift 3 中设置 UIButton 的图像?

    ios - [iOS]如何像Facebook Paper一样覆盖状态栏?

    unit-testing - 如何在 Xcode 中组织库项目的单元测试?

    ios - 尝试获取用户位置时出错(快速)

    ios - CFBundleShortVersionString 不匹配

    ios - 使用闭包作为函数参数时,Swift 不带逗号的单独参数

    ios - 调用了错误的通用重载函数

    swift - performSegue(withSender : sender:) does not work - no errors displayed

    ios - 在通过 WiFi 连接的两个或多个设备之间通话 - iOS