Debug/Releaseのビルドで環境に対応したAPIのURL等を用意したい。
- Android・iOS、それぞれの環境でビルド時の設定値を用意する
- expect/actualで参照する
1. Androidでビルド時の設定値を用意
gradleでdebug/release環境それぞれのAPIのベースとなるURLを用意します。
こうすることでSync now
するとyour-app/BuildConfig.java
が作成され、BuildConfig.API_BASE_URL
とすると設定値を読み出すことができます。
build.gradle.kts
buildTypes {
getByName("debug") {
buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:4001\"")
}
getByName("release") {
isMinifyEnabled = false
buildConfigField("String", "API_BASE_URL", "\"https://example.com\"")
}
}
2. iOSでビルド時の設定値を用意
デフォルトでInfo.plistファイルがあるのですがこれをDebug用とRelease用に分けます。
iosApp/iosApp/Info-Debug.plist
version="1.0">
....
API_BASE_URL
http://localhost:4001
iosApp/iosApp/Info-Release.plist
version="1.0">
....
API_BASE_URL
https://example.com
xcodeでプロジェクトを開き、Debug/Releaseビルド時に上記で指定したファイルを参照するように設定
- 左側の階層からiosAppをクリック
- Build Settings > TARGETS > iosApp > Packaging > Info.plist File
- 以下に変更
3. expect/actualを実装
kotlin/your-app/common/Config.kt
expect object Config {
val apiBaseUrl: String
}
kotlin/your-app/common/Config.android.kt
import jp.d_publishing.directbooks.BuildConfig
actual object Config {
actual val apiBaseUrl: String
get() = BuildConfig.API_BASE_URL
}
kotlin/your-app/common/Config.ios.kt
import platform.Foundation.NSBundle
actual object Config {
actual val apiBaseUrl: String
get() =
NSBundle.mainBundle
.infoDictionary
?.get("API_BASE_URL") as? String
?: error("API_BASE_URL not found in Info.plist")
}
スマホアプリ開発初心者の私にとって「環境ファイル的なものを一つ用意するだけでどのプラットフォームでもいい感じに動くものでしょ」と思っていましたがそんなことはなかったです。もし知っている方がいらっしゃればコメントをお願いします。同じような感覚のスマホアプリ開発初心者にとってこの記事の内容が参考になれば幸いです。
Views: 2