카카오 로그인 기능 추가
This commit is contained in:
@@ -132,6 +132,7 @@ struct LoginView: View {
|
||||
Image("ic_login_kakao")
|
||||
.onTapGesture {
|
||||
hideKeyboard()
|
||||
viewModel.loginWithKakao()
|
||||
}
|
||||
|
||||
Image("ic_login_google")
|
||||
|
||||
@@ -13,6 +13,8 @@ import CryptoKit
|
||||
import Security
|
||||
import UIKit
|
||||
import GoogleSignIn
|
||||
import KakaoSDKUser
|
||||
import KakaoSDKAuth
|
||||
|
||||
final class LoginViewModel: NSObject, ObservableObject {
|
||||
private let appViewModel = AppViewModel()
|
||||
@@ -98,6 +100,33 @@ final class LoginViewModel: NSObject, ObservableObject {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func loginWithKakao() {
|
||||
let loginHandler: (OAuthToken?, Error?) -> Void = { token, error in
|
||||
DispatchQueue.main.async {
|
||||
if let error = error {
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
self.errorMessage = I18n.Login.Kakao.signInFailed
|
||||
self.isShowPopup = true
|
||||
return
|
||||
}
|
||||
|
||||
guard let accessToken = token?.accessToken, !accessToken.isEmpty else {
|
||||
self.errorMessage = I18n.Login.Kakao.tokenMissing
|
||||
self.isShowPopup = true
|
||||
return
|
||||
}
|
||||
|
||||
self.loginWithKakao(accessToken: accessToken)
|
||||
}
|
||||
}
|
||||
|
||||
if KakaoSDKUser.UserApi.isKakaoTalkLoginAvailable() {
|
||||
KakaoSDKUser.UserApi.shared.loginWithKakaoTalk(completion: loginHandler)
|
||||
} else {
|
||||
KakaoSDKUser.UserApi.shared.loginWithKakaoAccount(completion: loginHandler)
|
||||
}
|
||||
}
|
||||
|
||||
private func loginWithApple(identityToken: String, nonce: String) {
|
||||
let pushToken = UserDefaults.string(forKey: .pushToken)
|
||||
@@ -153,6 +182,33 @@ final class LoginViewModel: NSObject, ObservableObject {
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
private func loginWithKakao(accessToken: String) {
|
||||
let pushToken = UserDefaults.string(forKey: .pushToken)
|
||||
let marketingPid = UserDefaults.string(forKey: .marketingPid)
|
||||
let request = SocialLoginRequest(
|
||||
container: "ios",
|
||||
pushToken: pushToken.isEmpty ? nil : pushToken,
|
||||
marketingPid: marketingPid.isEmpty ? nil : marketingPid,
|
||||
identityToken: nil,
|
||||
nonce: nil
|
||||
)
|
||||
|
||||
isLoading = true
|
||||
repository.loginKakao(request: request, accessToken: accessToken)
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
case .failure(let error):
|
||||
self.isLoading = false
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
}
|
||||
} receiveValue: { response in
|
||||
self.handleLoginResponse(response)
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
private func presentingViewController() -> UIViewController? {
|
||||
return UIApplication.shared.connectedScenes
|
||||
.compactMap { $0 as? UIWindowScene }
|
||||
|
||||
@@ -12,6 +12,7 @@ enum UserApi {
|
||||
case login(request: LoginRequest)
|
||||
case loginApple(request: SocialLoginRequest)
|
||||
case loginGoogle(request: SocialLoginRequest, idToken: String)
|
||||
case loginKakao(request: SocialLoginRequest, accessToken: String)
|
||||
case signUp(request: SignUpRequest)
|
||||
case findPassword(request: ForgotPasswordRequest)
|
||||
case searchUser(nickname: String)
|
||||
@@ -54,6 +55,9 @@ extension UserApi: TargetType {
|
||||
|
||||
case .loginGoogle:
|
||||
return "/member/login/google"
|
||||
|
||||
case .loginKakao:
|
||||
return "/member/login/kakao"
|
||||
|
||||
case .signUp:
|
||||
return "/member/signup/v2"
|
||||
@@ -128,7 +132,7 @@ extension UserApi: TargetType {
|
||||
|
||||
var method: Moya.Method {
|
||||
switch self {
|
||||
case .login, .loginApple, .loginGoogle, .signUp, .findPassword, .notification, .logout, .logoutAllDevice, .signOut, .creatorFollow, .creatorUnFollow, .memberBlock, .memberUnBlock,
|
||||
case .login, .loginApple, .loginGoogle, .loginKakao, .signUp, .findPassword, .notification, .logout, .logoutAllDevice, .signOut, .creatorFollow, .creatorUnFollow, .memberBlock, .memberUnBlock,
|
||||
.profileImageUpdate:
|
||||
return .post
|
||||
|
||||
@@ -150,6 +154,9 @@ extension UserApi: TargetType {
|
||||
|
||||
case .loginGoogle(let request, _):
|
||||
return .requestJSONEncodable(request)
|
||||
|
||||
case .loginKakao(let request, _):
|
||||
return .requestJSONEncodable(request)
|
||||
|
||||
case .signUp(let request):
|
||||
return .requestJSONEncodable(request)
|
||||
@@ -218,6 +225,9 @@ extension UserApi: TargetType {
|
||||
|
||||
case .loginGoogle(_, let idToken):
|
||||
return ["Authorization": "Bearer \(idToken)"]
|
||||
|
||||
case .loginKakao(_, let accessToken):
|
||||
return ["Authorization": "Bearer \(accessToken)"]
|
||||
|
||||
default:
|
||||
return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"]
|
||||
|
||||
@@ -24,6 +24,10 @@ final class UserRepository {
|
||||
func loginGoogle(request: SocialLoginRequest, idToken: String) -> AnyPublisher<Response, MoyaError> {
|
||||
return api.requestPublisher(.loginGoogle(request: request, idToken: idToken))
|
||||
}
|
||||
|
||||
func loginKakao(request: SocialLoginRequest, accessToken: String) -> AnyPublisher<Response, MoyaError> {
|
||||
return api.requestPublisher(.loginKakao(request: request, accessToken: accessToken))
|
||||
}
|
||||
|
||||
func signUp(request: SignUpRequest) -> AnyPublisher<Response, MoyaError> {
|
||||
return api.requestPublisher(.signUp(request: request))
|
||||
|
||||
Reference in New Issue
Block a user