🎄

AndroidManifest.xml、AppDelegate.swiftからenvにアクセス

2021/12/18に公開

Flutter Advent Calendar3 2021 18日目の記事です。

こんにちは、@taitai9847です。

今月頭に参加したハッカソンで、Google Map APIを使用する機会があり、ググった時にこれだ!という記事がなかったため今回このタイトルで執筆します。(記事サーチ不足だったらすみません)

今回、使用したplugin

今回、用いたpluginはflutter_configになります。

flutter_configとは

Plugin that exposes environment variables to your Dart code in Flutter as well as to your native code in iOS and Android.
Inspired by react-native-config

(pub.devからの抜粋)
(意訳)環境変数をFlutterのDartコードだけではなく、iOSやAndroidのネイティブにも公開するプラグインである

環境変数を扱うpluginだと、自分は真っ先にflutter_dotenvを思いつくのですが、native側で簡単に呼び出すことは現状できなそうです。そのため、選択肢のうちの一つとして、flutter_configが挙がってくることになりそうです。

注意): このモジュールは、パッケージングのために機密情報を難読化したり暗号化したりしないので、機密鍵を .env に保存しないように注意してください

基本的な使い方

Readmeからの抜粋になります。
exampleになるので各々で自信の場合に置き換えてください。

1.Flutterアプリケーションのルート位置に新しく.envを作成

.env
API_KEY=okazunogohann ///example

2.main.dartで全ての環境変数を読み込む

main.dart
import 'package:flutter_config/flutter_config.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // Required by FlutterConfig
  await FlutterConfig.loadEnvVariables();

  runApp(MyApp());
}

これでアプリのいかなるところからでも環境変数を呼ぶことができます。

3.アプリでの呼び出し

3.1 Flutterアプリ内

example.dart
import 'package:flutter_config/flutter_config.dart';

FlutterConfig.get('API_KEY') // returns 'okazunogohann'

3.2 iOS側での呼び出し

参考例としてGoogleMapAPI

ios/Runner/AppDelegate.swift
import UIKit
import Flutter
import flutter_config  //import忘れずに
import GoogleMaps

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GMSServices.provideAPIKey(FlutterConfigPlugin.env(for: "API_KEY"))  //API_KEY 呼び出し
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

3.3 Android側での呼び出し

3.3.1 pluginの適用

android/app/build.gradleでpluginを適用してあげる

build.gradle
~~省略~~

apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply from: project(':flutter_config').projectDir.getPath() + "/dotenv.gradle"  // 追加ライン

~~省略~~
3.3.2 呼び出し

今回、自分はGoogleMapAPIを用いたので、それを参考例として挙げたいと思います。

android/app/src/main/AndroidManifest.xml
~~省略~~
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">

<meta-data android:name="com.google.android.geo.API_KEY"
                android:value="@string/API_KEY"/> // 追加ライン
<meta-data android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"/>

~~省略~~

最後に

ここまで読んでいただきありがとうございます。
以上が環境変数の呼び出しについてでした。個人的に、plugin周りをしっかり読む機会も少なかったため、とても良い経験になりました。

参照

Discussion