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), и благодаря хорошим блог-постам на эту тему, мы наконец нашли проблему!
Надеюсь, этот блог-пост поможет некоторым людям с такой же проблемой. Вам не должно быть нужно вручную настраивать что-либо, если инструмент должен делать это за вас!
Хорошего дня!