// ✅ 소셜 로그인 (Facebook, Google, Apple 등)
func signIn(with credential: AuthCredential) -> AnyPublisher<User, Error> {
return Future { promise in
Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
promise(.failure(error)) // 에러 처리
} else if let user = authResult?.user {
promise(.success(user)) // 성공
}
}
}
.eraseToAnyPublisher()
}
// ✅ 이메일 & 비밀번호로 회원가입
func registerUser(with email: String, password: String) -> AnyPublisher<User, Error> {
return Auth.auth().createUser(withEmail: email, password: password)
.map(\.user)
.eraseToAnyPublisher()
}
1️⃣ signIn(with credential:) → 소셜 로그인
📌 어떤 경우에 사용?
- Facebook, Google, Apple 로그인 같은 소셜 로그인을 처리할 때 사용
- credential은 소셜 로그인을 통해 얻은 인증 정보 (AuthCredential 타입)
- Firebase가 해당 소셜 계정으로 회원가입 또는 로그인을 자동으로 처리
func signIn(with credential: AuthCredential) -> AnyPublisher<User, Error> {
return Future { promise in
Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
promise(.failure(error)) // 에러 발생 시
} else if let user = authResult?.user {
promise(.success(user)) // 로그인 성공 시
}
}
}
.eraseToAnyPublisher()
}
🔷 사용 예시 (Google 로그인)
// Google 로그인 후 Firebase 인증
let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
signIn(with: credential)
.sink(receiveCompletion: { completion in
switch completion {
case .failure(let error):
print("소셜 로그인 실패: \(error.localizedDescription)")
case .finished:
print("소셜 로그인 성공!")
}
}, receiveValue: { user in
print("로그인한 유저: \(user.email ?? "Unknown")")
})
.store(in: &cancellables)
- credential을 사용하여 Firebase에 로그인 (signIn(with:))
- 기존 계정이 없으면 자동으로 회원가입됨
- Future를 사용하여 비동기 작업을 Combine의 Publisher로 변환
https://explorer89.tistory.com/363
🤔 소셜 미디어 로그인 방법에서 Future를 사용한 이유?
func signIn(with credential: AuthCredential) -> AnyPublisher { return Future { promise in Auth.auth().signIn(with: credential) { authResult, error in if let error = error { promise(.failure(error)) // 에러 처리 } else if let user = authResult?.user { p
explorer89.tistory.com
2️⃣ registerUser(with email:password:) → 이메일 회원가입
📌 어떤 경우에 사용?
- 이메일 & 비밀번호로 회원가입을 처리할 때 사용
- 사용자가 직접 이메일과 비밀번호를 입력하여 계정을 생성
func registerUser(with email: String, password: String) -> AnyPublisher<User, Error> {
return Auth.auth().createUser(withEmail: email, password: password)
.map(\.user) // authResult.user를 추출
.eraseToAnyPublisher()
}
🔷 사용 예시
registerUser(with: "test@example.com", password: "password123")
.sink(receiveCompletion: { completion in
switch completion {
case .failure(let error):
print("회원가입 실패: \(error.localizedDescription)")
case .finished:
print("회원가입 성공!")
}
}, receiveValue: { user in
print("가입한 유저: \(user.email ?? "Unknown")")
})
.store(in: &cancellables)
- createUser(withEmail:password:)를 사용하여 Firebase에 새 계정을 생성
- 이미 존재하는 이메일이면 에러 반환
- 성공하면 User 객체를 반환
- Combine의 map(\.user)을 사용하여 authResult.user를 추출하고 Publisher로 반환
➡️ 결론:
- 소셜 로그인은 signIn(with credential:) 사용
- 이메일 회원가입은 registerUser(with email:password:) 사용
'UIKIT > Firebase' 카테고리의 다른 글
❓ FireStore 내에 회원정보를 불러오는 데 왜 tryMap? (0) | 2025.02.27 |
---|---|
❓ Firebase 로그인 메서드 내 map의 역할 (0) | 2025.02.27 |
🚀 Future를 사용한 방식 vs map(\.user)을 사용한 방식의 차이점 (Future 는 필수인가?) (0) | 2025.02.26 |
🔥 MVVM + Combine을 활용한 소셜 로그인 & 이메일 회원가입 (0) | 2025.02.26 |
🤔 소셜 미디어 로그인 방법에서 Future를 사용한 이유? (0) | 2025.02.26 |