본문 바로가기
Swift

Swfit TCA로 Apple SNS 로그인으로 사용자 탈퇴하기

by mr.conan 2023. 7. 16.
728x90
반응형

Apple SNS 로그인으로 사용자를 탈퇴하기 위해서는 Apple 로그인 API를 사용하여 해당 기능을 처리할 수 있습니다. 다음은 Swift TCA와 Apple 로그인 API를 활용하여 사용자 탈퇴를 구현하는 방법입니다.

 

1. 액션(Action)에 탈퇴 액션 추가

먼저, 액션에 탈퇴 액션을 추가합니다.

enum AppAction {
    case loginSuccess(User)
    case loginFailure(Error)
    case appleSignInTapped
    case userWithdrawn // 사용자 탈퇴 액션 추가
    // 기타 다른 액션들을 추가할 수 있습니다.
}

 

2. 리듀서(Reducer)에 탈퇴 처리 추가

리듀서에서 사용자 탈퇴 시의 처리를 추가합니다.

let appReducer = Reducer<AppState, AppAction, AppEnvironment> { state, action, environment in
    switch action {
    case let .loginSuccess(user):
        state.isLoggedIn = true
        state.user = user
        return .none

    case .loginFailure:
        // 로그인 실패 시에 대한 처리를 추가합니다.
        return .none

    case .appleSignInTapped:
        // Apple 로그인 버튼이 눌렸을 때의 처리를 추가합니다.
        let appleSignInProvider = ASAuthorizationAppleIDProvider()
        let appleSignInRequest = appleSignInProvider.createRequest()
        appleSignInRequest.requestedScopes = [.fullName, .email]
        return environment.appleSignInController
            .signIn(with: appleSignInRequest)
            .map { authorization in
                // Apple 로그인 성공 시에 대한 처리를 추가합니다.
                // 사용자 정보를 추출하여 액션을 디스패치합니다.
                guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential else {
                    return .loginFailure(AppError.unknownError)
                }

                let user = User(id: appleIDCredential.user,
                                name: "\(appleIDCredential.fullName?.givenName ?? "") \(appleIDCredential.fullName?.familyName ?? "")")
                return .loginSuccess(user)
            }
            .catch { error in
                // Apple 로그인 실패 시에 대한 처리를 추가합니다.
                return .loginFailure(error)
            }
            .eraseToEffect()

    case .userWithdrawn:
        // 사용자 탈퇴 시의 처리를 추가합니다.
        return environment.appleSignInProvider
            .getCredentialState(forUserID: state.user?.id ?? "")
            .map { credentialState in
                switch credentialState {
                case .authorized, .revoked, .transferred: // 사용자 인증 상태를 확인하고 탈퇴 처리합니다.
                    state.isLoggedIn = false
                    state.user = nil
                case .notFound:
                    break // 해당 사용자를 찾지 못하는 경우 아무런 처리를 하지 않습니다.
                @unknown default:
                    break // 기타 예외 상황에 대한 처리를 추가할 수 있습니다.
                }
            }
            .eraseToEffect()
    }
}

 

반응형

3. SwiftUI 뷰에서 탈퇴 액션 디스패치

마지막으로 SwiftUI 뷰에서 앱 스토어를 사용하여 탈퇴 액션을 디스패치하는 방법을 보여드리겠습니다.

import SwiftUI
import ComposableArchitecture

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(appStore) // 앱 스토어를 환경 객체로 주입합니다.
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var store: Store<AppState, AppAction> // 앱 스토어를 주입받습니다.

    var body: some View {
        VStack {
            if store.state.isLoggedIn {
                LoggedInView()
                Button("탈퇴하기", action: {
                    store.send(.userWithdrawn) // 탈퇴 버튼이 눌렸을 때 탈퇴 액션을 디스패치합니다.
                })
            } else {
                Button("Apple 로그인", action: {
                    store.send(.appleSignInTapped) // Apple 로그인 버튼이 눌렸을 때 액션을 디스패치합니다.
                })
            }
        }
    }
}

이제 사용자가 탈퇴 버튼을 누를 때 .userWithdrawn 액션이 발생하고, 리듀서에서 해당 액션을 처리하여 Apple 로그인 API를 사용하여 사용자를 탈퇴할 수 있습니다. 앱의 상태와 Apple 로그인 상태를 확인하여 사용자를 탈퇴하게 됩니다.

 

Swift TCA를 사용하여 Apple SNS 로그인과 사용자 탈퇴를 구현하면 상태 관리와 비동기 처리가 효율적으로 이루어집니다. 사용자에게 알맞은 탈퇴 처리를 제공하여 더욱 안정적인 앱을 개발하길 바랍니다.

728x90
반응형