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を継承している必要がありますのでご注意ください。
コメント