Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to have Admob ads in multiple Viewcontrollers - Swift, Xcode?

I am new to making apps. I am currently working on an app and I put a banner ad on the first view controller and it works. I can't find a way to add the ad to the rest of the view controllers. If someone can show me how that would be great!

like image 757
Francois Groenewald Avatar asked Oct 19 '25 20:10

Francois Groenewald


1 Answers

Check out this code, if you need I can post with interstitial support too:

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

Idea is to share one GADBannerView object across the app - so you don't spam Admob with every banner instantiation at each UIViewController

Usage

In each UIViewController you want the banner to be visible:

  1. Conform to AdSimpleBannerPowered protocol
  2. Add placeholder view at Storyboard or via code
  3. Add Ads.rootViewController = self at viewWillAppear() method – that will instantiate and add the banner to placeholder.
class MyViewController: UIViewController, AdSimpleBannerPowered {
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        Ads.rootViewController = self
    }

}
like image 193
serg_zhd Avatar answered Oct 21 '25 09:10

serg_zhd