SwiftUI 앱에서 Firebase 에뮬레이터를 사용해보기

이게 뭐야?



SwiftUI에서 Firebase Local Emulator Suite에 연결하는 자습서

목차


  • Firebase Local Emulator Suite 란 무엇입니까?
  • Emulator 설정
  • Emulator 시작
  • SwiftUI 프로젝트에서 Emulator에 연결

  • Firebase Local Emulator Suite란 무엇입니까?



    공식 문서를 보는 것이 좋지만 간단히 설명하면
    Firebase Local Emulator Suite는 Firestore, Cloud Functions 등의 에뮬레이터로 구성되어 있으며 프로덕션 데이터에 영향을 주지 않고 앱을 개발할 수 있는 도구입니다.
    에뮬레이터 간의 연계(Firestore를 작성할 때 Cloud Functions를 시작하는 등)도 지원합니다.

    Emulator 설정



    도구 설치 및 프로젝트 초기화
    run npm install -g firebase-tools
    firebase init
    # Emulators: Set up local emulators for Firebase products を選択する
    # Realtime Database, Firestore, Functions も使う場合は一緒に選択しておく
    

    명령을 실행한 디렉토리에 Firebase 프로젝트가 생성됨



    Emulator 시작


    firebase emulators:start
    



    Java가 인스톨 되어 있지 않은 경우는 brew 등으로 인스톨 하면 해결합니다.

    SwiftUI 프로젝트에서 Emulator에 연결



    다음 2단계를 수행하면 Emulator에 연결할 수 있습니다.
  • Xcode에서 SwiftUI 프로젝트를 만들고 Firebase console에서 다운로드 한 GoogleService-Info.plist를 프로젝트에 추가
    ※ 이것이 없으면 앱이 시작될 때 충돌합니다
  • 만든 프로젝트의 앱에 다음 설정 추가
  • import SwiftUI
    
    @main
    struct FirebaseEmulatorExampleApp: App {
        @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            FirebaseApp.configure()
    
            Auth.auth().useEmulator(withHost:"localhost", port:9099)
    
            let settings = Firestore.firestore().settings
            settings.host = "localhost:8080"
            settings.isPersistenceEnabled = false
            settings.isSSLEnabled = false
            Firestore.firestore().settings = settings
    
            Functions.functions().useFunctionsEmulator(origin: "http://localhost:5001")
    
            return true
        }
    }
    

    작성한 프로젝트에서는 항상 Firestore를 호출하면 에뮬레이터에 데이터를 읽고 씁니다.
    func read() {
        let db = Firestore.firestore()
    
        db.collection("contents").addSnapshotListener { (snap, error) in
            if let error = error {
                fatalError(error.localizedDescription)
            }
            if let snap = snap {
                for i in snap.documentChanges {
                    if i.type == .added {
                        let id = i.document.documentID
                        let value = i.document.get("value") as! String
                        self.values.append(Content(id: id, value: value))
                    }
                }
            }
        }
    }
    
    func write(content value: String) {
        let data = ["value": value]
        let db = Firestore.firestore()
        db.collection("contents").addDocument(data: data) { error in
            if let error = error {
                fatalError(error.localizedDescription)
            }
        }
    }
    

    좋은 웹페이지 즐겨찾기