iOSアプリへのAdMob導入方法（Swift）

![Xcode-12.4](https://img.shields.io/badge/Xcode-12.4-brightgreen) ![Swift-5.3](https://img.shields.io/badge/Swift-5.3-brightgreen) ![iOS-14](https://img.shields.io/badge/iOS-14-brightgreen) ![Google-Mobile-Ads-SDK-8.1.0](https://img.shields.io/badge/GoogleMobileAdsSDK-8.1.0-brightgreen)

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

* 一部の 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 導入するために下記アプリをリリースしてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">５回のリジェクトの末やっとアプリの審査通った🙌<br><br>Multipeer Connectivity使ったじゃんけんアプリです！<br>ソーシャルディスタンスを保ってじゃんけんができます✊<br>AdMob試したくてリリースしたのに表示されてない🤣<br><br>アプリはこちら<a href="https://t.co/oLm3svHQ85">https://t.co/oLm3svHQ85</a> <a href="https://t.co/rQdrZ95lMC">pic.twitter.com/rQdrZ95lMC</a></p>&mdash; am10 (@am103141592) <a href="https://twitter.com/am103141592/status/1366605401370730499?ref_src=twsrc%5Etfw">March 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ローカルネットワーク使ってちょっと離れた相手とじゃんけんするアプリです。
[P2Pじゃんけ‪ん‬](https://apps.apple.com/jp/app/id1555103689)

## 導入方法
導入方法は下記を見ればいいんですがわりとつまづきました。 
[AdMobスタートガイド](https://developers.google.cn/admob/ios/quick-start?hl=ja)

導入手順は下記です。

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

### AdMobアカウントの作成
下記からとりあえずアカウントを作成します。 
[AdMob に申し込む](https://support.google.com/admob/answer/7356219?hl=ja&visit_id=637511357698277783-4004852503&rd=1)

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

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

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

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

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

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

1. Podfile に下記を追加する  

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

    ```
    pod install --repo-update
    ```

### Info.plistにキー追加
Info.plist に `GADApplicationIdentifier` と `SKAdNetworkIdentifier` を下記のように追加します（追加していないとクラッシュします）。

```xml
<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で定義を分ける](https://dev.classmethod.jp/articles/ios-user-defined/)

下記のように Build Settings から追加できます。 
<img width="200" alt="defined" src="https://user-images.githubusercontent.com/34936885/110927802-6db03000-8369-11eb-8b15-ec1c06e31f5e.png">

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

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

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

### 広告表示を実装
アプリ起動時にまず初期化しておく必要があるようで `AppDelegate` に下記のように追記します。

```swift
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` を追加し `Debug` に `ca-app-pub-3940256099942544/2934735716` を `Release` AdMob のサイトで確認した広告ユニット ID を設定します。
インタースティシャル用に `INTERSTITIAL_ID` も追加し `Debug` に `ca-app-pub-3940256099942544/4411468910` を `Release` AdMob のサイトで確認した広告ユニット ID を設定します。

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

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

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

1. ストーリーボードで幅：320、高さ：50 に設定した View を置く
1. Custom Class に `GADBannerView` を設定する
1. ViewController に配置した View を紐付ける
1. 下記のように実装する
    
    ```swift
    @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]
    }
    ```

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

### インタースティシャル
インタースティシャル表示の手順は下記です。（参考：[インタースティシャル](https://developers.google.cn/admob/ios/migration?hl=ja#v8)）

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

    ```swift
    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
        }
    }
    ```

1. 表示したいタイミングで下記を実行する
    
    ```swift
    interstitial?.present(fromRootViewController: self)
    ```

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

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

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

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