diff --git a/HMH_iOS/HMH_iOS.xcodeproj/project.pbxproj b/HMH_iOS/HMH_iOS.xcodeproj/project.pbxproj index d289b45..ad168f3 100644 --- a/HMH_iOS/HMH_iOS.xcodeproj/project.pbxproj +++ b/HMH_iOS/HMH_iOS.xcodeproj/project.pbxproj @@ -12,6 +12,8 @@ 0B000CED2B4D9DA800AEC582 /* ApprovePermisionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B000CEC2B4D9DA800AEC582 /* ApprovePermisionController.swift */; }; 0B000CF12B4DA30F00AEC582 /* AppSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B000CF02B4DA30F00AEC582 /* AppSelectViewController.swift */; }; 0B0035402B43D64D00DA140C /* HMHNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B00353F2B43D64D00DA140C /* HMHNavigationBar.swift */; }; + 0B17D3EB2B5104E000CFA3B7 /* UserManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B17D3EA2B5104E000CFA3B7 /* UserManager.swift */; }; + 0B17D3ED2B5108D200CFA3B7 /* UserDefaultWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B17D3EC2B5108D200CFA3B7 /* UserDefaultWrapper.swift */; }; 0B2C2D3B2B443BE90023CCFA /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2C2D3A2B443BE90023CCFA /* Image.swift */; }; 0B2C2D412B4572240023CCFA /* HMHSelectButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2C2D402B4572240023CCFA /* HMHSelectButton.swift */; }; 0B50F9CB2B369813000C5046 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B50F9CA2B369813000C5046 /* AppDelegate.swift */; }; @@ -61,6 +63,7 @@ 17CF9FC92B4EE964000DD09C /* AppUsingProgressViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CF9FC82B4EE964000DD09C /* AppUsingProgressViewCell.swift */; }; 17CF9FCF2B4F1A91000DD09C /* MyGoalTimeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CF9FCE2B4F1A91000DD09C /* MyGoalTimeCell.swift */; }; 17CF9FD12B4F31C0000DD09C /* BlackHoleImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CF9FD02B4F31C0000DD09C /* BlackHoleImageCell.swift */; }; + 363863BA2B50782E000FE5E7 /* CreateChallengeResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363863B92B50782E000FE5E7 /* CreateChallengeResponseDTO.swift */; }; 363863BD2B5129F2000FE5E7 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 363863BC2B5129F2000FE5E7 /* Lottie */; }; 364923652B4F4FB800BF7ACA /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 364923642B4F4FB800BF7ACA /* Config.swift */; }; 364923682B4F513600BF7ACA /* BaseTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 364923672B4F513600BF7ACA /* BaseTargetType.swift */; }; @@ -179,6 +182,8 @@ 0B000CEC2B4D9DA800AEC582 /* ApprovePermisionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApprovePermisionController.swift; sourceTree = ""; }; 0B000CF02B4DA30F00AEC582 /* AppSelectViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSelectViewController.swift; sourceTree = ""; }; 0B00353F2B43D64D00DA140C /* HMHNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMHNavigationBar.swift; sourceTree = ""; }; + 0B17D3EA2B5104E000CFA3B7 /* UserManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserManager.swift; sourceTree = ""; }; + 0B17D3EC2B5108D200CFA3B7 /* UserDefaultWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultWrapper.swift; sourceTree = ""; }; 0B2C2D3A2B443BE90023CCFA /* Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; 0B2C2D402B4572240023CCFA /* HMHSelectButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMHSelectButton.swift; sourceTree = ""; }; 0B50F9C72B369813000C5046 /* HMH_iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HMH_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -230,6 +235,7 @@ 17CF9FC82B4EE964000DD09C /* AppUsingProgressViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppUsingProgressViewCell.swift; sourceTree = ""; }; 17CF9FCE2B4F1A91000DD09C /* MyGoalTimeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyGoalTimeCell.swift; sourceTree = ""; }; 17CF9FD02B4F31C0000DD09C /* BlackHoleImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlackHoleImageCell.swift; sourceTree = ""; }; + 363863B92B50782E000FE5E7 /* CreateChallengeResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateChallengeResponseDTO.swift; sourceTree = ""; }; 364923612B4F4E7D00BF7ACA /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 364923642B4F4FB800BF7ACA /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; 364923672B4F513600BF7ACA /* BaseTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTargetType.swift; sourceTree = ""; }; @@ -343,6 +349,15 @@ path = ViewControllers; sourceTree = ""; }; + 0B17D3E92B5104B900CFA3B7 /* User */ = { + isa = PBXGroup; + children = ( + 0B17D3EA2B5104E000CFA3B7 /* UserManager.swift */, + 0B17D3EC2B5108D200CFA3B7 /* UserDefaultWrapper.swift */, + ); + path = User; + sourceTree = ""; + }; 0B2C2D3C2B4559AE0023CCFA /* Onboarding */ = { isa = PBXGroup; children = ( @@ -494,6 +509,7 @@ 0B8A89982B369CF800688BA6 /* SupportingFiles */ = { isa = PBXGroup; children = ( + 0B17D3E92B5104B900CFA3B7 /* User */, 3666C8782B45F4D900564874 /* AppBlock */, 0B8A89992B369D0B00688BA6 /* Base */, ); @@ -829,6 +845,7 @@ isa = PBXGroup; children = ( 3649239F2B505F2000BF7ACA /* CreateChallengeRequestDTO.swift */, + 363863B92B50782E000FE5E7 /* CreateChallengeResponseDTO.swift */, ); path = ChallengeModel; sourceTree = ""; @@ -1088,6 +1105,7 @@ 0B8A89AF2B369E4300688BA6 /* HomeModel.swift in Sources */, 3666C89F2B485C8F00564874 /* DateCollectionViewCell.swift in Sources */, 3666C87A2B45F4F900564874 /* SelectedBlocker.swift in Sources */, + 0B17D3ED2B5108D200CFA3B7 /* UserDefaultWrapper.swift in Sources */, 0BC0EBD42B494459003EF5D4 /* OnboardingSwipeView.swift in Sources */, 17314F9B2B4C485B0089A551 /* UserPointHeaderView.swift in Sources */, 364923862B4FDCBD00BF7ACA /* NetworkProvider.swift in Sources */, @@ -1102,6 +1120,7 @@ 174AF4942B447B5500450D07 /* MyPageViewController.swift in Sources */, 0BA193B42B4D089C007E3F9C /* TimeSurveyViewController.swift in Sources */, 36A3D9B82B3EBC3B007EA272 /* UILabel+.swift in Sources */, + 0B17D3EB2B5104E000CFA3B7 /* UserManager.swift in Sources */, 0B50F9CB2B369813000C5046 /* AppDelegate.swift in Sources */, 0B7817522B4BE0280078E925 /* ProgressBarManager.swift in Sources */, 0B8A89C42B369FA000688BA6 /* F.swift in Sources */, @@ -1165,6 +1184,7 @@ 3666C89B2B48516500564874 /* ChallengeView.swift in Sources */, 364923682B4F513600BF7ACA /* BaseTargetType.swift in Sources */, 3666C88D2B471B1D00564874 /* UIImage+.swift in Sources */, + 363863BA2B50782E000FE5E7 /* CreateChallengeResponseDTO.swift in Sources */, 3666C87C2B45F50F00564874 /* BlockingApplicationModel.swift in Sources */, 0B0035402B43D64D00DA140C /* HMHNavigationBar.swift in Sources */, 0BA193B22B4CE908007E3F9C /* SurveyView.swift in Sources */, diff --git a/HMH_iOS/HMH_iOS/Application/SceneDelegate.swift b/HMH_iOS/HMH_iOS/Application/SceneDelegate.swift index 1c5370a..628fc9e 100644 --- a/HMH_iOS/HMH_iOS/Application/SceneDelegate.swift +++ b/HMH_iOS/HMH_iOS/Application/SceneDelegate.swift @@ -6,11 +6,27 @@ // import UIKit +import AuthenticationServices class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - + + func sceneDidBecomeActive(_ scene: UIScene) { + let appleIDProvider = ASAuthorizationAppleIDProvider() + appleIDProvider.getCredentialState(forUserID: "000340.8d411a5d11d84e8da0c22ef43dce465a.1657" ?? "") { (credentialState, error) in + switch credentialState { + case .authorized: + print("authorized") + case .revoked: + print("revoked") + case .notFound: + print("notFound") + default: + break + } + } + } func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } @@ -24,7 +40,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { DispatchQueue.main.asyncAfter(deadline: .now() + 2) { DispatchQueue.main.async{ - showTabBarViewController() + if UserManager.shared.hasAccessToken { + //애플 로그인 토큰 리프레쉬 로직. 성공한다면 엑세스와 리프레시 토큰 업데이트 그러면서 이동 + // 토큰 리프레시가 실패 한다. 로그인 컨트롤러로 바로 이동. + showTabBarViewController() + } else { + showLoginViewController() + } } } diff --git a/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserDefaultWrapper.swift b/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserDefaultWrapper.swift new file mode 100644 index 0000000..6fdfc75 --- /dev/null +++ b/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserDefaultWrapper.swift @@ -0,0 +1,29 @@ +// +// UserDefaultWrapper.swift +// HMH_iOS +// +// Created by Seonwoo Kim on 1/12/24. +// + +import Foundation + +@propertyWrapper +struct UserDefaultWrapper { + var wrappedValue: T? { + get { + return UserDefaults.standard.object(forKey: self.key) as? T + } + + set { + if newValue == nil { + UserDefaults.standard.removeObject(forKey: key) + } else { UserDefaults.standard.setValue(newValue, forKey: key) } + } + } + + private let key: String + + init(key: String) { + self.key = key + } +} diff --git a/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserManager.swift b/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserManager.swift new file mode 100644 index 0000000..2db9ca3 --- /dev/null +++ b/HMH_iOS/HMH_iOS/Global/SupportingFiles/User/UserManager.swift @@ -0,0 +1,90 @@ +// +// UserManager.swift +// HMH_iOS +// +// Created by Seonwoo Kim on 1/12/24. +// + +import Foundation + +final class UserManager { + static let shared = UserManager() + + @UserDefaultWrapper(key: "accessToken") private(set) var accessToken + @UserDefaultWrapper(key: "refreshToken") private(set) var refreshToken + @UserDefaultWrapper(key: "AppleToken") private(set) var appleToken + @UserDefaultWrapper(key: "userIdentifier") private(set) var appleUserIdentifier + @UserDefaultWrapper(key: "familyName") private(set) var familyName + @UserDefaultWrapper(key: "givenName") private(set) var givenName + @UserDefaultWrapper(key: "fullName") private(set) var fullName + @UserDefaultWrapper(key: "userId") private(set) var userId + + var hasAccessToken: Bool { return self.accessToken != nil } + var getAccessToken: String { return self.accessToken ?? "" } + var getRefreshToken: String { return self.refreshToken ?? "" } + var getAppleToken: String { return self.appleToken ?? "" } + var getUserIdentifier: String { return self.appleUserIdentifier ?? "" } + var getUserName: String { return self.familyName ?? "" } + var getGivenName: String { return self.givenName ?? "" } + var getFullName: String { return self.fullName ?? "" } + var getUserId: Int { return self.userId ?? 0} + + var haveFullName: Bool { + if fullName == "" { + return false + } else if fullName == nil { + return false + } else { + return true + } + } + + private init() {} +} + +extension UserManager { + func updateToken(_ accessToken: String, _ refreshToken: String) { + self.accessToken = accessToken + self.refreshToken = refreshToken + } + + func updateAppleToken(_ appleToken: String) { + self.appleToken = appleToken + } + + func updateUserIdentifier(_ appleUserIdentifier: String) { + self.appleUserIdentifier = appleUserIdentifier + } + + func updateUserName(_ givenName: String, _ familyName: String) { + self.givenName = givenName + self.familyName = familyName + self.fullName = familyName + givenName + } + + func updateUserId(_ userId: Int) { + self.userId = userId + } + + func setUserIdForApple(userId: String) { + self.appleUserIdentifier = appleUserIdentifier + } + + func clearAll() { + self.accessToken = nil + self.refreshToken = nil + self.appleToken = nil + self.appleUserIdentifier = nil + self.familyName = nil + self.givenName = nil + self.fullName = nil + self.userId = nil + } + + func clearData() { + self.accessToken = nil + self.refreshToken = nil + self.appleToken = nil + self.appleUserIdentifier = nil + } +} diff --git a/HMH_iOS/HMH_iOS/HMH_iOS.entitlements b/HMH_iOS/HMH_iOS/HMH_iOS.entitlements index e048c21..92f5bd8 100644 --- a/HMH_iOS/HMH_iOS/HMH_iOS.entitlements +++ b/HMH_iOS/HMH_iOS/HMH_iOS.entitlements @@ -2,6 +2,10 @@ + com.apple.developer.applesignin + + Default + com.apple.developer.family-controls diff --git a/HMH_iOS/HMH_iOS/Info.plist b/HMH_iOS/HMH_iOS/Info.plist index 1c20cb8..9fcb576 100644 --- a/HMH_iOS/HMH_iOS/Info.plist +++ b/HMH_iOS/HMH_iOS/Info.plist @@ -33,5 +33,10 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + diff --git a/HMH_iOS/HMH_iOS/Network/Base/AuthInterceptor.swift b/HMH_iOS/HMH_iOS/Network/Base/AuthInterceptor.swift index 089f3e2..bfb3da4 100644 --- a/HMH_iOS/HMH_iOS/Network/Base/AuthInterceptor.swift +++ b/HMH_iOS/HMH_iOS/Network/Base/AuthInterceptor.swift @@ -21,5 +21,6 @@ final class AuthInterceptor: RequestInterceptor { } func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + print("retry") } } diff --git a/HMH_iOS/HMH_iOS/Network/Base/BaseModel.swift b/HMH_iOS/HMH_iOS/Network/Base/BaseModel.swift index 2fd4689..399fd3d 100644 --- a/HMH_iOS/HMH_iOS/Network/Base/BaseModel.swift +++ b/HMH_iOS/HMH_iOS/Network/Base/BaseModel.swift @@ -12,4 +12,3 @@ struct BaseResponse: Decodable { var message: String? var data: T? } - diff --git a/HMH_iOS/HMH_iOS/Network/Base/BaseTargetType.swift b/HMH_iOS/HMH_iOS/Network/Base/BaseTargetType.swift index 69b3c50..eb0b5cc 100644 --- a/HMH_iOS/HMH_iOS/Network/Base/BaseTargetType.swift +++ b/HMH_iOS/HMH_iOS/Network/Base/BaseTargetType.swift @@ -8,8 +8,6 @@ import Foundation import Moya - - protocol BaseTargetType: TargetType {} typealias Parameters = [String: String] @@ -32,7 +30,4 @@ extension BaseTargetType { return Data() } - var validationType: ValidationType { - return .successCodes - } } diff --git a/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeRequestDTO.swift b/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeRequestDTO.swift index 498edae..5086216 100644 --- a/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeRequestDTO.swift +++ b/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeRequestDTO.swift @@ -7,6 +7,12 @@ import Foundation -class CreateChallengeRequestDTO: Request { - +struct CreateChallengeRequestDTO: Codable { + let period, goalTime: Int + let apps: [App] +} + +struct App: Codable { + let appCode: String + let appGoalTime: Int } diff --git a/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeResponseDTO.swift b/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeResponseDTO.swift new file mode 100644 index 0000000..e510752 --- /dev/null +++ b/HMH_iOS/HMH_iOS/Network/DTO/ChallengeModel/CreateChallengeResponseDTO.swift @@ -0,0 +1,17 @@ +// +// CreateChallengeResponseDTO.swift +// HMH_iOS +// +// Created by 지희의 MAC on 1/12/24. +// + +import Foundation + +struct CreateChallengeResponseDTO: Codable { + let challengeID: Int + + enum CodingKeys: String, CodingKey { + case challengeID = "challengeId" + + } +} diff --git a/HMH_iOS/HMH_iOS/Network/Foundation/APIConstants.swift b/HMH_iOS/HMH_iOS/Network/Foundation/APIConstants.swift index 7b66696..6545e11 100644 --- a/HMH_iOS/HMH_iOS/Network/Foundation/APIConstants.swift +++ b/HMH_iOS/HMH_iOS/Network/Foundation/APIConstants.swift @@ -12,15 +12,15 @@ struct APIConstants{ static let contentType = "Content-Type" static let applicationJSON = "application/json" static let auth = "Authorization" - static let accessToken = "" // TO-DO: AccessToken - static let appleAccessToken = "" + static let accessToken = "Bearer " // TO-DO: AccessToken + static let appleAccessToken = "" static let OS = "OS" static let iOS = "iOS" } extension APIConstants{ static let hasSocialTokenHeader = [contentType: applicationJSON, - auth : accessToken] + auth : appleAccessToken] static let hasTokenHeader = [contentType: applicationJSON, OS: iOS, auth : accessToken] diff --git a/HMH_iOS/HMH_iOS/Network/Foundation/NetworkHelper.swift b/HMH_iOS/HMH_iOS/Network/Foundation/NetworkHelper.swift index 010014e..30c119e 100644 --- a/HMH_iOS/HMH_iOS/Network/Foundation/NetworkHelper.swift +++ b/HMH_iOS/HMH_iOS/Network/Foundation/NetworkHelper.swift @@ -35,4 +35,5 @@ struct NetworkHelper { default: return .networkFail } } + } diff --git a/HMH_iOS/HMH_iOS/Network/Foundation/NetworkRequest.swift b/HMH_iOS/HMH_iOS/Network/Foundation/NetworkRequest.swift index 18325c4..db9907b 100644 --- a/HMH_iOS/HMH_iOS/Network/Foundation/NetworkRequest.swift +++ b/HMH_iOS/HMH_iOS/Network/Foundation/NetworkRequest.swift @@ -8,29 +8,27 @@ import Foundation import Moya -struct NetworkRequest { - let url: String - let httpMethod: Moya.Method - let body: Data? // optional - let headers: [String: String]? // optional - - init(url: String, - httpMethod: Moya.Method, - requestBody: Data? = nil, - headers: [String: String]? = nil - ) { - self.url = url - self.httpMethod = httpMethod - self.body = requestBody - self.headers = headers +struct ResponseData { + struct CommonResponse: Codable { + let result: Model } - - func createURLRequest(with url: URL) -> URLRequest { - var urlRequest = URLRequest(url: url) - urlRequest.httpMethod = httpMethod.rawValue - urlRequest.httpBody = body - urlRequest.allHTTPHeaderFields = headers ?? [:] - return urlRequest + + static func processResponse(_ result: Result) -> Result { + switch result { + case .success(let response): + do { + // status code가 200...299인 경우만 success로 체크 (아니면 예외발생) + _ = try response.filterSuccessfulStatusCodes() + + let commonResponse = try JSONDecoder().decode(CommonResponse.self, from: response.data) + return .success(commonResponse.result) + } catch { + return .failure(error) + } + + case .failure(let error): + return .failure(error) + } } + } - diff --git a/HMH_iOS/HMH_iOS/Network/Router/ChallengeRouter.swift b/HMH_iOS/HMH_iOS/Network/Router/ChallengeRouter.swift index 5487f2a..91bc27d 100644 --- a/HMH_iOS/HMH_iOS/Network/Router/ChallengeRouter.swift +++ b/HMH_iOS/HMH_iOS/Network/Router/ChallengeRouter.swift @@ -10,10 +10,17 @@ import Foundation import Moya enum ChallengeRouter { - case createChallenge + case createChallenge(data: CreateChallengeRequestDTO) } extension ChallengeRouter: BaseTargetType { + private var headers: Parameters { + switch self { + case .createChallenge: + return APIConstants.hasTokenHeader + } + } + var path: String { switch self { case .createChallenge: @@ -30,9 +37,8 @@ extension ChallengeRouter: BaseTargetType { var task: Moya.Task { switch self { - case .createChallenge: - return .requestPlain // 추후 변경 완료 + case .createChallenge(let data): + return .requestJSONEncodable(data) } } } - diff --git a/HMH_iOS/HMH_iOS/Network/Service/Providers.swift b/HMH_iOS/HMH_iOS/Network/Service/Providers.swift index 5c7447b..d0cccc9 100644 --- a/HMH_iOS/HMH_iOS/Network/Service/Providers.swift +++ b/HMH_iOS/HMH_iOS/Network/Service/Providers.swift @@ -9,10 +9,10 @@ import Foundation import Moya struct Providers { - static let departureSearchingProvider = MoyaProvider(withAuth: false) + static let challengeProvider = NetworkProvider(withAuth: false) } -extension MoyaProvider { +extension NetworkProvider { convenience init(withAuth: Bool) { if withAuth { self.init(session: Session(interceptor: AuthInterceptor.shared), diff --git a/HMH_iOS/HMH_iOS/Network/Service/WeatherTarget.swift b/HMH_iOS/HMH_iOS/Network/Service/WeatherTarget.swift deleted file mode 100644 index cd7aba1..0000000 --- a/HMH_iOS/HMH_iOS/Network/Service/WeatherTarget.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// WheatherProvider.swift -// HMH_iOS -// -// Created by 지희의 MAC on 1/11/24. -// - -import Foundation -import Moya - -enum WeatherTarget { - case getWeather(WeatherRequestDTO) -} - -extension WeatherTarget: BaseTargetType { - var method: Moya.Method { - switch self { - case .getWeather: - return .get - } - } - - var path: String { - switch self { - case .getWeather: return "weather" - } - } - - var task: Task { - switch self { - case .getWeather(WeatherRequestDTO(q: "")) - return .requestPlain - } - } -} - - - - -struct APIManager { - - private let provider = MoyaProvider() - - let customEndpointClosure = { (target : WeatherTarget) -> Endpoint in - - return Endpoint(url: URL(target: target).absoluteString, sampleResponseClosure: {.networkResponse(400, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) - - } - let weatherRequest = WeatherRequestDTO(q: "Seoul") - private var testingProvider : MoyaProvider? - - init(){ - - testingProvider = .init(endpointClosure: customEndpointClosure,stubClosure: MoyaProvider.immediatelyStub) - - } - - func weather(request: WeatherRequestDTO, completion : @escaping ([WeatherDTO]) -> () , failure : @escaping (String) -> ()){ - - provider.request(.getWeather(request), completion: { result in - switch result { - case let .success(response) : - do { - let weathermodel = try JSONDecoder().decode([WeatherDTO].self, from: response.data) - - completion(weathermodel) - } - catch let error{ - failure(error.localizedDescription) - } - - case let .failure(error): - failure(error.localizedDescription) - } - - }) - } - -} diff --git a/HMH_iOS/HMH_iOS/Presentation/Login/ViewControllers/LoginViewController.swift b/HMH_iOS/HMH_iOS/Presentation/Login/ViewControllers/LoginViewController.swift index da57696..3189ce7 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Login/ViewControllers/LoginViewController.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Login/ViewControllers/LoginViewController.swift @@ -12,11 +12,13 @@ import Then import AuthenticationServices final class LoginViewController: UIViewController { + + private let swipeView = OnboardingSwipeView() let authorizationButton = ASAuthorizationAppleIDButton(authorizationButtonType: .signIn, authorizationButtonStyle: .white) - let swipeView = OnboardingSwipeView() override func viewDidLoad() { super.viewDidLoad() + setAppleLoginButton() setUI() } @@ -43,11 +45,76 @@ final class LoginViewController: UIViewController { $0.height.equalTo(480) } } +} + +extension LoginViewController { - private func setAppleLoginButton() { + func setAppleLoginButton() { + authorizationButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside) self.view.addSubview(authorizationButton) authorizationButton.translatesAutoresizingMaskIntoConstraints = false } + + @objc + func handleAuthorizationAppleIDButtonPress() { + let appleIDProvider = ASAuthorizationAppleIDProvider() + let request = appleIDProvider.createRequest() + request.requestedScopes = [.fullName] + let authorizationController = ASAuthorizationController(authorizationRequests: [request]) + authorizationController.delegate = self + authorizationController.presentationContextProvider = self + authorizationController.performRequests() + } +} + +extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding{ + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + return self.view.window! + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + //로그인 성공 + switch authorization.credential { + case let appleIDCredential as ASAuthorizationAppleIDCredential: + let userIdentifier = appleIDCredential.user + let fullName = appleIDCredential.fullName + + if let authorizationCode = appleIDCredential.authorizationCode, + let identityToken = appleIDCredential.identityToken, + let authCodeString = String(data: authorizationCode, encoding: .utf8), + let identifyTokenString = String(data: identityToken, encoding: .utf8) { + if let unwrappedFullName = fullName, let givenName = unwrappedFullName.givenName, let familyName = unwrappedFullName.familyName { + UserManager.shared.updateUserName(givenName, familyName) + } else { + print("fullName이 없거나 givenName 또는 familyName이 없습니다.") + } + UserManager.shared.updateUserIdentifier(userIdentifier) + } + + // 로그인이 성공 한다면 + // 소셜 로그인 API 쏘기 403 -> 온보딩 뷰로 이동 + // 회원 가입이 필요한지 아닌지 확인, userId가 있는지 없는지 판별 + // 유저 메니저와 signInModel에 해당 값 저장 + + print(UserManager.shared.getUserIdentifier) + print(UserManager.shared.getUserName) + if (UserManager.shared.appleUserIdentifier != nil) { + let nextViewController = TabBarController() + self.navigationController?.pushViewController(nextViewController, animated: true) + } else { + let nextViewController = TimeSurveyViewController() + self.navigationController?.pushViewController(nextViewController, animated: true) + } + + default: + break + } + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { + // 로그인 실패(유저의 취소도 포함) + print("login failed - \(error.localizedDescription)") + } } diff --git a/HMH_iOS/HMH_iOS/Presentation/Onboarding/Models/SignInModel.swift b/HMH_iOS/HMH_iOS/Presentation/Onboarding/Models/SignInModel.swift index 05871b7..d5d1095 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Onboarding/Models/SignInModel.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Onboarding/Models/SignInModel.swift @@ -5,26 +5,26 @@ // Created by Seonwoo Kim on 1/9/24. // -import Foundation - -struct SignInModel { - let socialPlatform: String - let onboarding: Onboarding - let challenge: Challenge -} - -struct Onboarding { - let averageUseTime: String - let problem: [String] -} - -struct Challenge { - let period: Int - let goalTime: Int - let apps: [Apps] -} - -struct Apps { - let appCode: String - let goalTime: Int -} +//import Foundation +// +//struct SignInModel { +// let socialPlatform: String +// let onboarding: Onboarding +// let challenge: Challenge +//} +// +//struct Onboarding { +// let averageUseTime: String +// let problem: [String] +//} +// +//struct Challenge { +// let period: Int +// let goalTime: Int +// let apps: [Apps] +//} +// +//struct Apps { +// let appCode: String +// let goalTime: Int +//} diff --git a/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewControllers/OnboardingBaseViewControllers.swift b/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewControllers/OnboardingBaseViewControllers.swift index 28ced65..8eeb110 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewControllers/OnboardingBaseViewControllers.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewControllers/OnboardingBaseViewControllers.swift @@ -89,7 +89,6 @@ class OnboardingBaseViewController: UIViewController { subTitleLabel.snp.makeConstraints { $0.top.equalTo(mainTitleLabel.snp.bottom).offset(7.adjusted) $0.leading.equalTo(progressBar) - } }