카카오 로그인 기능 추가

This commit is contained in:
Yu Sung
2026-01-27 16:18:54 +09:00
parent b522b50dee
commit 5e209662d8
11 changed files with 660 additions and 532 deletions

View File

@@ -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 }