🌍

【Flutter】本番環境と開発環境を分ける方法 〜 Admob広告IDの切り替え事例付き 〜

に公開

1. はじめに

1.1 この記事を書こうと思った理由

Flutterでアプリを開発していると、広告サービス(例:Admob)などで「本番用の広告ID」と「開発用の広告ID」を切り替える必要が出てきます。
私自身、Admob実装時にこの切り替えでつまずき、手動でIDを書き換える運用になってしまい「もっと良いやり方があるはず」と感じて本記事を書くことにしました。

1.2 本番環境と開発環境を分けるメリット

  • 事故防止(誤配信や本番広告の誤表示を防ぐ)
  • テストデータや本番データの混在防止
  • APIエンドポイントや外部サービス設定の切り替え
  • ビルドごとの挙動確認の自動化

2. Flutterアプリ開発における環境の分け方の基本

Flutterでは標準で「環境(本番・開発)」という概念はありませんが、
dart-defineや「flavor」と呼ばれるビルド構成を使うことで環境ごとに設定を分けることができます。
また、設定ファイルを分けたり、環境ごとの定数を切り替えることで柔軟に運用できます。

3. Admobで本番用広告IDと開発用広告IDを切り替えたい!

Admobの公式ドキュメントでも「開発用のテストIDを使うこと」が強く推奨されています。
本番リリース前にテストIDで動作確認を済ませ、
本番ビルドでは本番IDを使う必要があります。
しかし、Flutterのビルドごとに手動でIDを書き換えるのは危険&面倒です。

4. 実践:Flutterで環境ごとに設定を分ける方法

4.1 dart-defineを使った環境変数の導入

Flutterではコマンドラインビルド時に--dart-defineを使って定数を注入できます。

flutter run --dart-define=ADMOB_APP_ID=ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy

Dart側では以下のようにして取得します。

const String admobAppId = String.fromEnvironment('ADMOB_APP_ID');

本番・開発で異なる値を渡すことで、同じコードで異なるIDを使い分けられます。

4.2 flavorを使ったビルドの分離

より大規模なプロジェクトでは「flavor」でビルド構成を分離すると便利です。

  • 開発用ビルド:flutter run --flavor dev --dart-define=ADMOB_APP_ID=テストID
  • 本番用ビルド:flutter run --flavor prod --dart-define=ADMOB_APP_ID=本番ID

androidiosディレクトリの設定も分けることで、アイコンやアプリ名、パッケージ名も個別に設定できます。

4.3 設定ファイル(config.dartなど)による管理

シンプルな場合はconfig.dartのようなファイルを用意し、
dart-defineで注入した値をラップして管理するとよいです。

class AppConfig {
  static const String admobAppId = String.fromEnvironment('ADMOB_APP_ID', defaultValue: 'test-id');
}

使うときはAppConfig.admobAppIdで取得できます。

5. Admob広告IDの切り替え実装例

以下は、dart-defineを使ってAdmobのアプリID/バナーIDを切り替える実装例です。

class AdmobConfig {
  static const String appId = String.fromEnvironment('ADMOB_APP_ID', defaultValue: 'ca-app-pub-3940256099942544~3347511713'); // テストID
  static const String bannerId = String.fromEnvironment('ADMOB_BANNER_ID', defaultValue: 'ca-app-pub-3940256099942544/6300978111'); // テスト用バナーID
}

ビルド時に、

flutter build apk --dart-define=ADMOB_APP_ID=本番用ID --dart-define=ADMOB_BANNER_ID=本番用バナーID

のように指定すれば、本番ビルドでは本番IDが注入されます。

6. 注意点とハマりやすいポイント

  • dart-defineで渡した値は定数として扱われるため、ランタイムで切り替えはできません
  • ビルドごとに必ず異なる値を指定するようにしましょう
  • flavorを使う場合は、iOS/Androidそれぞれで設定ファイルやバンドルIDの分離が必要です
  • AdmobのテストIDを使わずに開発すると、広告配信が制限されるリスクがあります

7. まとめ

Flutterアプリで「本番環境」と「開発環境」を分けて管理することで、
Admob広告IDの切り替えも含めて安全かつスムーズな開発が可能になります。

  • 小規模ならdart-defineで十分
  • 大規模ならflavor運用も検討
  • 設定値はなるべくビルド時に注入し、手動書き換えは避けましょう

アプリの品質や運用効率を高めるためにも、環境ごとの切り替えをぜひ導入してみてください!

Discussion