Flutterfire с flavors — отсутствующая документация

Flutterfire с flavors — отсутствующая документация

FlutterPulse

Эта статья переведена специально для канала FlutterPulse. В этом канале вы найдёте много интересных вещей, связанных с Flutter. Не забывайте подписываться! 🚀

Недавно мы столкнулись с загадочной проблемой после настройки Firebase Crashlytics в нашем проекте Flutter с несколькими флейворами.

FirebaseJsonException: Пожалуйста, выполните команду "flutterfire configure" […]

Во время описанного процесса добавления Firebase в наше приложение здесь, нам представляют flutterfire_cli , удобный инструмент для автоматической настройки нашего приложения Firebase с нашим приложением Flutter. Он обрабатывает создание и копирование файлов GoogleService-Info.plist и google-services.json в вашем проекте. Он даже добавляет скрипты фазы сборки в Xcode и зависимости gradle — как круто!

С текущей версией 1.2.0 инструмента flutterfire_cli, вам не нужно вручную настраивать ничего, или так мы думали, пока не столкнулись с проблемой в нашем CI/CD:

FirebaseJsonException: Пожалуйста, выполните команду "flutterfire configure" для обновления файла 
`firebase.json` в корне вашего проекта Flutter с правильными значениями. 
тип 'Null' не является подтипом типа 'Map<dynamic, dynamic>' в приведении типов

Дело в том, что мы используем флейворы в нашем приложении, у нас есть dev, staging и prod.

После следования официальной документации по флейворам в приложении Flutter здесь для iOS, и здесь для Android, мы искали документацию Firebase по флейворам и нашли… ничего. Ну, почти ничего, есть документ о настройке нескольких проектов, но он не для Flutter, и он говорит вам указать конфигурацию файла сервиса при вызове инициализации Firebase в коде.

Мы не хотим этого делать.

Об этом нигде не сказано в официальной документации.

После тщательного поиска ответов в интернете, мы наткнулись на более детальную команду flutterfire config:

flutterfire config --project=<firebase-project-name> \
  --out=lib/application/config/firebase_options_<env>.dart \
  --ios-bundle-id=com.example.app.<env> \
  --ios-out=ios/flavors/<env>/GoogleService-Info.plist \
  --android-package-name=com.example.app.<env> \
  --android-out=android/app/src/<env>/google-services.json

Спасибо отличной статье Андреа Биззотто, но то, что меня действительно беспокоит, так это то, что:

Об этом нигде не сказано в официальной документации.

На этом этапе мы могли запустить наше приложение, но не могли собрать его для релиза. Мы столкнулись с основной проблемой:

FirebaseJsonException: Пожалуйста, выполните команду "flutterfire configure" […]

У нас была проблема именно на iOS, поэтому мы подумали, что это плохая настройка схемы, но наши схемы настроены как ожидалось… Мы проверили файл firebase.json и наш файл выглядел хорошо для нас в части ios:

{
  "ios": {
      "buildConfigurations": {
        "Debug-dev": {
          "projectId": "project-dev",
          "appId": "1:123412341234:ios:iuhe1iu2heu32hru1h12ru",
          "uploadDebugSymbols": true,
          "fileOutput": "ios/config/dev/GoogleService-Info.plist"
        },
        "Debug-staging": {
          "projectId": "project-staging",
          "appId": "1:123412341234:ios:uh12983h18b89bf1ub7yb3",
          "uploadDebugSymbols": true,
          "fileOutput": "ios/config/staging/GoogleService-Info.plist"
        },
        "Debug-prod": {
          "projectId": "project-prod",
          "appId": "1:123412341234:ios:nd73hbdyuvas7dv378dfd2",
          "uploadDebugSymbols": true,
          "fileOutput": "ios/config/prod/GoogleService-Info.plist"
        }
    }
}

Мы проверили логи непосредственно в Xcode (самый дальний значок слева, на случай, если вы не знали, команды flutter build также выводят логи туда) и нас поразило на этапе FlutterFire bundle-service-file:

Вы не настроили файл "GoogleService-Info.plist" с конфигурацией сборки: "Release-dev"

Если вы хотите создать архив или собрать своё приложение для iOS, не создавая символические ссылки в Xcode, не добавляя пользовательские скрипты фазы сборки, вы ДОЛЖНЫ заново выполнить команду flutterfire config, и когда вам предложат выбрать BuildConfiguration , выбрать Release-<env> .

Теперь всё работает отлично. Наш файл firebase.json обновлён с тремя дополнительными buildConfigurations для Release-dev , Release-staging и Release-prod .

Благодаря неполной официальной документации (/rant), и благодаря хорошим блог-постам на эту тему, мы наконец нашли проблему!

Надеюсь, этот блог-пост поможет некоторым людям с такой же проблемой. Вам не должно быть нужно вручную настраивать что-либо, если инструмент должен делать это за вас!

Хорошего дня!

Report Page