From 5cff6f7f4ea69534ae927be9a56de5c9a2edd276 Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 15:29:17 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[FIX]=20#246=20-=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=EA=B3=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resouces/Constants/Const.swift | 2 +- .../Resouces/Constants/Header.swift | 3 +- .../Resouces/Constants/UserDefaults.swift | 3 + NADA-iOS-forRelease/Sources/AppDelegate.swift | 111 ++++++++++++++---- .../Sources/SceneDelegate.swift | 54 +-------- .../Login/LoginViewController.swift | 50 ++++---- .../Splash/SplashViewController.swift | 41 +++---- 7 files changed, 129 insertions(+), 135 deletions(-) diff --git a/NADA-iOS-forRelease/Resouces/Constants/Const.swift b/NADA-iOS-forRelease/Resouces/Constants/Const.swift index c37b3728..1b721fb6 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/Const.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/Const.swift @@ -8,5 +8,5 @@ import Foundation struct Const { - + static let headerToken: String = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) ?? "" } diff --git a/NADA-iOS-forRelease/Resouces/Constants/Header.swift b/NADA-iOS-forRelease/Resouces/Constants/Header.swift index 44c05e0e..922a9a61 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/Header.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/Header.swift @@ -8,10 +8,11 @@ import Foundation extension Const { + struct Header { static var bearerHeader = ["Authorization": "Bearer " + UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken)!] static var basicHeader = ["Content-Type": "application/json", - "Authorization": "Bearer " + UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken)!] + "Authorization": "Bearer " + headerToken] } } diff --git a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift index f8d09df4..0c9f5af8 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift @@ -16,5 +16,8 @@ extension Const { static let isFirstCard = "isFirstCard" static let isOnboarding = "isOnboarding" static let firstCardID = "firstCardID" + static let isAppleLogin = "isAppleLogin" + static let isKakaoLogin = "isKakaoLogin" + static let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag" } } diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index 746a3a45..64580c03 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -7,43 +7,47 @@ import UIKit import KakaoSDKCommon +import KakaoSDKAuth +import KakaoSDKUser import AuthenticationServices @main class AppDelegate: UIResponder, UIApplicationDelegate { - // var isLogin = false + var isLogin = false func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. - // removeKeychainAtFirstLaunch() + + removeTokenAtFirstLaunch() KakaoSDKCommon.initSDK(appKey: "5b8dd8cc878344bb7532eeca4365a4aa") -// let appleIDProvider = ASAuthorizationAppleIDProvider() -// appleIDProvider.getCredentialState(forUserID: Const.UserDefaults.userID) { (credentialState, error) in -// switch credentialState { -// case .authorized: -// print("해당 ID는 연동되어있습니다.") -// self.isLogin = true -// case .revoked: -// print("해당 ID는 연동되어있지않습니다.") -// self.isLogin = false -// case .notFound: -// print("해당 ID를 찾을 수 없습니다.") -// self.isLogin = false -// default: -// break -// } -// } + let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) + let rfToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.refreshToken) -// NotificationCenter.default.addObserver(forName: ASAuthorizationAppleIDProvider.credentialRevokedNotification, object: nil, queue: nil) { (Notification) in -// print("Revoked Notification") -// self.isLogin = false -// } + if acToken != "" { + postUserTokenReissue(request: UserTokenReissueRequset(accessToken: acToken ?? "", refreshToken: rfToken ?? "")) + } else { + self.isLogin = false + } + + // 앱 실행 중 애플 ID 강제로 연결 취소 시 + NotificationCenter.default.addObserver(forName: ASAuthorizationAppleIDProvider.credentialRevokedNotification, object: nil, queue: nil) { (Notification) in + print("Revoked Notification") + self.isLogin = false + } return true } + private func removeTokenAtFirstLaunch() { + guard UserDefaults.isFirstLaunch() else { + return + } + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.accessToken) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.refreshToken) + } + // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { @@ -58,6 +62,67 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } - + private func postUserTokenReissue(request: UserTokenReissueRequset) { + UserAPI.shared.userTokenReissue(request: request) { response in + switch response { + case .success: + print("postUserTokenReissue - Success") + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.isAppleLogin) { + // 애플 로그인으로 연동되어 있을 때, -> 애플 ID와의 연동상태 확인 로직 + let appleIDProvider = ASAuthorizationAppleIDProvider() + appleIDProvider.getCredentialState(forUserID: Const.UserDefaultsKey.userID) { (credentialState, error) in + switch credentialState { + case .authorized: + print("해당 ID는 연동되어있습니다.") + self.isLogin = true + case .revoked: + print("해당 ID는 연동되어있지않습니다.") + self.isLogin = false + case .notFound: + print("해당 ID를 찾을 수 없습니다.") + self.isLogin = false + default: + break + } + } + } else { + if AuthApi.hasToken() { // 유효한 토큰 존재 + UserApi.shared.accessTokenInfo { (_, error) in + if let error = error { + if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true { + self.isLogin = false + } + } else { + // 토큰 유효성 체크 성공(필요 시 토큰 갱신됨) + self.isLogin = true + } + } + } else { + // 카카오 토큰 없음 -> 로그인 필요 + self.isLogin = false + } + } + case .requestErr(let message): + print("postUserTokenReissue - requestErr: \(message)") + self.isLogin = false + case .pathErr: + print("postUserTokenReissue - pathErr") + case .serverErr: + print("postUserTokenReissue - serverErr") + case .networkFail: + print("postUserTokenReissue - networkFail") + } + } + } } +extension UserDefaults { + public static func isFirstLaunch() -> Bool { + let isFirstLaunch = !UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) + if isFirstLaunch { + UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) + UserDefaults.standard.synchronize() + } + return isFirstLaunch + } +} diff --git a/NADA-iOS-forRelease/Sources/SceneDelegate.swift b/NADA-iOS-forRelease/Sources/SceneDelegate.swift index f78aa647..15d9ca21 100644 --- a/NADA-iOS-forRelease/Sources/SceneDelegate.swift +++ b/NADA-iOS-forRelease/Sources/SceneDelegate.swift @@ -36,14 +36,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window.overrideUserInterfaceStyle = .light } } - - // 스플래시 지연시간동안 자동 로그인 작업처리 - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) { - let acToken = self.defaults.string(forKey: Const.UserDefaultsKey.accessToken) - let rfToken = self.defaults.string(forKey: Const.UserDefaultsKey.refreshToken) - - self.postUserTokenReissue(request: UserTokenReissueRequset(accessToken: acToken ?? "", refreshToken: rfToken ?? "")) - } + } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { @@ -54,53 +47,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } } - // MARK: - Network - - func postUserTokenReissue(request: UserTokenReissueRequset) { - UserAPI.shared.userTokenReissue(request: request) { response in - switch response { - case .success: - print("postUserTokenReissue - Success") - - var rootViewController = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil) - .instantiateViewController(identifier: Const.ViewController.Identifier.loginViewController) - - if self.defaults.string(forKey: Const.UserDefaultsKey.accessToken) != "" { - rootViewController = UIStoryboard(name: Const.Storyboard.Name.tabBar, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.tabBarViewController) - } else { - rootViewController = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil) - .instantiateViewController(identifier: Const.ViewController.Identifier.loginViewController) - } - self.window?.rootViewController = rootViewController - self.window?.makeKeyAndVisible() - case .requestErr(let message): - print("postUserTokenReissue - requestErr: \(message)") - - self.presentToLoginViewController() - case .pathErr: - print("postUserTokenReissue - pathErr") - case .serverErr: - print("postUserTokenReissue - serverErr") - case .networkFail: - print("postUserTokenReissue - networkFail") - } - } - } - // MARK: - Methods - private func presentToLoginViewController() { - if UserDefaults.standard.object(forKey: Const.UserDefaultsKey.isOnboarding) != nil { - let rootViewController = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(identifier: Const.ViewController.Identifier.loginViewController) - self.window?.rootViewController = rootViewController - self.window?.makeKeyAndVisible() - } else { - let rootViewController = UIStoryboard(name: Const.Storyboard.Name.onboarding, bundle: nil).instantiateViewController(identifier: Const.ViewController.Identifier.onboardingViewController) - self.window?.rootViewController = rootViewController - self.window?.makeKeyAndVisible() - } - } - func sceneDidDisconnect(_ scene: UIScene) { // Called as the scene is being released by the system. // This occurs shortly after the scene enters the background, or when its session is discarded. diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index b297f06d..025e35d2 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -40,8 +40,6 @@ class LoginViewController: UIViewController { ]) let authorizationButton = ASAuthorizationAppleIDButton(type: .signIn, style: .black) - // let authorizationButton = UIButton() - // authorizationButton.setImage(UIImage(named: "appleLogin"), for: .normal) authorizationButton.addTarget(self, action: #selector(appleSignInButtonPress), for: .touchUpInside) loginProviderStackView.addSubview(authorizationButton) @@ -74,26 +72,21 @@ class LoginViewController: UIViewController { } // 카카오 로그인 버튼 클릭 시 +// @objc + + @objc func kakaoSignInButtonPress() { - if AuthApi.hasToken() { // 유효한 토큰 존재 - UserApi.shared.accessTokenInfo { (_, error) in - if let error = error { - if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true { - // 로그인 필요 - self.signUp() - } - } else { - // 토큰 유효성 체크 성공(필요 시 토큰 갱신됨) - self.signUp() - } - } + // 카카오톡 설치 여부 확인 + if UserApi.isKakaoTalkLoginAvailable() { + // 카카오톡 로그인. api 호출 결과를 클로저로 전달. + loginWithApp() } else { - // 카카오 토큰 없음 -> 로그인 필요 - self.signUp() + // 만약, 카카오톡이 깔려있지 않을 경우에는 웹 브라우저로 카카오 로그인함. + loginWithWeb() } } - + // 애플 로그인 버튼 클릭 시 @objc func appleSignInButtonPress() { @@ -124,10 +117,11 @@ extension LoginViewController { } else { if let email = user?.kakaoAccount?.email { self.postUserSignUpWithAPI(request: email) + UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isAppleLogin) + UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isKakaoLogin) } } } - self.presentToMain() } } @@ -147,10 +141,11 @@ extension LoginViewController { } else { if let email = user?.kakaoAccount?.email { self.postUserSignUpWithAPI(request: email) + UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isAppleLogin) + UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isKakaoLogin) } } } - self.presentToMain() } } @@ -178,17 +173,13 @@ extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizatio // Apple ID 연동 성공 시 func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { switch authorization.credential { - // Apple ID + // Apple ID case let appleIDCredential as ASAuthorizationAppleIDCredential: let userIdentifier = appleIDCredential.user - // let fullName = appleIDCredential.fullName - // let email = appleIDCredential.email - - // print("User ID : \(userIdentifier)") - // print("User Email : \(email ?? "")") - // print("User Name : \((fullName?.givenName ?? "") + (fullName?.familyName ?? ""))") postUserSignUpWithAPI(request: userIdentifier) + UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isAppleLogin) + UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isKakaoLogin) presentToMain() default: @@ -211,10 +202,9 @@ extension LoginViewController { print("postUserSignUpWithAPI - success") if let userData = loginData as? UserWithTokenRequest { UserDefaults.standard.set(userData.user.userID, forKey: Const.UserDefaultsKey.userID) - if let tokenData = userData.user.token as? Token { - UserDefaults.standard.set(tokenData.accessToken, forKey: Const.UserDefaultsKey.accessToken) - UserDefaults.standard.set(tokenData.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) - } + UserDefaults.standard.set(userData.user.token.accessToken, forKey: Const.UserDefaultsKey.accessToken) + UserDefaults.standard.set(userData.user.token.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) + } case .requestErr(let message): print("postUserSignUpWithAPI - requestErr: \(message)") diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Splash/SplashViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Splash/SplashViewController.swift index c2452a6f..a84582c9 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Splash/SplashViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Splash/SplashViewController.swift @@ -11,15 +11,24 @@ class SplashViewController: UIViewController { // MARK: - Properties private weak var appDelegate = UIApplication.shared.delegate as? AppDelegate - - // MARK: - @IBOutlet Properties - + let defaults = UserDefaults.standard + // MARK: - View Life Cycle override func viewDidLoad() { super.viewDidLoad() + + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) - // Do any additional setup after loading the view. - // postUserTokenReissue(request: UserTokenReissueRequset(accessToken: UserDefaults.standard.string(forKey: Const.UserDefaults.accessToken)!, refreshToken: UserDefaults.standard.string(forKey: Const.UserDefaults.refreshToken)!)) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) { + if self.appDelegate?.isLogin == true { + self.presentToMain() + } else { + self.presentToLogin() + } + } } // MARK: - Functions @@ -38,25 +47,3 @@ class SplashViewController: UIViewController { } } - -// MARK: - Networks -extension SplashViewController { - - func postUserTokenReissue(request: UserTokenReissueRequset) { - UserAPI.shared.userTokenReissue(request: request) { response in - switch response { - case .success: - print("postUserTokenReissue - Success") - case .requestErr(let message): - print("postUserTokenReissue - requestErr: \(message)") - self.presentToLogin() - case .pathErr: - print("postUserTokenReissue - pathErr") - case .serverErr: - print("postUserTokenReissue - serverErr") - case .networkFail: - print("postUserTokenReissue - networkFail") - } - } - } -} From 97d6fa7a0d4f07eb1e6d106a9c2c9a1eccb39ef3 Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 15:49:53 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[FIX]=20#246=20-=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83,=20=EB=AA=A8=EB=93=A0=20=EB=AA=85=ED=95=A8?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EB=B6=80=EB=B6=84=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NADA-iOS-forRelease/Sources/AppDelegate.swift | 2 ++ .../Sources/ViewControllers/Login/LoginViewController.swift | 4 ---- .../Sources/ViewControllers/More/MoreViewController.swift | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index 64580c03..bca7effe 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -46,6 +46,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.accessToken) UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.refreshToken) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.isKakaoLogin) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.isAppleLogin) } // MARK: UISceneSession Lifecycle diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index 025e35d2..27c97d78 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -72,9 +72,6 @@ class LoginViewController: UIViewController { } // 카카오 로그인 버튼 클릭 시 -// @objc - - @objc func kakaoSignInButtonPress() { // 카카오톡 설치 여부 확인 @@ -204,7 +201,6 @@ extension LoginViewController { UserDefaults.standard.set(userData.user.userID, forKey: Const.UserDefaultsKey.userID) UserDefaults.standard.set(userData.user.token.accessToken, forKey: Const.UserDefaultsKey.accessToken) UserDefaults.standard.set(userData.user.token.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) - } case .requestErr(let message): print("postUserSignUpWithAPI - requestErr: \(message)") diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift index 0288f61d..a2affcbd 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift @@ -112,7 +112,7 @@ extension MoreViewController { self.makeOKAlert(title: "", message: "로그아웃이 완료 되었습니다.") { _ in if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { self.logoutUserWithAPI(token: acToken) - self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) + self.defaults.set(false, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) self.defaults.removeObject(forKey: Const.UserDefaultsKey.darkModeState) let nextVC = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.loginViewController) nextVC.modalPresentationStyle = .overFullScreen @@ -146,7 +146,7 @@ extension MoreViewController { self.makeOKAlert(title: "", message: "모든 명함이 삭제되었습니다.") { _ in if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { self.deleteUserWithAPI(token: acToken) - self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) + self.defaults.set(false, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) self.defaults.removeObject(forKey: Const.UserDefaultsKey.darkModeState) let nextVC = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.loginViewController) nextVC.modalPresentationStyle = .overFullScreen From 51d19d8460138fa32824043ca932b7a42ea7943a Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 15:56:29 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[FIX]=20#246=20-=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=20Service=20Const=20Header=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/NetworkService/Group/GroupService.swift | 4 ++-- .../Sources/NetworkService/User/UserSevice.swift | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift index eda2c321..75964961 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift @@ -96,8 +96,8 @@ extension GroupService: TargetType { return Const.Header.bearerHeader case .groupAdd, .groupEdit, .cardAddInGroup, .changeCardGroup: return Const.Header.bearerHeader - case .groupReset(let token): - return ["Content-Type": "application/json", "Authorization": "Bearer " + token] + case .groupReset: + return Const.Header.basicHeader } } } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift b/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift index 4b64bc8a..1f025ec8 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift @@ -77,10 +77,8 @@ extension UserSevice: TargetType { return Const.Header.bearerHeader case .userSignUp, .userSocialSignUp, .userTokenReissue: return ["Content-Type": "application/json"] - case .userDelete(let token): - return ["Content-Type": "application/json", "Authorization": "Bearer " + token] - case .userLogout(let token): - return ["Content-Type": "application/json", "Authorization": "Bearer " + token] + case .userDelete, .userLogout: + return Const.Header.basicHeader } } } From af444d6afffc754ed215b209d6745d0f9c0bc80d Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 21:09:07 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[FIX]=20#246=20-=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=B5=9C=EC=A2=85=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NADA-iOS-forRelease/Sources/AppDelegate.swift | 106 ++++++------------ .../More/MoreViewController.swift | 6 +- 2 files changed, 41 insertions(+), 71 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index bca7effe..41646cb6 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -19,16 +19,47 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. - removeTokenAtFirstLaunch() KakaoSDKCommon.initSDK(appKey: "5b8dd8cc878344bb7532eeca4365a4aa") - let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) - let rfToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.refreshToken) - if acToken != "" { - postUserTokenReissue(request: UserTokenReissueRequset(accessToken: acToken ?? "", refreshToken: rfToken ?? "")) + if acToken != nil { + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.isAppleLogin) { + // 애플 로그인으로 연동되어 있을 때, -> 애플 ID와의 연동상태 확인 로직 + let appleIDProvider = ASAuthorizationAppleIDProvider() + appleIDProvider.getCredentialState(forUserID: Const.UserDefaultsKey.userID) { (credentialState, error) in + switch credentialState { + case .authorized: + print("해당 ID는 연동되어있습니다.") + self.isLogin = true + case .revoked: + print("해당 ID는 연동되어있지않습니다.") + self.isLogin = false + case .notFound: + print("해당 ID를 찾을 수 없습니다.") + self.isLogin = false + default: + break + } + } + } else { + if AuthApi.hasToken() { // 유효한 토큰 존재 + UserApi.shared.accessTokenInfo { (_, error) in + if let error = error { + if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true { + self.isLogin = false + } + } else { + // 토큰 유효성 체크 성공(필요 시 토큰 갱신됨) + self.isLogin = true + } + } + } else { + // 카카오 토큰 없음 -> 로그인 필요 + self.isLogin = false + } + } } else { - self.isLogin = false + self.isLogin = false // acToken 값이 nil일 때 -> 로그인 뷰로 } // 앱 실행 중 애플 ID 강제로 연결 취소 시 @@ -40,16 +71,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - private func removeTokenAtFirstLaunch() { - guard UserDefaults.isFirstLaunch() else { - return - } - UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.accessToken) - UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.refreshToken) - UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.isKakaoLogin) - UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.isAppleLogin) - } - // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { @@ -63,59 +84,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } - - private func postUserTokenReissue(request: UserTokenReissueRequset) { - UserAPI.shared.userTokenReissue(request: request) { response in - switch response { - case .success: - print("postUserTokenReissue - Success") - if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.isAppleLogin) { - // 애플 로그인으로 연동되어 있을 때, -> 애플 ID와의 연동상태 확인 로직 - let appleIDProvider = ASAuthorizationAppleIDProvider() - appleIDProvider.getCredentialState(forUserID: Const.UserDefaultsKey.userID) { (credentialState, error) in - switch credentialState { - case .authorized: - print("해당 ID는 연동되어있습니다.") - self.isLogin = true - case .revoked: - print("해당 ID는 연동되어있지않습니다.") - self.isLogin = false - case .notFound: - print("해당 ID를 찾을 수 없습니다.") - self.isLogin = false - default: - break - } - } - } else { - if AuthApi.hasToken() { // 유효한 토큰 존재 - UserApi.shared.accessTokenInfo { (_, error) in - if let error = error { - if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true { - self.isLogin = false - } - } else { - // 토큰 유효성 체크 성공(필요 시 토큰 갱신됨) - self.isLogin = true - } - } - } else { - // 카카오 토큰 없음 -> 로그인 필요 - self.isLogin = false - } - } - case .requestErr(let message): - print("postUserTokenReissue - requestErr: \(message)") - self.isLogin = false - case .pathErr: - print("postUserTokenReissue - pathErr") - case .serverErr: - print("postUserTokenReissue - serverErr") - case .networkFail: - print("postUserTokenReissue - networkFail") - } - } - } } extension UserDefaults { diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift index a2affcbd..e54720fc 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift @@ -112,7 +112,8 @@ extension MoreViewController { self.makeOKAlert(title: "", message: "로그아웃이 완료 되었습니다.") { _ in if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { self.logoutUserWithAPI(token: acToken) - self.defaults.set(false, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) + self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) + self.defaults.removeObject(forKey: Const.UserDefaultsKey.refreshToken) self.defaults.removeObject(forKey: Const.UserDefaultsKey.darkModeState) let nextVC = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.loginViewController) nextVC.modalPresentationStyle = .overFullScreen @@ -146,7 +147,8 @@ extension MoreViewController { self.makeOKAlert(title: "", message: "모든 명함이 삭제되었습니다.") { _ in if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { self.deleteUserWithAPI(token: acToken) - self.defaults.set(false, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) + self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) + self.defaults.removeObject(forKey: Const.UserDefaultsKey.refreshToken) self.defaults.removeObject(forKey: Const.UserDefaultsKey.darkModeState) let nextVC = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.loginViewController) nextVC.modalPresentationStyle = .overFullScreen From 60911e48a765fbfb74fb4df81d820b8bd33b9302 Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 21:26:48 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[FIX]=20#246=20-=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=A0=84=ED=99=98=EC=9D=B4=20=EB=90=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0,=20=ED=86=A0=ED=81=B0=EC=97=86=EC=9D=B4=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EB=84=98=EC=96=B4=EA=B0=88=20?= =?UTF-8?q?=EB=95=8C=20=EB=A9=94=EC=9D=B8=20=EB=AA=85=ED=95=A8=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EA=B0=80=20=EB=B9=84=EC=9B=8C=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EC=8A=88=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/Login/LoginViewController.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index 27c97d78..205d1398 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -119,7 +119,6 @@ extension LoginViewController { } } } - self.presentToMain() } } @@ -143,7 +142,6 @@ extension LoginViewController { } } } - self.presentToMain() } } } @@ -177,7 +175,6 @@ extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizatio postUserSignUpWithAPI(request: userIdentifier) UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isAppleLogin) UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isKakaoLogin) - presentToMain() default: break @@ -201,6 +198,7 @@ extension LoginViewController { UserDefaults.standard.set(userData.user.userID, forKey: Const.UserDefaultsKey.userID) UserDefaults.standard.set(userData.user.token.accessToken, forKey: Const.UserDefaultsKey.accessToken) UserDefaults.standard.set(userData.user.token.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) + self.presentToMain() } case .requestErr(let message): print("postUserSignUpWithAPI - requestErr: \(message)") From dae49c198ad9b16d8e56786cd2e4a0bfa5e0cbde Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 21:33:06 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[FIX]=20#246=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20UserDefaults=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resouces/Constants/UserDefaults.swift | 1 - NADA-iOS-forRelease/Sources/AppDelegate.swift | 11 ----------- 2 files changed, 12 deletions(-) diff --git a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift index 0c9f5af8..d83b9442 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift @@ -18,6 +18,5 @@ extension Const { static let firstCardID = "firstCardID" static let isAppleLogin = "isAppleLogin" static let isKakaoLogin = "isKakaoLogin" - static let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag" } } diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index 41646cb6..9997e25b 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -85,14 +85,3 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } } - -extension UserDefaults { - public static func isFirstLaunch() -> Bool { - let isFirstLaunch = !UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) - if isFirstLaunch { - UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.hasBeenLaunchedBeforeFlag) - UserDefaults.standard.synchronize() - } - return isFirstLaunch - } -} From 9326a500ad3967fe7f13f5fa184e8d601c31228b Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 22:56:20 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[FIX]=20#246=20-=20Apple=20ID=20ID=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EA=B0=92=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NADA-iOS-forRelease/Sources/AppDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index 9997e25b..249b5af9 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -26,7 +26,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.isAppleLogin) { // 애플 로그인으로 연동되어 있을 때, -> 애플 ID와의 연동상태 확인 로직 let appleIDProvider = ASAuthorizationAppleIDProvider() - appleIDProvider.getCredentialState(forUserID: Const.UserDefaultsKey.userID) { (credentialState, error) in + appleIDProvider.getCredentialState(forUserID: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "") { (credentialState, error) in switch credentialState { case .authorized: print("해당 ID는 연동되어있습니다.") From b4c1257d1c01fe3bec1c581d1f66197c74c259c3 Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Tue, 28 Dec 2021 23:53:40 +0900 Subject: [PATCH 8/9] =?UTF-8?q?[FIX]=20#253=20-=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=ED=86=A1=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20post=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=20=ED=86=B5=EC=8B=A0=20=EC=8B=9C,=20oauthTok?= =?UTF-8?q?en=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/Login/LoginViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index 205d1398..88d072d1 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -125,18 +125,18 @@ extension LoginViewController { } func loginWithWeb() { - UserApi.shared.loginWithKakaoAccount {(_, error) in + UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in if let error = error { print(error) } else { print("loginWithKakaoAccount() success.") - UserApi.shared.me {(user, error) in + UserApi.shared.me {(_, error) in if let error = error { print(error) } else { - if let email = user?.kakaoAccount?.email { - self.postUserSignUpWithAPI(request: email) + if let token = oauthToken?.accessToken { + self.postUserSignUpWithAPI(request: token) UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isAppleLogin) UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isKakaoLogin) } From 067c53a24e182ee99c37b3a4fdf12919ea3f2f4b Mon Sep 17 00:00:00 2001 From: MinjaeLee <2alswo7@khu.ac.kr> Date: Wed, 29 Dec 2021 10:13:25 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[FIX]=20#253=20-=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20post=ED=86=B5?= =?UTF-8?q?=EC=8B=A0=20=EC=8B=9C,=20=EC=9D=B4=EB=A9=94=EC=9D=BC=EB=8C=80?= =?UTF-8?q?=EC=8B=A0=20=ED=86=A0=ED=81=B0=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/Login/LoginViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index 88d072d1..6009a829 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -102,18 +102,18 @@ class LoginViewController: UIViewController { // MARK: - KakaoSignIn extension LoginViewController { func loginWithApp() { - UserApi.shared.loginWithKakaoTalk {(_, error) in + UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in if let error = error { print(error) } else { print("loginWithKakaoTalk() success.") - UserApi.shared.me {(user, error) in + UserApi.shared.me {(_, error) in if let error = error { print(error) } else { - if let email = user?.kakaoAccount?.email { - self.postUserSignUpWithAPI(request: email) + if let token = oauthToken?.accessToken { + self.postUserSignUpWithAPI(request: token) UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isAppleLogin) UserDefaults.standard.set(true, forKey: Const.UserDefaultsKey.isKakaoLogin) }