search
LoginSignup
38
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

iOSアプリへのAdMob導入方法(Swift)

Xcode-12.4 Swift-5.3 iOS-14 Google-Mobile-Ads-SDK-8.1.0

20210324追記

現時点で広告が非表示になりました:innocent:
AdMob のサイトに3つほど通知がきてたのでこれ対応しないといけないのかなと思います(全然見てなかった。。。)。

  • 一部の iOS アプリでは GMA SDK の更新が必要です
  • iOS 14 に対応したアプリを準備しましょう
  • app-ads.txt を追加または更新する

再度表示できるようになったらまた更新したいと思います:bow:

20210327追記
iOS12だけ表示されるようになりました:raised_hands:
とりあえず app-ads.txt を追加して反映待ち。。。

20210417追記
広告表示されるようになりました:raised_hands:
特に何も対応してないので広告のストック数?の問題のようです。(app-ads.txt を追加したと思ってたけど URL 間違ってた:innocent:
広告がいつの間にか表示されなくなった場合(ポリシー違反とかなければ)時間が解決してくれるかも:thinking:

はじめに

個人開発アプリでよくみるバナー広告の表示とかどうやるのかな?ってのが前から気になってたので AdMob 導入してみました。
サクッといけるかと思ったのですがわりとつまずいたので備忘録として。今回はバナーとインタースティシャルの表示のみ記載します(他はちょっとわからない。。。)。

広告は他にもいろいろあるみたいだけど AdMob が主流みたいです(しらんけど)。

他にも下記とかがあるみたいです。

  • i-mobile Ad Network
  • Zucks Ad Network
  • nend
  • Ad Generation

AdMob 導入するために下記アプリをリリースしてみました。

ローカルネットワーク使ってちょっと離れた相手とじゃんけんするアプリです。
P2Pじゃんけ‪ん‬

導入方法

導入方法は下記を見ればいいんですがわりとつまづきました。
AdMobスタートガイド

導入手順は下記です。

  1. AdMob アカウントを作成する
  2. アプリを登録する
  3. CocoaPods で Xcode プロジェクトに SDK を導入する
  4. Info.plist にキーを追加する
  5. 広告表示を実装する

AdMobアカウントの作成

下記からとりあえずアカウントを作成します。
AdMob に申し込む

「お支払い」からお支払い情報を追加します(2、3日で承認されました。)。
(私はアプリをリリースしたときそもそもここの設定をしてませんでした。。。)

アプリを登録

AdMob のサイトで広告を表示するアプリを登録します。

左上のメニュー -> アプリ -> アプリを追加

必要な情報を入力してアプリを登録します。

登録したアプリを選択して左のメニューの「広告ユニット」から広告ユニットを作成します。
これはたぶん表示する広告の数だけ作成します。とりあえず「バナー」と「インタースティシャル」を追加しておきます。

SDK導入

CocoaPods を使って SDK を導入します。

  1. Podfile に下記を追加する

    pod 'Google-Mobile-Ads-SDK'
    
  2. 下記コマンドを実行する

    pod install --repo-update
    

Info.plistにキー追加

Info.plist に GADApplicationIdentifierSKAdNetworkIdentifier を下記のように追加します(追加していないとクラッシュします)。

<key>GADApplicationIdentifier</key>
<string>アプリID</string>
<key>SKAdNetworkItems</key>
  <array>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>cstr6suwn9.skadnetwork</string>
    </dict>
  </array>

GADApplicationIdentifier は AdMob のサイトで登録したアプリ情報から下記のように確認できます。

アプリ -> 左メニューの「アプリ設定」 -> アプリ ID

ここで少し面倒なのがこの GADApplicationIdentifier は本番用なので開発用アプリでは使用してはいけないようです。なので本番と開発で値を切り替える必要があります。

わたしは User-Defied を追加して切り替えるようにしました。
User-Defined については下記を参考にするといいかも。
[iOS] User-Definedを利用しDebugとReleaseで定義を分ける

下記のように Build Settings から追加できます。
defined

User-Defined に GADApplicationIdentifier を追加して Debugca-app-pub-3940256099942544~1458002511Release に AdMob のサイトで確認したアプリ ID を設定します。

Info.plist の GADApplicationIdentifier は下記のように設定します。

<key>GADApplicationIdentifier</key>
<string>$(GADApplicationIdentifier)</string>

広告表示を実装

アプリ起動時にまず初期化しておく必要があるようで AppDelegate に下記のように追記します。

import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // 初期化      
    GADMobileAds.sharedInstance().start(completionHandler: nil)
    return true
  }
}

広告ごとに ID が設定されておりこちらも本番と開発で ID を変える必要がある?(たぶん)
GADApplicationIdentifier 同様 User-Defined を追加しました。

広告の ID は AdMob のサイトで下記から確認できます。
アプリ -> 左メニューの「広告ユニット」 -> 広告ユニット ID

User-Defined で BANNER_ID を追加し Debugca-app-pub-3940256099942544/2934735716Release AdMob のサイトで確認した広告ユニット ID を設定します。
インタースティシャル用に INTERSTITIAL_ID も追加し Debugca-app-pub-3940256099942544/4411468910Release AdMob のサイトで確認した広告ユニット ID を設定します。

コードから取得できるように Info.plist に下記のように追加します。

<key>AdUnitIDs</key>
<dict>
    <key>banner</key>
    <string>$(BANNER_ID)</string>
    <key>interstitial</key>
    <string>$(INTERSTITIAL_ID)</string>
</dict>

バナー

バナー表示の手順は下記です。

  1. ストーリーボードで幅:320、高さ:50 に設定した View を置く
  2. Custom Class に GADBannerView を設定する
  3. ViewController に配置した View を紐付ける
  4. 下記のように実装する

    @IBOutlet private weak var bannerView: GADBannerView!
    
    if let id = adUnitID(key: "banner") {
        bannerView.adUnitID = id
        bannerView.rootViewController = self
        bannerView.load(GADRequest())
    }
    
    func adUnitID(key: String) -> String? {
        guard let adUnitIDs = Bundle.main.object(forInfoDictionaryKey: "AdUnitIDs") as? [String: String] else {
            return nil
        }
        return adUnitIDs[key]
    }
    

これでバナーが表示されます。

インタースティシャル

インタースティシャル表示の手順は下記です。(参考:インタースティシャル

  1. viewDidLoad などで下記のように初期化する

    private var interstitial: GADInterstitialAd?
    
    if let id = adUnitID(key: "interstitial") {
        GADInterstitialAd.load(withAdUnitID: id, request: GADRequest()) { [weak self] (ad, error) in
            if let error = error {
                print(error.localizedDescription)
            }
            self?.interstitial = ad
        }
    }
    
  2. 表示したいタイミングで下記を実行する

    interstitial?.present(fromRootViewController: self)
    

これでインタースティシャルが表示されます。

おわりに

とりあえず広告表示できるようになりました:clap:

実際にアプリで広告が表示されるようになるのは AdMob のサイトから「アプリ情報」の「App Store」の情報を追加してはじめて表示されるようになります。私の場合はリリースしてから10日ほどかかりました。

ここがネックな気がします:thinking:
リリース初日とかは広告が表示されずしばらくしたら広告が表示されるってユーザーとしては前まで広告出てなかったのに急に出るようなったやんけ!ってなってわりと不評な気がします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
38
Help us understand the problem. What are the problem?