본문 바로가기

플러터(Flutter)

코드랩 플러터 앱을 파이어베이스에 연동하는 예제 따라해보기 2탄 ios

개발 환경 소개

OS: Mac OS X Catalina 10.15.4

IDE: VSCode 1.46.0

Flutter: 1.12.13+hotfix.9

Dart: 2.7.2

cloud_firestore: 0.13.6

xcode: 11.5

테스트일자: 2020년 6월 14일

 

1편에 이어서

파이어베이스 기반 안드로이드 앱을 예제로 만들어 테스트 해보았다. 1편을 해봤다 치고 모든 소스코드가 있다는 가정하에, 이제 ios용 앱을 만들어 본다.

https://darkeng.tistory.com/12

 

코드랩 플러터 앱을 파이어베이스에 연동하는 예제 따라해보기 1탄 안드로이드

구글 Codelabs에 보면 Flutter app을 Firebase에 연결하고 Firestore DB에 테이블을 생성하여 데이타를 업데이트하고 또 받아보는 간단한 튜토리얼이 있다. 아기 이름 후보를 셋 정하고 마음에 드는 이름에

darkeng.tistory.com

시작 전 xcode 빌드 문제부터 해결

커맨드라인 콘솔에서 플러터앱의 최상위 디렉토리로 가서 .xcworkspace를 xcode로 연다.

open ios/Runner.xcworkspace

xcode 메뉴에서 File->Workspace Settings를 열고

Shared Workspace Settings의 빌드 시스템을 디폴트값인 New Build System에서 Legacy Build System으로 바꾼다.

Done을 누르고 xcode는 나중에 또 사용할 것이므로 그대로 둔다.

 

 

파이어베이스에 앱 추가

파이어베이스에 지난번에 만들어 놓은 baby names app db 프로젝트에 들어가면 이전에 만들어 놓은 안드로이드 앱이 보인다. 여기에 "+앱추가" 버튼을 눌러서 ios 앱을 추가한다.

ios 버튼 클릭!

 

 

ios 번들 아이디를 입력해야 하는데, xcode에서 다음과 같이 확인하여 입력한다.

xcode에서 최상위에 있는 Runner를 클릭하고 오른쪽 General 탭을 누르면 Identity 항목에 Bundle Identifier가 있다. 여기에 있는 문자열을 카피하여 파이어베이스에 붙이기한다.

(안드로이드 앱에 id를 입력할 때와 다른점이 하나 있다. 바로 Bundle Identifier에 '_'(언더스코어)가 안먹힌다는 것. 그러므로 스샷과 같이 babyNames로 설정되어 있다. 그대로 카피하면 된다.)

 

입력해준 ios 번들 ID를 바탕으로 생성된 GoogleService-Info.plist를 다운받아서 xcode의 ios/Runner/ 디렉토리에 드래그해서 넣는다. (또는 ios/Runner 디렉토리를 클릭한 상태에서 File->Add Files to Runner..를 선택해서 넣어도 된다. 이렇게 하면 대신 파일을 다운로드한 위치에서 직접 파일을 가져가지 않고 참조만 하므로 프로젝트 파일들 관리에 문제의 소지가 있으므로 커맨드라인 콘솔에서 파일을 직접 카피해서 ios/Runner/에 옮겨놓고 File->Add Files to Runner..를 해도 된다.)

 

나의 삽질

Download 디렉토리에 GoogleService-Info.plist를 다운받은 다음, 나는 커맨드라인 콘솔이 편했기에 mv 명령어로 파일을 ios/Runner로 옮기기만 했다. 그랬더니 다음과 같은 문제가 생겼다.

baby_names % mv ~/GoogleService-Info.plist ios/Runner/

이렇게 하고 swift코드를 수정하고 빌드를 하니...

빌드는 되었지만 위와 같이 FIRApp configure 도중 Exception이 발생한다.

문제의 원인은 GoogleService-Info.plist 파일을 ios/Runner에 위치만 시켜놓았을 뿐 xcode에 추가는 하지 않았던 것. 위에 설명한 것과 같이 드래그해서 xcode에 추가하던지 아니면 나같이 미리 파일을 카피해 놓았다면 File->Add Files to Runner로 다운받은 파일을 xcode에 정상적으로 import 시킬 것.

 

다시 파이어베이스로 돌아가서

친절하게 초기화 코드를 넣는 방법을 알려준다. 현재 내가 보고 있는 AppDelegate 코드와 달라서 다음과 같이 diff를 추가한다.

diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 70693e4..077fc08 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -1,5 +1,6 @@
 import UIKit
 import Flutter
+import Firebase
 
 @UIApplicationMain
 @objc class AppDelegate: FlutterAppDelegate {
@@ -7,6 +8,7 @@ import Flutter
     _ application: UIApplication,
     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
   ) -> Bool {
+    FirebaseApp.configure()
     GeneratedPluginRegistrant.register(with: self)
     return super.application(application, didFinishLaunchingWithOptions: launchOptions)
   }

이제 빌드를 하면 아무 문제 없이 잘 된다.

 

아이폰 SE 에뮬레이터로 돌린 모습