Open6

Flutterプロジェクト準備

HajimeHajime

XCodeで開く(コマンドライン)

open ios/Runner.xcworkspace

Cocoapodsなどを使用している場合はRunner.xcodeprojではなくRunner.xcworkspaceを開く。

シミュレータの起動(コマンドライン)

open -a simulator
HajimeHajime

xcconfig

iosでは、Debug/Profile/Releaseの3つが用意されている。

Debug:開発時に使用。ホットリロードやDevToolsなどまざまな拡張サービスを使用できる。低速な動作で実行される。
Profile:開発ツールなど、最低限の拡張サービスが使用できる。ほぼReleaseビルドに近いパフォーマンスが得られる。
Release:本番リリース用ビルド。ツリーシェイキングなどの圧縮処理や本番アプリ用の最適化が行われる。

環境毎の設定値

Runner/Flutter/Debug.xcconfig[Release.xcconfig]に配置されている。
Runner/Flutter/Generated.xcconfigは共通で読み込まれる。

なおProfileビルドではReleaseビルドを使うように設定されている。(初期値)

環境毎の起動

flutter run -profile
flutter run –release
HajimeHajime

ビルド環境とは別に、バックエンドサーバーを切り分けたいとかしたい場合はFlavorという仕組みと組み合わせる。例えば下記のような組み合わせで実行したい場合など。

Debugビルドのdev環境
Debugビルドのstg環境
Debugビルドのprd環境
Profileビルドのdev環境
Profileビルドのstg環境
Profileビルドのprd環境
Releaseビルドのprd環境

https://pub.dev/packages/flutter_flavor

https://pub.dev/packages/flutter_flavorizr
が公式から提案されている。

Dartコードの中でFlavorを取得する方法は無い

ビルド環境やFlavorの設定をしても、それらはビルド時にどの設定を使うかを指定するだけで、Dartコードの中でFlavorを取得することができない。

回避策としては、エントリファイルを分けるしかない。

HajimeHajime

Flavor要らない?

1.17より起動時のパラメータで環境変数のようなものを渡せるようになっているらしい

このように指定すると

flutter run --dart-define=SOME_VAR=SOME_VALUE --dart-define=OTHER_VAR=OTHER_VALUE

このようにDart内で呼び出せる

class EnvironmentConfig {
  static const SOME_VAR = String.fromEnvironment('SOME_VAR');
  static const OTHER_VAR = String.fromEnvironment('OTHER_VAR');
}

確かに要らなくなりそう?

ネイティブへの渡し方がバージョンによって異なるらしい。Flutter2.20以降では、Base64エンコードされた状態でネイティブに渡される。

In Flutter 1.17 in your Gradle, you will get a String value like: DEFINEEXAMPLE_APP_NAME=awesomeApp1,DEFINEEXAMPLE_APP_SUFFIX=.dev
In Flutter 1.20 value will be like this: DEFINEEXAMPLE_APP_NAME%3Dawesome1,DEFINEEXAMPLE_APP_SUFFIX%3D.dev
And in Flutter 2.2 each variable will be encoded with base64: REVGSU5FRVhBTVBMRV9BUFBfTkFNRT1hd2Vzb21lMg==,REVGSU5FRVhBTVBMRV9BUFBfU1VGRklYPS5kZXY=

https://itnext.io/flutter-1-17-no-more-flavors-no-more-ios-schemas-command-argument-that-solves-everything-8b145ed4285d

DartDefines for Android

android/app/build.gradleにデフォルト値と、渡されたDartDefinesをデコードしするコードを挿入しておく。
https://github.com/TatsuUkraine/flutter_define_example/blob/master/android/app/build.gradle#L23-L34

DartDefines for iOS

Defineexample-defaults.xcconfigを作成し、デフォルト値として扱う。
XcodeでSchemaを編集し、Pre-Actionを作成。デコードした内容がDefineexample.xcconfigに出力されるようにする。(ビルド時に実行される)これをDebuとReleaseのxcconfigで読み込むように設定する。
見づらいけどコードの場所はここ
https://github.com/TatsuUkraine/flutter_define_example/blob/8141da9aedf1ca8d19ca63aa4980dba2d0c15d21/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme#L11-L23

HajimeHajime

vscodeのlaunch.jsonはこのように設定

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "request": "launch",
            "type": "dart",
            "args": [
                "--dart-define=DEFINE_APP_NAME=FlutterDemoApp:debug",
                "--dart-define=DEFINE_APP_SUFFIX=.debug"
            ]
        },
        {
            "name": "Profile",
            "request": "launch",
            "type": "dart",
            "flutterMode": "profile",
            "args": [
                "--dart-define=DEFINE_APP_NAME=FlutterDemoApp",
                "--dart-define=DEFINE_APP_SUFFIX="
            ]
        }
    ]
}

出来た!

HajimeHajime

Androidのアプリ名に反映

android/app/src/main/AndroidManifest.xml

android:label="@string/app_name"