【Flutter】AdMob広告のアプリID,ユニットIDをdebug/releaseビルドで切り替える



ちょっと想像してみてください。

Flutterで作ったアプリで儲けたい！そう考え、AdMob広告をつけることにしたあなた。
開発中エミュレータを使用するため、AdMob広告のIDはテスト用のものを設定します。

アプリを頑張って作って、審査も通って、よし、リリースだ！
そんな時ふと気づきます。
「あれ、AdMob広告のID,本番用にしたっけ。。。？」

こんな経験、ありませんか？(私はあります。)

IDを変えるのを忘れなければ済む話ではあるんですが、
リリースにあたっての作業はかなり多く、IDを変える、のような細かいタスクは忘れやすいです。
また、IDを変える作業は結構手間でミスも発生しやすいです。
なので、この作業、自動でできるように検討しました。

本記事では、AdMob広告のアプリID,ユニットIDをdebug/releaseビルドで切り替える方法について解説します。
具体的には以下を解説します。

- アプリID の切り替え
    - iOSの場合
    - Androidの場合
- ユニットIDの切り替え

設定はちょっと手間ですが、一度やってしまえば、自分で変える必要がなくなるため、かなり快適になります。
ぜひ読んで、設定してみてください。

環境は以下の通りです。

- Flutter version 2.8.1 
- Dart version 2.15.1
- Android Studio (version 2020.3)
- Xcode 13.2

##アプリIDの切り替え##
アプリIDは``Info.plist``だったり、``AndroidManifest.xml``だったりのネイティブの部分の設定となります。
iOS、Androidそれぞれの場合について解説します。

###iOSの場合###

``Info.plist``にアプリIDを設定する際、
debug/releaseでアプリIDが切り替わるよう、BuildSettingsで設定を追加します。

プロジェクトのiOSフォルダの上で右クリック
→ Flutter
→ Open iOS module in Xcode

でXcodeを開きます。

以下の手順を行い、設定を追加します。
1. Runnerを選択
2. TARGETSのRunnerを選択
3. BuildSettingsを選択
4. "+"を選択
5. Add User-Defined Settingを選択

![スクリーンショット 2021-12-20 18.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1694109/34f15231-6d12-360b-d90f-cf70910bf019.png)

設定名を``ADMOB_ID``、
``debug``にテスト用のアプリIDを、``release``に本番用のアプリIDを設定します。

![スクリーンショット 2021-12-20 18.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1694109/7a047716-dbdb-a63c-2c26-8fdc560bbde4.png)

Android Studioに戻り、``iOS/Runner/Info.plist``を開きます。
``Info.plist``に以下のコードを追加します。

```
<key>GADApplicationIdentifier</key>
    <string>${ADMOB_ID}</string>
```

iOSの設定は以上になります。

:::note warn
今回の設定だと、iOS/Runner.xcodeproj/project.pbxprojファイルに、
設定したアプリIDが記述されます。
GitHubにpublicで上げる場合は、このファイルを.gitignore指定するなど、対応を検討してください。
(アプリIDを公開していいかどうかは要検討です)
:::

###Androidの場合###

``AndroidManifest.xml``にアプリIDを設定する際、
debug/releaseでアプリIDが切り替わるよう、``app``の``build.gradle``で設定を追加します。

まず準備です。
``android/app``に``gradle.properties``というファイルを作成します。
``admobAppIdDebug``にテスト用の広告IDを、
``admobAppIdRelease``に本番用の広告IDを記載するようにし、
以下のように``gradle.properties``に記載します。

```
admobAppIdDebug=ca-app-pub-3940256099942544~3347511713
admobAppIdRelease=ca-app-pub-****************~##########
```
次に``android/app``の``build.gradle``に上で用意したpropertyを読み込む関数を定義します。

```gradle
def loadProperties(filename) {
    def props = new Properties()
    file(filename).withInputStream {
        props.load(it)
    }
    return props
}
```

そのまま``android/app``の``build.gradle``に以下のようにコードを追加します。
``buildTypes``に``debug``がない場合は、追加してください。

```gradle
android {

//省略

    buildTypes {
        debug {
            def props = loadProperties("$rootDir/app/gradle.properties")
            manifestPlaceholders = [admob_app_id: props.admobAppIdDebug]
        }

        release {

　　　　　　　　　　　　　　　　　　　　　　　　　//省略

            def props = loadProperties("$rootDir/app/gradle.properties")
            manifestPlaceholders = [admob_app_id: props.admobAppIdRelease]
        }
    }
}

```

最後に、``AndroidManifest.xml``に以下の文を設定します。

```xml
       <meta-data
           android:name="com.google.android.gms.ads.APPLICATION_ID"
           android:value="${admob_app_id}"/>
```

以上でアプリIDの設定は完了となります。

:::note warn
必要に応じて、難読化の処理や、``gradle.properties``の``.gitignore``追加を行なってください。
:::

##ユニットIDの切り替え##
ユニットIDの切り替えはDartファイル上で行います。
``ad_helper.dart``というファイルを作り、
このファイルでユニットIDを管理するようにします。

``ad_helper.dart``はこちら

```dart
import 'dart:io';

class AdHelper {

  static String get bannerAdUnitId {
    bool isDebug = false;
    //Debugモードの時のみ以下が実行される
    assert(isDebug = true);

    if (isDebug) {
      if (Platform.isAndroid) {
        return "ca-app-pub-3940256099942544/6300978111";
      } else if (Platform.isIOS) {
        return "ca-app-pub-3940256099942544/2934735716";
      } else {
        throw UnsupportedError("Unsupported platform");
      }
    } else {
      if (Platform.isAndroid) {
        return "ca-app-pub-****************/##########";
      } else if (Platform.isIOS) {
        return "ca-app-pub-****************/##########";
      } else {
        throw UnsupportedError("Unsupported platform");
      }
    }
  }
}

```

``assert()``がdebug時のみ実行されることを利用して、
``isDebug``がdebug時に``true``になるようにしているのがポイントです。

使い方は、広告IDを必要とするところで、

```dart
AdHelper.bannerAdUnitId,
```
とするだけです。

今回はバナー広告用の設定のみですが、
他の広告ユニットでもゲッター関数を追加することで対応可能です。
ぜひやってみてください。

:::note warn
繰り返しになりますが、必要に応じて``ad_helper.dart``の``.gitignore``追加を行なってください。
:::

##まとめ##

本記事では、AdMob広告のアプリID,ユニットIDをdebug/releaseビルドで切り替える方法について解説しました。
具体的には以下を解説しました。

- アプリID の切り替え
    - iOSの場合
    - Androidの場合
- ユニットIDの切り替え

一度この設定をしておけばもうリリース時に本番用広告IDに変えるのを覚えておく必要はありません。
広告ID変更の手間もおさらばできます。
ポカよけにもなりますので、AdMob設定の際にはぜひ導入を検討してみてください。


##参考##

https://developers.google.com/admob/flutter/quick-start#ios

https://qiita.com/ko2ic/items/9035e944c3cdeadfae96

https://blog.integrityworks.co.jp/2020/02/17/kotlin-applicationi-d-key-no-version-management-system/

https://maku77.github.io/gradle/property-file.html

https://star-zero.medium.com/flutter%E3%81%A7debug%E5%AE%9F%E8%A1%8C%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B-769d92fa682c