🌱
【Flutter】swiftとkotlinの環境変数をネイティブで扱う
概要
GoogleMapのAPIやネイティブSDKの認証情報をネイティブで呼び出すにあたり、環境変数を別ファイルに切り出したかったので記事にまとめました
ゴール
- AppDelegate.swiftとMainActivity.ktで用意した環境変数を呼び出せること
実装例
iOS
-
ios/Runner
にEnv.swiftを作成
Env.swift
import Foundation
+ struct Env {
+ static let exampleKey = "xxxxxxxxxx"
+ }
- 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)
}
}
- Git管理から除外
+ **/ios/Runner/Env.swift
Android
-
android
直下にenv.propertiesを作成
env.properties
+ example.key=xxxxxxxxxx
- 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'),
+ ]
}
- AndroidManifest.xmlでmetaDataの設定
AndroidManifest.xml
'<application
...
- android:name="${applicationName}"
...
+ <meta-data android:name="com.google.android.geo.EXAMPLE_KEY"
+ android:value="${exampleKey}" />
- 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)
+ }
}
- Git管理から除外
+ /android/env.properties
まとめ
これでネイティブで環境変数の用意と呼び出しができると思います。
秘匿化したい情報のため.gitignore
していますが、それだけでは不十分なので難読化も必要です。
Discussion