🌱

【Flutter】swiftとkotlinの環境変数をネイティブで扱う

2024/02/19に公開

概要

GoogleMapのAPIやネイティブSDKの認証情報をネイティブで呼び出すにあたり、環境変数を別ファイルに切り出したかったので記事にまとめました

ゴール

  • AppDelegate.swiftとMainActivity.ktで用意した環境変数を呼び出せること

実装例

iOS

  1. ios/RunnerにEnv.swiftを作成
Env.swift
import Foundation

+ struct Env {
+     static let exampleKey = "xxxxxxxxxx"
+ }
  1. AppDelegate.swiftで呼び出し
AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

+     // Env.exampleKeyで呼び出し
+     Hoge(apiKey: Env.exampleKey)

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

  1. Git管理から除外
+ **/ios/Runner/Env.swift

Android

  1. android直下にenv.propertiesを作成
env.properties
+ example.key=xxxxxxxxxx
  1. app/build.gradleで環境変数を呼び出せるようにする
app/build.gradle
+ def envProperties = new Properties()
+ def envPropertiesFile = rootProject.file('env.properties')
+ if (envPropertiesFile.exists()) {
+     envPropertiesFile.withReader('UTF-8') { reader ->
+         envProperties.load(reader)
+     }
+ }

~~~

defaultConfig {
    ...
+     manifestPlaceholders = [
+         exampleKey: envProperties.getProperty('example.key'),
+     ]
}
  1. AndroidManifest.xmlでmetaDataの設定
AndroidManifest.xml
'<application
      ...
-    android:name="${applicationName}"

     ...
+    <meta-data android:name="com.google.android.geo.EXAMPLE_KEY"
+        android:value="${exampleKey}" />
  1. MainActivity.ktで呼び出し
MainActivity.kt
+ import android.content.pm.PackageManager
+ import android.util.Log

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {

+    private func hoge() {
+        val appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
+        val exampleKey = appInfo.metaData.getString("com.google.android.geo.EXAMPLE_KEY")
+        Log.v("MainActivity.kt", exampleKey)
+    }

}
  1. Git管理から除外
+ /android/env.properties

まとめ

これでネイティブで環境変数の用意と呼び出しができると思います。
秘匿化したい情報のため.gitignoreしていますが、それだけでは不十分なので難読化も必要です。
https://docs.flutter.dev/deployment/obfuscate

Discussion