FlutterFire는 Flutter 앱으로 Firebase를 연동하는 Flutter 플러그인 세트 입니다. 기본은 macos 개발을 위한 정보 확인 중에 찾은 자료라서 플랫폼 별로 모두 설정 확인을 하도록 해보겠습니다.
주의) 1주일 가까이 firebase와 씨름을 한 거 같습니다. 상황이 m1 맥미니를 구입한지 얼마 안되었고, flutter 2.0에 깜짝 발표된 뒤라, 먼가 정리되지 않은 상태에서 버전 이슈라고만 생각을 했었는데... ㅠ,.ㅠ
기본 시스템 환경
Mac Mini 2020 M1 (8core CPU, 8core GPU, 8GB Ram), macOS Big Sur 11.2.2
Flutter 2.0.2 / Dart 2.12.12 / CocoaPods 1.10.1
Android Studio 4.1.2
Xcode 12.4
설치
firebase 사이트는 iOS, android, Web 앱 설정만 있습니다. 저는 Flutter로 데스크탑 앱을 만들고 있는 중이라, 저의 개인적인 요구에 따라서 macOS 연동을 목표로 정리를 합니다. 하지만 iOS와 설정이 거의 동일하기 때문에 되도록 같이 설명을 하겠습니다.
로컬 머신에서 flutter 프로젝트를 생성하고, Firebase Console에 프로젝트 생성 혹은 기존 프로젝트에서 앱 추가를 합니다.
Cloud Firestore 앱 추가
iOS 앱 추가 - macos 와 공통으로 사용해야할 앱
iOS 번들 ID 확인 (혹시 이미 만들어 놓은 프로젝트에서 번들 ID를 모르신다면 참조하세요)
os(macos)/Runner.xcworkspace 프로젝트를 Xcode로 열고, 최상단 Runner 선택 후 General 탭 > Identity 영역 > Bundle Identifier 항목 확인.
Android Studio 에서 프로젝트 생성을 할때, Project Name을 입력한 다음 페이지에 Package name이 번들 ID 입니다. flutter create [project]로 직접 생성했다면, com.example.project가 기본 번들ID로 생성됩니다.
iOS/macOS 설정 및 소스 일부 변경 (Xcode 활용)
구성 파일 다운로드
GoogleService-Info.plist 파일 다운로드 및 Xcode에 추가
Runner 선택 및 오른쪽 버튼 클릭 > Add Files to "Runner" 클릭 > (Copy items if needed 옵션 선택) > GoogleService-Info.plist 선택 추 (* Runner 폴더 밑으로 추가를 해주셔야 합니다)
Firebase Emulator Suite 사용 설정
Firebase Emulator Suite는 빠르고 복잡하지 않은 설정을 지원하기 위해서 암호화 되지 않은 네트워킹 연결을 사용합니다. macOS는 기본으로 암호회된 네트워킹 연결을 요구합니다. 로컬 머신에서 개발하는 동안 Firebase Emulator Suite를 사용하려면, 작업 중인 macOS 앱에 보안이 되지 않는 로컬 네트워크 서비스에 연결하도록 허용해야 합니다.
ios(macos)/Runnder/Info.plist 에 아래 설정을 추가합니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Deployment Target 변경
iOS 9.0 > 10.0, macOS 10.11 > 10.12
# macos/Podfile
platform :osx, '10.12'
# ios/Podfile
platform :ios, '10.0'
AppDelegate.swift
# 추가 코드
import Firebase
FirebaseApp.configure()
# 적용 예
import Cocoa
import FlutterMacOS
import Firebase
@NSApplicationMain
class AppDelegate: FlutterAppDelegate {
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
FirebaseApp.configure()
return true
}
}
iOS/ macOS 빌드 시간 개선 (Podfile 변경)
현재 Firebase iOS SDK는 Xcode로 빌드시 5분 이상 걸릴 수 있는 약 500k 줄 짜리 c++ 코드에 의존하고 있습니다. 빌드 시간을 크게 단축하기 위해서, ios/Podfile에 1줄을 추가해 프리컴파일된 버전을 사용하도록 합니다.
# ios(macos) /Podfile 추가
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.26.0'
// 추가 위치
# ...
target 'Runner' do
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => $FirebaseSDKVersion
# ...
end
FirebaseSDKVersion 변수는 아래 Native SDK 버전 정의를 참조하세요.
추가로 cocoapods를 1.9.1 이나 그 이상 버전으로 업그레이드 힙니다. gem install cocoapods
(참조 : https://github.com/FirebaseExtended/flutterfire/issues/2751)
저의 경우에는 2021-03-13 현재, 1.10.1로 업그레이드가 되었습니다.
Native SDK 버전 재정의
최상단 platform 정의 바로 밑에 추가해주세요.
# ios(macos)/Podfile
# Override Firebase SDK Version
$FirebaseSDKVersion = '6.33.0'
pod install 실행
실행 테스트
오류 팁
% flutter run -d macos
Changing current working directory to: /Volumes/Data/Study/flutter/nativeappmaker
Launching lib/main.dart on macOS in debug mode...
Running pod install... 1,775ms
In file included from /Users/websniper/Development/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.16.0+1/macos/Classes/FLTFirebaseFirestorePlugin.m:9:
/Users/websniper/Development/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.16.0+1/macos/Classes/Private/FLTFirebaseFirestoreUtils.h:42:4: error: expected a type
+ (FIRFirestoreSource)FIRFirestoreSourceFromArguments:(NSDictionary *_Nonnull)arguments;
^
FirebaseSDKVersion = '7.4.0'
참조 사이트 : firebase.flutter.dev/docs/overview/