Swift4.0 + AdMob(バナー&インタースティシャル)実装サンプルコード公開

Swift4.0とAdMobを用いたバナー広告、インステ広告の表示実装を行う際、だいたい毎回同じコードを書くことになると思うのでテンプレート化しました。
「自分で考えた!」と言い張らなければ自由に使ってもらって構いませんので、是非ご活用ください。

サンプルコード

AdmobManager.swift


//
//  AdmobManager.swift
//
//  Created by Yusuke Nakajima on 2019/07/04.
//  Copyright © 2019 Yusuke Nakajima. All rights reserved.
//

import UIKit
import Firebase
import GoogleMobileAds

class AdmobManager: UIViewController, GADBannerViewDelegate, GADInterstitialDelegate {
    
    static let shared  = AdmobManager()
    
    // バナー広告ユニットID
    let BANNER_ID = "ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx"
    // テスト用バナー広告ユニットID
    let TEST_BANNER_ID = "ca-app-pub-3940256099942544/2934735716"
    
    // インステ広告ユニットID
    let INTERSTITIAL_ID = "ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx"
    // テスト用インステ広告ユニットID
    let TEST_INTERSTITIAL_ID = "ca-app-pub-3940256099942544/4411468910"
    
    
    var bannerView: GADBannerView!
    var interstitial: GADInterstitial!
    
    // インステ広告の表示頻度
    let interstitialFreq = 8
    var interstitialCount = 0
    
    let userDefaults = UserDefaults.standard

    
    // バナー広告を表示(引数は表示するViewController)
    public func showBanner(_ viewController: UIViewController) {
        bannerView = GADBannerView(adSize: kGADAdSizeBanner)
        bannerView.adUnitID = bannerID
        bannerView.rootViewController = viewController
        bannerView.delegate = self
        bannerView.load(GADRequest())
        addBannerViewToView(bannerView, viewController)
    }
    
    // バナー広告を追加
    func addBannerViewToView(_ bannerView: GADBannerView, _ viewController: UIViewController) {
        bannerView.translatesAutoresizingMaskIntoConstraints = false
        viewController.view.addSubview(bannerView)
        viewController.view.addConstraints(
            [NSLayoutConstraint(item: bannerView,
                                attribute: .bottom,
                                relatedBy: .equal,
                                toItem: viewController.view.safeAreaLayoutGuide,
                                attribute: .bottom,
                                multiplier: 1,
                                constant: 0),
             NSLayoutConstraint(item: bannerView,
                                attribute: .centerX,
                                relatedBy: .equal,
                                toItem: viewController.view,
                                attribute: .centerX,
                                multiplier: 1,
                                constant: 0)
            ])
    }

    
    // インステ広告のロード
    func createAndLoadInterstitial() {
        if let count = userDefaults.object(forKey: "INTERSTITIAL_COUNT") {
            interstitialCount = count as! Int
        }
        interstitial = GADInterstitial(adUnitID: INTERSTITIAL_ID)  // テストの場合はTEST_INTERSTITIAL_IDを指定
        interstitial.delegate = self
        interstitial.load(GADRequest())
    }
 
    // インステ広告の表示
    func showInterstitial(_ sender: UIViewController, count: Int = 0) {
        interstitialCount += 1
        userDefaults.set(interstitialCount, forKey: "INTERSTITIAL_COUNT")
        userDefaults.synchronize()
        
        // 指定した表示頻度に満たなければ何もしない
        if interstitialCount <= interstitialFreq {
            return
        }
        
        // 指定した表示頻度に満たした場合、準備ができていたら表示
        if interstitial.isReady {
            interstitialCount = 0
            interstitial.present(fromRootViewController: sender)  // 表示
            userDefaults.set(interstitialCount, forKey: "INTERSTITIAL_COUNT")
            userDefaults.synchronize()
        }
        // 準備ができていない場合は0.1秒間隔で10回まで表示を試みる
        else if count < 10 {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
                self.showInterstitial(sender, count: count + 1)
            }
        }
        // 表示できない場合
        else {
            // 表示できない場合の処理
        }
    }
    
    // インステ広告を表示し終わったら次の表示のためにロード
    func interstitialDidDismissScreen(_ ad: GADInterstitial) {
        createAndLoadInterstitial()
    }
    
}

呼び出す側の処理
SampleViewController.swift


class SampleViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // バナー広告表示
        AdmobManager.shared.showBanner(self)

        // インステ広告ロード
        AdmobManager.shared.createAndLoadInterstitial()
    }

    // 閉じるボタンを押した際にインステ広告表示を試みる場合の例
    @IBAction func closeButton(_ sender: Any) {

        // インステ広告表示チェック
        AdmobManager.shared.showInterstitial(self)
    }
}

バナー広告は基本的には、最初に表示する画面のViewControllerのviewDidLoad()内で呼び出すと思います。
呼び出す部分に

AdmobManager.shared.showBanner(self)

を記述するだけで表示されます。

また、インタースティシャル広告も呼び出す部分に

AdmobManager.shared.showInterstitial(self)

を記述すれば良いのですが、事前に

AdmobManager.shared.createAndLoadInterstitial()

を実行してインタースティシャル広告をロードしておく必要があります。

また、呼び出す側のクラスではUIViewControllerを継承している必要がありますのでご注意ください。

コメント