[swift] SwiftUI와 Firebase의 연동 방법

SwiftUI는 iOS 개발을 위한 새로운 사용자 인터페이스 프레임워크입니다. Firebase는 백엔드 서비스로 실시간 데이터베이스와 사용자 인증, 클라우드 저장소 등을 제공합니다. 이번 포스트에서는 SwiftUI와 Firebase를 연동하는 방법에 대해 알아보겠습니다.

1. Firebase 프로젝트 설정

Firebase를 사용하기 위해 먼저 Firebase 프로젝트를 생성해야합니다. Firebase 콘솔에 접속하여 새 프로젝트를 만들고 iOS 앱을 추가합니다. 앱에 대한 Bundle ID를 입력하고, GoogleService-Info.plist 파일을 다운로드 받아 프로젝트에 추가합니다.

2. Firebase SDK 설정

Firebase를 사용하기 위해 필요한 SDK를 프로젝트에 추가해야합니다. Xcode에서 프로젝트를 열고, 프로젝트 대상을 선택한 후, General 탭에서 Firebase.frameworkFirebaseFirestore.framework를 추가합니다.

또한 프로젝트의 Info.plist 파일에 Firebase 설정을 추가해야 합니다. 아래 예제 코드를 Info.plist 파일에 추가하세요.

<key>FirebaseAppDelegateProxyEnabled</key>
<false/>

<!-- 앱이 시작될  자동으로 기본 앱을 초기화하려는 경우 추가 -->
<key>FirebaseAppDelegateProxyEnabled</key>
<true/>

<key>FirebaseCore</key>
<string/> <!-- Firebase 프로젝트에서 제공하는 GoogleService-Info.plist 파일 이름 입력 -->

<key>FirestoreDebugEnabled</key>
<true/> <!-- 개발할  Firestore 디버그 로그를 출력하려는 경우 추가 -->

3. SwiftUI와 Firebase 연동하기

이제 SwiftUI로 앱을 구성하고 Firebase와 연동할 수 있습니다. 예를 들어, 사용자가 로그인하고 메시지를 작성하여 Firebase에 저장하는 간단한 앱을 만들어보겠습니다.

먼저, Firebase와의 연동을 위한 FirebaseApp.configure()를 AppDelegate 클래스의 application(_:didFinishLaunchingWithOptions:) 메서드에서 호출해야 합니다.

import Firebase

@main
struct MySwiftUIApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

다음으로, 사용자 인증을 위한 Firebase Auth를 사용하여 로그인 기능을 구현합니다.

import FirebaseAuth

struct ContentView: View {
    @State private var email: String = ""
    @State private var password: String = ""

    var body: some View {
        VStack {
            TextField("Email", text: $email)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            SecureField("Password", text: $password)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            Button("Login") {
                Auth.auth().signIn(withEmail: email, password: password) { result, error in
                    if let error = error {
                        print("Login failed: \(error.localizedDescription)")
                    } else {
                        print("Login success!")
                    }
                }
            }
        }
    }
}

마지막으로, Firestore를 사용하여 메시지를 작성 및 저장하는 기능을 추가합니다.

import FirebaseFirestore

struct ContentView: View {
    // ...

    @State private var message: String = ""

    var body: some View {
        VStack {
            // ...

            TextField("Message", text: $message)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            Button("Send") {
                let db = Firestore.firestore()
                db.collection("messages").addDocument(data: [
                    "message": message,
                    "timestamp": Timestamp()
                ]) { error in
                    if let error = error {
                        print("Error adding document: \(error.localizedDescription)")
                    } else {
                        print("Document added!")
                    }
                }
            }
        }
    }
}

이제 위의 예제 코드를 사용하여 SwiftUI와 Firebase를 연동할 수 있습니다. Firebase를 사용하여 데이터베이스를 읽고 쓰거나, 사용자 인증을 구현하는 등 다양한 기능을 개발할 수 있습니다.

참고: Firebase를 사용할 때는 보안을 위해 규칙을 추가하는 것을 잊지 마세요. Firebase 콘솔에서 Firestore나 사용자 인증에 대한 규칙을 설정하여 악의적인 사용자로부터 보호하세요.

Firebase 공식 문서와 SwiftUI 문서를 참고하여 더 많은 기능을 익힐 수 있습니다.