From 5065f384023637d08ecdc2da9b1482bae836cc55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=B1=84=EB=AF=BC?= Date: Thu, 19 Sep 2024 15:39:14 +0900 Subject: [PATCH] Chaemin2001/social login (#309) * Enable Google Login * Update Info.plist * Update Icons * Enable Kakao Login * Update UI * Resolve Package Dependencies * Resolve Kakao Login Error * Delete Unnecessary Buttons * Resolve Missing Url Scheme * Apply SwiftFormat changes * Change Facbook Icon Name * Change Login Button Style * Resolve Package * Revert "Resolve Package" This reverts commit 145a108d930b1b30886e1044fd72fd4f83864287. * Resolve Packages * Revert "Resolve Packages" This reverts commit 0374da66db3ef0c0b49e5ce07deabfd265a15d68. * Fix package version issue * Change Font Style * Add All Possible Errors * Apply SwiftFormat changes * Delete 1x icons * Update Error Message * Improve error handling for social login * Apply SwiftFormat changes --------- Co-authored-by: chaemin2001 Co-authored-by: peng-u-0807 --- SNUTT-2022/SNUTT.xcodeproj/project.pbxproj | 77 +++++++++++++ .../xcshareddata/swiftpm/Package.resolved | 46 +++++++- .../Icons/apple.imageset/Contents.json | 56 ---------- .../apple-logo-svgrepo-com 1.svg | 1 - .../apple-logo-svgrepo-com 2.svg | 1 - .../apple-logo-svgrepo-com-light 1.svg | 1 - .../apple-logo-svgrepo-com-light 2.svg | 1 - .../apple-logo-svgrepo-com-light.svg | 1 - .../apple.imageset/apple-logo-svgrepo-com.svg | 1 - .../Icons/facebook.imageset/facebook 1.svg | 1 - .../Icons/facebook.imageset/facebook 2.svg | 1 - .../Icons/facebook.imageset/facebook.svg | 1 - .../Contents.json | 5 +- .../appleid_button@2x 1@2x.png | Bin 0 -> 2578 bytes .../appleid_button@2x 1@3x.png | Bin 0 -> 4067 bytes .../Icons/sns.facebook.imageset/Contents.json | 22 ++++ .../sns.facebook.imageset/sns.facebook.2x.png | Bin 0 -> 2871 bytes .../sns.facebook.imageset/sns.facebook.3x.png | Bin 0 -> 4374 bytes .../Icons/sns.google.imageset/Contents.json | 22 ++++ .../sns.google.imageset/Frame 202@2x.png | Bin 0 -> 4399 bytes .../sns.google.imageset/Frame 202@3x.png | Bin 0 -> 7026 bytes .../Icons/sns.kakao.imageset/Contents.json | 22 ++++ .../kakao_login_small 1@2x.png | Bin 0 -> 3265 bytes .../kakao_login_small 1@3x.png | Bin 0 -> 5324 bytes SNUTT-2022/SNUTT/Extensions/GoogleLogin.swift | 49 +++++++++ SNUTT-2022/SNUTT/Extensions/KakaoLogin.swift | 60 ++++++++++ SNUTT-2022/SNUTT/Info.plist | 28 ++++- SNUTT-2022/SNUTT/Models/ErrorCode.swift | 13 ++- .../SNUTT/Repositories/AuthRepository.swift | 22 +++- .../SNUTT/Repositories/Dto/ErrorDto.swift | 2 + .../SNUTT/Repositories/NetworkUtils.swift | 4 +- .../Repositories/Router/AuthRouter.swift | 29 ++++- SNUTT-2022/SNUTT/Services/AuthService.swift | 24 +++- .../ViewModels/AccountSettingViewModel.swift | 18 --- .../IntegrateAccountViewModel.swift | 39 +++++++ .../SNUTT/ViewModels/OnboardViewModel.swift | 48 +++++++- SNUTT-2022/SNUTT/Views/SNUTTApp.swift | 7 ++ .../SNUTT/Views/Scenes/OnboardScene.swift | 104 ++++++++++-------- .../Scenes/Settings/AccountSettingScene.swift | 26 +---- .../Settings/IntegrateAccountScene.swift | 46 ++++++++ 40 files changed, 593 insertions(+), 185 deletions(-) delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/Contents.json delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 1.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 2.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 1.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 2.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 1.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 2.svg delete mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook.svg rename SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/{facebook.imageset => sns.apple.imageset}/Contents.json (71%) create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/appleid_button@2x 1@2x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/appleid_button@2x 1@3x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/Contents.json create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.2x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.3x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Contents.json create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@2x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@3x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/Contents.json create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@2x.png create mode 100644 SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@3x.png create mode 100644 SNUTT-2022/SNUTT/Extensions/GoogleLogin.swift create mode 100644 SNUTT-2022/SNUTT/Extensions/KakaoLogin.swift create mode 100644 SNUTT-2022/SNUTT/ViewModels/IntegrateAccountViewModel.swift create mode 100644 SNUTT-2022/SNUTT/Views/Scenes/Settings/IntegrateAccountScene.swift diff --git a/SNUTT-2022/SNUTT.xcodeproj/project.pbxproj b/SNUTT-2022/SNUTT.xcodeproj/project.pbxproj index a5bff4267..ab9102971 100644 --- a/SNUTT-2022/SNUTT.xcodeproj/project.pbxproj +++ b/SNUTT-2022/SNUTT.xcodeproj/project.pbxproj @@ -7,10 +7,17 @@ objects = { /* Begin PBXBuildFile section */ + 731C244E2C4442590015877B /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 731C244D2C4442590015877B /* KakaoSDK */; }; + 731C24502C4442590015877B /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 731C244F2C4442590015877B /* KakaoSDKAuth */; }; + 731C24522C4442590015877B /* KakaoSDKCommon in Frameworks */ = {isa = PBXBuildFile; productRef = 731C24512C4442590015877B /* KakaoSDKCommon */; }; 731D9FFD297BC5060027BA25 /* Bookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731D9FFC297BC5060027BA25 /* Bookmark.swift */; }; 731DA001297BC54B0027BA25 /* BookmarkDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731DA000297BC54B0027BA25 /* BookmarkDto.swift */; }; 731DA003297BC5740027BA25 /* BookmarkRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731DA002297BC5740027BA25 /* BookmarkRouter.swift */; }; 731DA005297BC8990027BA25 /* BookmarkScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731DA004297BC8990027BA25 /* BookmarkScene.swift */; }; + 734A831F2C2FD41200D6CB95 /* KakaoLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 734A831E2C2FD41200D6CB95 /* KakaoLogin.swift */; }; + 736AF84C2C2F275E00ED9C1A /* GoogleLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736AF84B2C2F275E00ED9C1A /* GoogleLogin.swift */; }; + 736AF84F2C2F279900ED9C1A /* GoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = 736AF84E2C2F279900ED9C1A /* GoogleSignIn */; }; + 736AF8512C2F279900ED9C1A /* GoogleSignInSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 736AF8502C2F279900ED9C1A /* GoogleSignInSwift */; }; 738406EE2B57107C00007E62 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406ED2B57107C00007E62 /* Theme.swift */; }; 738406F12B5710C200007E62 /* ThemeDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406F02B5710C200007E62 /* ThemeDto.swift */; }; 738406F32B57119100007E62 /* ThemeRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406F22B57119100007E62 /* ThemeRepository.swift */; }; @@ -26,6 +33,8 @@ 738407082B579F9200007E62 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406ED2B57107C00007E62 /* Theme.swift */; }; 738407092B57B10000007E62 /* ThemeDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406F02B5710C200007E62 /* ThemeDto.swift */; }; 738407102B6060F800007E62 /* ThemeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738406F82B57154400007E62 /* ThemeState.swift */; }; + 73AB84D22C35128B0075DE83 /* IntegrateAccountScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73AB84D12C35128B0075DE83 /* IntegrateAccountScene.swift */; }; + 73AB84D42C3514080075DE83 /* IntegrateAccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73AB84D32C3514080075DE83 /* IntegrateAccountViewModel.swift */; }; B800A38B2B76132C008E8D84 /* SearchTimeMaskDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = B800A38A2B76132C008E8D84 /* SearchTimeMaskDto.swift */; }; B800A38C2B77BD78008E8D84 /* SearchTimeMaskDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = B800A38A2B76132C008E8D84 /* SearchTimeMaskDto.swift */; }; B82EA54C2B62C8490029FDF3 /* LectureMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B82EA54B2B62C8490029FDF3 /* LectureMapView.swift */; }; @@ -344,6 +353,8 @@ 731DA000297BC54B0027BA25 /* BookmarkDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkDto.swift; sourceTree = ""; }; 731DA002297BC5740027BA25 /* BookmarkRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkRouter.swift; sourceTree = ""; }; 731DA004297BC8990027BA25 /* BookmarkScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkScene.swift; sourceTree = ""; }; + 734A831E2C2FD41200D6CB95 /* KakaoLogin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoLogin.swift; sourceTree = ""; }; + 736AF84B2C2F275E00ED9C1A /* GoogleLogin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleLogin.swift; sourceTree = ""; }; 738406ED2B57107C00007E62 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 738406F02B5710C200007E62 /* ThemeDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeDto.swift; sourceTree = ""; }; 738406F22B57119100007E62 /* ThemeRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeRepository.swift; sourceTree = ""; }; @@ -356,6 +367,8 @@ 738407002B571D8E00007E62 /* ThemeIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeIcon.swift; sourceTree = ""; }; 738407022B571E6200007E62 /* ThemeBottomSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeBottomSheet.swift; sourceTree = ""; }; 738407042B577E9000007E62 /* ThemeDetailScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeDetailScene.swift; sourceTree = ""; }; + 73AB84D12C35128B0075DE83 /* IntegrateAccountScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrateAccountScene.swift; sourceTree = ""; }; + 73AB84D32C3514080075DE83 /* IntegrateAccountViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrateAccountViewModel.swift; sourceTree = ""; }; B800A38A2B76132C008E8D84 /* SearchTimeMaskDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTimeMaskDto.swift; sourceTree = ""; }; B82EA54B2B62C8490029FDF3 /* LectureMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LectureMapView.swift; sourceTree = ""; }; B82EA54D2B6393190029FDF3 /* KakaoMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoMapView.swift; sourceTree = ""; }; @@ -616,14 +629,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 731C24522C4442590015877B /* KakaoSDKCommon in Frameworks */, BE4CD86728F5A56200BA9BBC /* FirebaseMessaging in Frameworks */, + 731C244E2C4442590015877B /* KakaoSDK in Frameworks */, B8B7501D2B6274A5004F6272 /* KakaoMapsSDK_SPM in Frameworks */, BE4CD86328F5A56200BA9BBC /* FirebaseAnalyticsSwift in Frameworks */, BE779B1828E3DD5B009960EB /* FacebookLogin in Frameworks */, CEF992F72BF3B8FC00F0FFA4 /* ReactNativeKit in Frameworks */, + 736AF8512C2F279900ED9C1A /* GoogleSignInSwift in Frameworks */, BE4CD86528F5A56200BA9BBC /* FirebaseCrashlytics in Frameworks */, BEDE34D42879A59B00525014 /* Alamofire in Frameworks */, BE4CD86128F5A56200BA9BBC /* FirebaseAnalytics in Frameworks */, + 736AF84F2C2F279900ED9C1A /* GoogleSignIn in Frameworks */, + 731C24502C4442590015877B /* KakaoSDKAuth in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -670,6 +688,7 @@ BE9C90EC2948F4BE00003AA6 /* ColorSchemeSettingScene.swift */, B8F40EAC28980D840021A2A9 /* TimetableSettingScene.swift */, 738406FA2B57173400007E62 /* ThemeSettingScene.swift */, + 73AB84D12C35128B0075DE83 /* IntegrateAccountScene.swift */, ); path = Settings; sourceTree = ""; @@ -719,6 +738,8 @@ BE9C90EA2948EA1800003AA6 /* ColorScheme.swift */, CE3F37AC29C5D452009EDCCC /* Collection+Getter.swift */, B8F0B22F2A4B27A500A2E15E /* UIDevice+Ext.swift */, + 736AF84B2C2F275E00ED9C1A /* GoogleLogin.swift */, + 734A831E2C2FD41200D6CB95 /* KakaoLogin.swift */, ); path = Extensions; sourceTree = ""; @@ -1139,6 +1160,7 @@ BED04D3428EA966100937E4C /* OnboardViewModel.swift */, 738406FC2B57179100007E62 /* ThemeSettingViewModel.swift */, 738406FE2B5718C600007E62 /* ThemeDetailViewModel.swift */, + 73AB84D32C3514080075DE83 /* IntegrateAccountViewModel.swift */, ); path = ViewModels; sourceTree = ""; @@ -1210,6 +1232,11 @@ BE4CD86628F5A56200BA9BBC /* FirebaseMessaging */, B8B7501C2B6274A5004F6272 /* KakaoMapsSDK_SPM */, CEF992F62BF3B8FC00F0FFA4 /* ReactNativeKit */, + 736AF84E2C2F279900ED9C1A /* GoogleSignIn */, + 736AF8502C2F279900ED9C1A /* GoogleSignInSwift */, + 731C244D2C4442590015877B /* KakaoSDK */, + 731C244F2C4442590015877B /* KakaoSDKAuth */, + 731C24512C4442590015877B /* KakaoSDKCommon */, ); productName = SNUTT; productReference = BE682BB22879E24D009EBCB7 /* SNUTT.app */; @@ -1293,6 +1320,8 @@ BE4CD85F28F5A56200BA9BBC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, CE1F49AF2A8DB5A400B81E4E /* XCRemoteSwiftPackageReference "ios-rn-prebuilt" */, B8B7501B2B6274A5004F6272 /* XCRemoteSwiftPackageReference "KakaoMapsSDK-SPM" */, + 736AF84D2C2F279900ED9C1A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */, + 734A83172C2FD39600D6CB95 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */, ); productRefGroup = DC860F3C27E5C87D0068C94B; projectDirPath = ""; @@ -1430,6 +1459,7 @@ BE9413C128C219AD00171060 /* STNotification.swift in Sources */, B87B317328D81447005C170B /* UserDto.swift in Sources */, BE060BD928DF4C1E00A2F1B9 /* OnboardScene.swift in Sources */, + 73AB84D22C35128B0075DE83 /* IntegrateAccountScene.swift in Sources */, BE682BFF2888056C009EBCB7 /* Quarter.swift in Sources */, B8F40EA9289809C60021A2A9 /* LicenseView.swift in Sources */, BEDF506D27EB740F00CDCC13 /* LectureList.swift in Sources */, @@ -1447,6 +1477,7 @@ BE9C90EB2948EA1800003AA6 /* ColorScheme.swift in Sources */, CE5BA50A2B2ED4BC00F15D10 /* ExpandableLectureList.swift in Sources */, CE9820522A0A0BE9001037F5 /* NetworkLogEntryView.swift in Sources */, + 736AF84C2C2F275E00ED9C1A /* GoogleLogin.swift in Sources */, BEE86519289E287400D3D0E4 /* MenuRenameSheet.swift in Sources */, BEDE34DC2879B40100525014 /* AppEnvironment.swift in Sources */, CEDDCA842A6AFBF700474D4E /* VacancyDto.swift in Sources */, @@ -1586,6 +1617,7 @@ BE9413C328C21D1000171060 /* NotificationRepository.swift in Sources */, B87B315E28D5A70F005C170B /* SearchState.swift in Sources */, BE060BD728DF43AC00A2F1B9 /* AuthService.swift in Sources */, + 734A831F2C2FD41200D6CB95 /* KakaoLogin.swift in Sources */, BE682C012888173B009EBCB7 /* TagRouter.swift in Sources */, 731DA003297BC5740027BA25 /* BookmarkRouter.swift in Sources */, 738407052B577E9000007E62 /* ThemeDetailScene.swift in Sources */, @@ -1607,6 +1639,7 @@ 731DA001297BC54B0027BA25 /* BookmarkDto.swift in Sources */, 738407032B571E6200007E62 /* ThemeBottomSheet.swift in Sources */, BE682BF92887FB59009EBCB7 /* SearchRouter.swift in Sources */, + 73AB84D42C3514080075DE83 /* IntegrateAccountViewModel.swift in Sources */, BE9413CC28C21F1E00171060 /* NotificationListCell.swift in Sources */, CEDDCA7B2A6AE62B00474D4E /* VacancyLectureCell.swift in Sources */, BEEBDFB62868BA6D00DB5976 /* FilterSheetContent.swift in Sources */, @@ -1777,6 +1810,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SNUTT/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Save Screenshots to Photo Library"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -2090,6 +2124,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SNUTT/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Save Screenshots to Photo Library"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -2134,6 +2169,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SNUTT/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Save Screenshots to Photo Library"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -2301,6 +2337,22 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 734A83172C2FD39600D6CB95 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kakao/kakao-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.22.3; + }; + }; + 736AF84D2C2F279900ED9C1A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.1.0; + }; + }; B8B7501B2B6274A5004F6272 /* XCRemoteSwiftPackageReference "KakaoMapsSDK-SPM" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/kakao-mapsSDK/KakaoMapsSDK-SPM.git"; @@ -2344,6 +2396,31 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 731C244D2C4442590015877B /* KakaoSDK */ = { + isa = XCSwiftPackageProductDependency; + package = 734A83172C2FD39600D6CB95 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDK; + }; + 731C244F2C4442590015877B /* KakaoSDKAuth */ = { + isa = XCSwiftPackageProductDependency; + package = 734A83172C2FD39600D6CB95 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKAuth; + }; + 731C24512C4442590015877B /* KakaoSDKCommon */ = { + isa = XCSwiftPackageProductDependency; + package = 734A83172C2FD39600D6CB95 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCommon; + }; + 736AF84E2C2F279900ED9C1A /* GoogleSignIn */ = { + isa = XCSwiftPackageProductDependency; + package = 736AF84D2C2F279900ED9C1A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; + productName = GoogleSignIn; + }; + 736AF8502C2F279900ED9C1A /* GoogleSignInSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 736AF84D2C2F279900ED9C1A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; + productName = GoogleSignInSwift; + }; B8B7501C2B6274A5004F6272 /* KakaoMapsSDK_SPM */ = { isa = XCSwiftPackageProductDependency; package = B8B7501B2B6274A5004F6272 /* XCRemoteSwiftPackageReference "KakaoMapsSDK-SPM" */; diff --git a/SNUTT-2022/SNUTT.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/SNUTT-2022/SNUTT.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 450782297..3e3f36663 100644 --- a/SNUTT-2022/SNUTT.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/SNUTT-2022/SNUTT.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "7c222e4a86eb2e1fd5319b24f556a74c30a45b6bea0ee72a523d512d16abc2e9", + "originHash" : "c5a43addf81097cbe1d3fca2033364f0e6e43186057dbcbd3e8d1955872a81fb", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -15,8 +15,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Alamofire/Alamofire.git", "state" : { - "revision" : "bc268c28fb170f494de9e9927c371b8342979ece", - "version" : "5.7.1" + "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", + "version" : "5.9.1" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "c89ed571ae140f8eb1142735e6e23d7bb8c34cb2", + "version" : "1.7.5" } }, { @@ -55,6 +64,15 @@ "version" : "9.2.5" } }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS", + "state" : { + "revision" : "a7965d134c5d3567026c523e0a8a583f73b62b0d", + "version" : "7.1.0" + } + }, { "identity" : "googleutilities", "kind" : "remoteSourceControl", @@ -78,8 +96,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/gtm-session-fetcher.git", "state" : { - "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd", - "version" : "3.1.1" + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "5d7d66f647400952b1758b230e019b07c0b4b22a", + "version" : "4.1.1" } }, { @@ -91,6 +118,15 @@ "version" : "0.17.0" } }, + { + "identity" : "kakao-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kakao/kakao-ios-sdk", + "state" : { + "revision" : "08089eeffc9b442da1c7343a70bf66c6de1a72c9", + "version" : "2.22.4" + } + }, { "identity" : "kakaomapssdk-spm", "kind" : "remoteSourceControl", diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/Contents.json b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/Contents.json deleted file mode 100644 index d38faba8a..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/Contents.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "images" : [ - { - "filename" : "apple-logo-svgrepo-com-light.svg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "apple-logo-svgrepo-com.svg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "apple-logo-svgrepo-com-light 1.svg", - "idiom" : "universal", - "scale" : "2x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "apple-logo-svgrepo-com 1.svg", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "apple-logo-svgrepo-com-light 2.svg", - "idiom" : "universal", - "scale" : "3x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "apple-logo-svgrepo-com 2.svg", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 1.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 1.svg deleted file mode 100644 index cb87b5a59..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 2.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 2.svg deleted file mode 100644 index cb87b5a59..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com 2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 1.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 1.svg deleted file mode 100644 index 7498f1916..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 2.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 2.svg deleted file mode 100644 index 7498f1916..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light 2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light.svg deleted file mode 100644 index 7498f1916..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com.svg deleted file mode 100644 index cb87b5a59..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/apple.imageset/apple-logo-svgrepo-com.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 1.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 1.svg deleted file mode 100644 index d807aa990..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 2.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 2.svg deleted file mode 100644 index d807aa990..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook 2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook.svg b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook.svg deleted file mode 100644 index d807aa990..000000000 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/facebook.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/Contents.json b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/Contents.json similarity index 71% rename from SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/Contents.json rename to SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/Contents.json index 09180e215..579bd17be 100644 --- a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/facebook.imageset/Contents.json +++ b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/Contents.json @@ -1,17 +1,16 @@ { "images" : [ { - "filename" : "facebook.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "facebook 1.svg", + "filename" : "appleid_button@2x 1@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "facebook 2.svg", + "filename" : "appleid_button@2x 1@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/appleid_button@2x 1@2x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.apple.imageset/appleid_button@2x 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..65b0135fba720fd2a2159fa315edbe6054979a20 GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/Contents.json b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/Contents.json new file mode 100644 index 000000000..30c5ca3e6 --- /dev/null +++ b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sns.facebook.2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sns.facebook.3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.2x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f00fb32dffc5f1edc00527cf430b07c96a883ab5 GIT binary patch literal 2871 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 V*7=@FR`~z`002ovPDHLkV1k`paV!7; literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.3x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.facebook.imageset/sns.facebook.3x.png new file mode 100644 index 0000000000000000000000000000000000000000..838ac2655ec659da23bf3f016d44a4c6f262cfa3 GIT binary patch literal 4374 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 Qu>b%707*qoM6N<$f=3`4=>Px# literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Contents.json b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Contents.json new file mode 100644 index 000000000..f6eab4c8b --- /dev/null +++ b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 202@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 202@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@2x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c14bf23ee9d999865afa17f15d906d4ad25e4c1b GIT binary patch literal 4399 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 literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@3x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.google.imageset/Frame 202@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4618c9d50e9ec5401810b2836ba8c8ba1a702ad6 GIT binary patch literal 7026 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 Q3jhEB07*qoM6N<$f`_tFhyVZp literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/Contents.json b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/Contents.json new file mode 100644 index 000000000..3ff5316c2 --- /dev/null +++ b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "kakao_login_small 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "kakao_login_small 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@2x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..23f446e6f9c5dc44ec1da20c229efb2c26a637d7 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@3x.png b/SNUTT-2022/SNUTT/Assets/Assets.xcassets/Icons/sns.kakao.imageset/kakao_login_small 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..54714f9ec396c403e4b9e0cf6536450a65b0c7e0 GIT binary patch literal 5324 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 eg`C^q1pWnT^kbmzVWw&T0000$(API_KEY) API_SERVER_URL https://${API_SERVER_URL} + CADisableMinimumFrameDurationOnPhone + CFBundleURLTypes CFBundleURLSchemes + $(GOOGLE_REVERSED_CLIENT_ID) fb$(FACEBOOK_APP_ID) CFBundleTypeRole Editor - CFBundleURLName - $(BUNDLE_ID) CFBundleURLSchemes - $(URL_SCHEME) + kakao$(KAKAO_APP_KEY) @@ -54,6 +55,23 @@ $(FACEBOOK_DISPLAY_NAME) FirebaseAppDelegateProxyEnabled + GIDClientID + $(GOOGLE_CLIENT_ID) + ITSAppUsesNonExemptEncryption + + KAKAO_APP_KEY + $(KAKAO_APP_KEY) + KAKAO_PHASE + + LSApplicationQueriesSchemes + + nmap + kakaomap + kakaokompassauth + kakaolink + + NMFClientId + $(NAVER_MAP_CLIENT_ID) NSAppTransportSecurity NSAllowsArbitraryLoads @@ -61,7 +79,7 @@ SNUEV_WEB_URL https://${SNUEV_WEB_URL} - NSPhotoLibraryUsageDescription - Save Screenshots to Photo Library + UIViewControllerBasedStatusBarAppearance + diff --git a/SNUTT-2022/SNUTT/Models/ErrorCode.swift b/SNUTT-2022/SNUTT/Models/ErrorCode.swift index cf288c3af..703b38468 100644 --- a/SNUTT-2022/SNUTT/Models/ErrorCode.swift +++ b/SNUTT-2022/SNUTT/Models/ErrorCode.swift @@ -12,17 +12,20 @@ struct STError: Error { let code: ErrorCode let title: String let content: String + let underlyingError: [String: String]? init(_ errorCode: ErrorCode) { title = errorCode.errorTitle content = errorCode.errorMessage code = errorCode + underlyingError = nil } - init(_ errorCode: ErrorCode, content: String) { + init(_ errorCode: ErrorCode, content: String, detail: [String: String]?) { title = errorCode.errorTitle self.content = content code = errorCode + underlyingError = detail } } @@ -45,6 +48,8 @@ enum ErrorCode: Int { case NO_LECTURE_TITLE = 0x100B case INVALID_TIMEJSON = 0x100C case INVALID_NOTIFICATION_DETAIL = 0x100D + case NO_GOOGLE_TOKEN = 0x100E + case NO_KAKAO_TOKEN = 0x100F case NO_LOCAL_ID = 0x1015 case NO_EMAIL = 0x1018 case INVALID_SEMESTER_FOR_VACANCY_NOTIFICATION = 40005 @@ -117,6 +122,8 @@ enum ErrorCode: Int { case .NO_NETWORK: return "네트워크 오류" case .NO_FB_ID_OR_TOKEN, + .NO_GOOGLE_TOKEN, + .NO_KAKAO_TOKEN, .NO_YEAR_OR_SEMESTER, .NOT_ENOUGH_TO_CREATE_TIMETABLE, .NO_LECTURE_INPUT, @@ -206,6 +213,10 @@ enum ErrorCode: Int { return "로그인 정보가 없습니다." case .NO_FB_ID_OR_TOKEN: return "페이스북 로그인 정보에 문제가 생겼습니다." + case .NO_GOOGLE_TOKEN: + return "구글 로그인 정보에 문제가 생겼습니다." + case .NO_KAKAO_TOKEN: + return "카카오 로그인 정보에 문제가 생겼습니다." case .NO_YEAR_OR_SEMESTER: return "올바른 연도와 학기를 정해주세요." case .NOT_ENOUGH_TO_CREATE_TIMETABLE: diff --git a/SNUTT-2022/SNUTT/Repositories/AuthRepository.swift b/SNUTT-2022/SNUTT/Repositories/AuthRepository.swift index 9413d4496..4dc3f67ae 100644 --- a/SNUTT-2022/SNUTT/Repositories/AuthRepository.swift +++ b/SNUTT-2022/SNUTT/Repositories/AuthRepository.swift @@ -11,7 +11,9 @@ import Foundation protocol AuthRepositoryProtocol { func registerWithLocalId(localId: String, localPassword: String, email: String) async throws -> LoginResponseDto func loginWithApple(appleToken: String) async throws -> LoginResponseDto - func loginWithFacebook(fbId: String, fbToken: String) async throws -> LoginResponseDto + func loginWithFacebook(facebookToken: String) async throws -> LoginResponseDto + func loginWithGoogle(googleToken: String) async throws -> LoginResponseDto + func loginWithKakao(kakaoToken: String) async throws -> LoginResponseDto func loginWithLocalId(localId: String, localPassword: String) async throws -> LoginResponseDto func findLocalId(email: String) async throws -> SendLocalIdDto func getLinkedEmail(localId: String) async throws -> LinkedEmailDto @@ -42,9 +44,23 @@ class AuthRepository: AuthRepositoryProtocol { .handlingError() } - func loginWithFacebook(fbId: String, fbToken: String) async throws -> LoginResponseDto { + func loginWithFacebook(facebookToken: String) async throws -> LoginResponseDto { return try await session - .request(AuthRouter.loginWithFacebook(fbId: fbId, fbToken: fbToken)) + .request(AuthRouter.loginWithFacebook(facebookToken: facebookToken)) + .serializingDecodable(LoginResponseDto.self) + .handlingError() + } + + func loginWithGoogle(googleToken: String) async throws -> LoginResponseDto { + return try await session + .request(AuthRouter.loginWithGoogle(googleToken: googleToken)) + .serializingDecodable(LoginResponseDto.self) + .handlingError() + } + + func loginWithKakao(kakaoToken: String) async throws -> LoginResponseDto { + return try await session + .request(AuthRouter.loginWithKakao(kakaoToken: kakaoToken)) .serializingDecodable(LoginResponseDto.self) .handlingError() } diff --git a/SNUTT-2022/SNUTT/Repositories/Dto/ErrorDto.swift b/SNUTT-2022/SNUTT/Repositories/Dto/ErrorDto.swift index 3c250de37..b35cb3b82 100644 --- a/SNUTT-2022/SNUTT/Repositories/Dto/ErrorDto.swift +++ b/SNUTT-2022/SNUTT/Repositories/Dto/ErrorDto.swift @@ -10,5 +10,7 @@ import Foundation struct ErrorDto: Codable { let errcode: Int let message: String + let displayMessage: String? + let detail: [String: String]? let ext: [String: String]? } diff --git a/SNUTT-2022/SNUTT/Repositories/NetworkUtils.swift b/SNUTT-2022/SNUTT/Repositories/NetworkUtils.swift index 0f73f9db6..d3c86a3c1 100644 --- a/SNUTT-2022/SNUTT/Repositories/NetworkUtils.swift +++ b/SNUTT-2022/SNUTT/Repositories/NetworkUtils.swift @@ -131,8 +131,8 @@ extension DataTask { Crashlytics.crashlytics().record(error: NSError(domain: errCode.errorTitle, code: errCode.rawValue, userInfo: requestInfo)) } - if let serverMessage = errDto.ext?.first?.1 { - throw STError(errCode ?? .SERVER_FAULT, content: serverMessage) + if let displayMessage = errDto.displayMessage { + throw STError(errCode ?? .SERVER_FAULT, content: displayMessage, detail: errDto.detail) } else { throw STError(errCode ?? .SERVER_FAULT) } diff --git a/SNUTT-2022/SNUTT/Repositories/Router/AuthRouter.swift b/SNUTT-2022/SNUTT/Repositories/Router/AuthRouter.swift index f33a8d150..6b52e4f72 100644 --- a/SNUTT-2022/SNUTT/Repositories/Router/AuthRouter.swift +++ b/SNUTT-2022/SNUTT/Repositories/Router/AuthRouter.swift @@ -1,5 +1,5 @@ // -// STAuthRouter.swift +// AuthRouter.swift // SNUTT // // Created by Rajin on 2016. 1. 13.. @@ -15,7 +15,10 @@ enum AuthRouter: Router { case .getLinkedEmail, .sendVerificationCode, .checkVerificationCode, - .resetPassword: + .resetPassword, + .loginWithFacebook, + .loginWithGoogle, + .loginWithKakao: return URL(string: NetworkConfiguration.serverV1BaseURL + "/auth")! default: return URL(string: NetworkConfiguration.serverBaseURL + "/auth")! @@ -26,8 +29,10 @@ enum AuthRouter: Router { case registerWithLocalId(localId: String, localPassword: String, email: String) case loginWithLocalId(localId: String, localPassword: String) - case loginWithFacebook(fbId: String, fbToken: String) + case loginWithFacebook(facebookToken: String) case loginWithApple(appleToken: String) + case loginWithGoogle(googleToken: String) + case loginWithKakao(kakaoToken: String) case findLocalId(email: String) case getLinkedEmail(localId: String) case sendVerificationCode(email: String) @@ -45,6 +50,10 @@ enum AuthRouter: Router { return .post case .loginWithApple: return .post + case .loginWithGoogle: + return .post + case .loginWithKakao: + return .post case .findLocalId: return .post case .getLinkedEmail: @@ -67,9 +76,13 @@ enum AuthRouter: Router { case .registerWithLocalId: return "/register_local" case .loginWithFacebook: - return "/login_fb" + return "/login/facebook" case .loginWithApple: return "/login_apple" + case .loginWithGoogle: + return "/login/google" + case .loginWithKakao: + return "/login/kakao" case .findLocalId: return "/id/find" case .getLinkedEmail: @@ -91,10 +104,14 @@ enum AuthRouter: Router { return ["id": localId, "password": localPassword] case let .registerWithLocalId(localId, localPassword, email): return ["id": localId, "password": localPassword, "email": email] - case let .loginWithFacebook(fbId, fbToken): - return ["fb_id": fbId, "fb_token": fbToken] + case let .loginWithFacebook(facebookToken): + return ["token": facebookToken] case let .loginWithApple(appleToken): return ["apple_token": appleToken] + case let .loginWithGoogle(googleToken): + return ["token": googleToken] + case let .loginWithKakao(kakaoToken): + return ["token": kakaoToken] case let .findLocalId(email: email): return ["email": email] case let .getLinkedEmail(localId: localId): diff --git a/SNUTT-2022/SNUTT/Services/AuthService.swift b/SNUTT-2022/SNUTT/Services/AuthService.swift index 3ae31c343..7eb118677 100644 --- a/SNUTT-2022/SNUTT/Services/AuthService.swift +++ b/SNUTT-2022/SNUTT/Services/AuthService.swift @@ -13,7 +13,9 @@ protocol AuthServiceProtocol: Sendable { func loadAccessTokenDuringBootstrap() func loginWithLocalId(localId: String, localPassword: String) async throws func loginWithApple(appleToken: String) async throws - func loginWithFacebook(fbId: String, fbToken: String) async throws + func loginWithFacebook(facebookToken: String) async throws + func loginWithGoogle(googleToken: String) async throws + func loginWithKakao(kakaoToken: String) async throws func registerWithLocalId(localId: String, localPassword: String, email: String) async throws func findLocalId(email: String) async throws func getLinkedEmail(localId: String) async throws -> String @@ -79,8 +81,20 @@ struct AuthService: AuthServiceProtocol, UserAuthHandler { try await registerFCMToken() } - func loginWithFacebook(fbId: String, fbToken: String) async throws { - let dto = try await authRepository.loginWithFacebook(fbId: fbId, fbToken: fbToken) + func loginWithFacebook(facebookToken: String) async throws { + let dto = try await authRepository.loginWithFacebook(facebookToken: facebookToken) + saveAccessTokenFromLoginResponse(dto: dto) + try await registerFCMToken() + } + + func loginWithGoogle(googleToken: String) async throws { + let dto = try await authRepository.loginWithGoogle(googleToken: googleToken) + saveAccessTokenFromLoginResponse(dto: dto) + try await registerFCMToken() + } + + func loginWithKakao(kakaoToken: String) async throws { + let dto = try await authRepository.loginWithKakao(kakaoToken: kakaoToken) saveAccessTokenFromLoginResponse(dto: dto) try await registerFCMToken() } @@ -139,7 +153,9 @@ class FakeAuthService: AuthServiceProtocol { func loadAccessTokenDuringBootstrap() {} func loginWithLocalId(localId _: String, localPassword _: String) async throws {} func loginWithApple(appleToken _: String) async throws {} - func loginWithFacebook(fbId _: String, fbToken _: String) async throws {} + func loginWithFacebook(facebookToken _: String) async throws {} + func loginWithGoogle(googleToken _: String) async throws {} + func loginWithKakao(kakaoToken _: String) async throws {} func registerWithLocalId(localId _: String, localPassword _: String, email _: String) async throws {} func findLocalId(email _: String) async throws {} func getLinkedEmail(localId _: String) async throws -> String { return "" } diff --git a/SNUTT-2022/SNUTT/ViewModels/AccountSettingViewModel.swift b/SNUTT-2022/SNUTT/ViewModels/AccountSettingViewModel.swift index 2748dde3b..e314b19da 100644 --- a/SNUTT-2022/SNUTT/ViewModels/AccountSettingViewModel.swift +++ b/SNUTT-2022/SNUTT/ViewModels/AccountSettingViewModel.swift @@ -26,14 +26,6 @@ extension AccountSettingScene { } } - func detachFacebook() async { - do { - try await services.userService.disconnectFacebook() - } catch { - services.globalUIService.presentErrorAlert(error: error) - } - } - func attachLocalId(localId: String, localPassword: String) async -> Bool { do { try await services.userService.addLocalId(localId: localId, localPassword: localPassword) @@ -65,13 +57,3 @@ extension AccountSettingScene { } } } - -extension AccountSettingScene.ViewModel: FacebookLoginProtocol { - func handleFacebookToken(fbId: String, fbToken: String) async { - do { - try await services.userService.connectFacebook(fbId: fbId, fbToken: fbToken) - } catch { - services.globalUIService.presentErrorAlert(error: error) - } - } -} diff --git a/SNUTT-2022/SNUTT/ViewModels/IntegrateAccountViewModel.swift b/SNUTT-2022/SNUTT/ViewModels/IntegrateAccountViewModel.swift new file mode 100644 index 000000000..83d16b83d --- /dev/null +++ b/SNUTT-2022/SNUTT/ViewModels/IntegrateAccountViewModel.swift @@ -0,0 +1,39 @@ +// +// IntegrateAccountViewModel.swift +// SNUTT +// +// Created by 이채민 on 7/3/24. +// + +import Combine +import SwiftUI + +extension IntegrateAccountScene { + class ViewModel: BaseViewModel, ObservableObject { + @Published var currentUser: User? + + override init(container: DIContainer) { + super.init(container: container) + + appState.user.$current.assign(to: &$currentUser) + } + + func detachFacebook() async { + do { + try await services.userService.disconnectFacebook() + } catch { + services.globalUIService.presentErrorAlert(error: error) + } + } + } +} + +extension IntegrateAccountScene.ViewModel: FacebookLoginProtocol { + func handleFacebookToken(fbId: String, fbToken: String) async { + do { + try await services.userService.connectFacebook(fbId: fbId, fbToken: fbToken) + } catch { + services.globalUIService.presentErrorAlert(error: error) + } + } +} diff --git a/SNUTT-2022/SNUTT/ViewModels/OnboardViewModel.swift b/SNUTT-2022/SNUTT/ViewModels/OnboardViewModel.swift index 3e2d1750a..359bb7999 100644 --- a/SNUTT-2022/SNUTT/ViewModels/OnboardViewModel.swift +++ b/SNUTT-2022/SNUTT/ViewModels/OnboardViewModel.swift @@ -10,6 +10,26 @@ import SwiftUI extension OnboardScene { class ViewModel: BaseViewModel, ObservableObject { + private func handleSocialLoginError(_ error: Error) { + let socialProviderMapping: [String: String] = [ + "LOCAL": "SNUTT", + "FACEBOOK": "페이스북", + "APPLE": "애플", + "GOOGLE": "구글", + "KAKAO": "카카오", + ] + + if let stError = error as? STError, let underlyingError = stError.underlyingError { + let socialProviderKey = underlyingError["socialProvider"] + let socialProviderName = socialProviderMapping[socialProviderKey ?? ""] ?? socialProviderKey + let updatedContent = stError.content + "\n\(socialProviderName ?? "") 계정으로 시도해 보세요." + let newError = STError(stError.code, content: updatedContent, detail: nil) + services.globalUIService.presentErrorAlert(error: newError) + } else { + services.globalUIService.presentErrorAlert(error: error) + } + } + func registerWith(id: String, password: String, email: String) async -> Bool { // TODO: Validation do { @@ -44,11 +64,31 @@ extension OnboardScene { } extension OnboardScene.ViewModel: FacebookLoginProtocol { - func handleFacebookToken(fbId: String, fbToken: String) async { + func handleFacebookToken(fbId _: String, fbToken: String) async { + do { + try await services.authService.loginWithFacebook(facebookToken: fbToken) + } catch { + handleSocialLoginError(error) + } + } +} + +extension OnboardScene.ViewModel: GoogleLoginProtocol { + func handleGoogleToken(googleToken: String) async { + do { + try await services.authService.loginWithGoogle(googleToken: googleToken) + } catch { + handleSocialLoginError(error) + } + } +} + +extension OnboardScene.ViewModel: KakaoLoginProtocol { + func handleKakaoToken(kakaoToken: String) async { do { - try await services.authService.loginWithFacebook(fbId: fbId, fbToken: fbToken) + try await services.authService.loginWithKakao(kakaoToken: kakaoToken) } catch { - services.globalUIService.presentErrorAlert(error: error) + handleSocialLoginError(error) } } } @@ -86,7 +126,7 @@ extension OnboardScene.ViewModel: ASAuthorizationControllerDelegate { do { try await services.authService.loginWithApple(appleToken: token) } catch { - services.globalUIService.presentErrorAlert(error: error) + handleSocialLoginError(error) } } } diff --git a/SNUTT-2022/SNUTT/Views/SNUTTApp.swift b/SNUTT-2022/SNUTT/Views/SNUTTApp.swift index 3f71fbf56..fd90fb7b3 100644 --- a/SNUTT-2022/SNUTT/Views/SNUTTApp.swift +++ b/SNUTT-2022/SNUTT/Views/SNUTTApp.swift @@ -5,6 +5,8 @@ // Created by Jinsup Keum on 2022/03/19. // +import KakaoSDKAuth +import KakaoSDKCommon import SwiftUI @main @@ -21,6 +23,8 @@ struct SNUTTApp: App { lectureService: appEnvironment.container.services.lectureService ) ) + let kakaoAppKey = Bundle.main.infoDictionary?["KAKAO_APP_KEY"] as! String + KakaoSDK.initSDK(appKey: kakaoAppKey) } var body: some Scene { @@ -28,6 +32,9 @@ struct SNUTTApp: App { SNUTTView(viewModel: .init(container: appEnvironment.container)) .environment(\.dependencyContainer, appEnvironment.container) .onOpenURL { url in + if AuthApi.isKakaoTalkLoginUrl(url) { + AuthController.handleOpenUrl(url: url) + } Task { do { try await deepLinkHandler.open(url: url) diff --git a/SNUTT-2022/SNUTT/Views/Scenes/OnboardScene.swift b/SNUTT-2022/SNUTT/Views/Scenes/OnboardScene.swift index 2d34cf476..131044bee 100644 --- a/SNUTT-2022/SNUTT/Views/Scenes/OnboardScene.swift +++ b/SNUTT-2022/SNUTT/Views/Scenes/OnboardScene.swift @@ -23,31 +23,78 @@ struct OnboardScene: View { if isActivated { VStack(spacing: 15) { Spacer() + .frame(height: 200) Logo(orientation: .vertical) .matchedGeometryEffect(id: logoId, in: launchScreenAnimation) - Spacer() - VStack { - SignInButton(label: "로그인") { + Spacer() + + Button { pushToLoginScene = true + } label: { + Text("로그인") + .font(.system(size: 14, weight: .bold)) + .foregroundColor(.white) + .frame(maxWidth: .infinity, maxHeight: 41) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .foregroundColor(STColor.cyan) + ) } - SignInButton(label: "가입하기") { + .padding(.horizontal, 32) + + Button { pushToSignUpScene = true + } label: { + Text("회원가입") + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(.init(uiColor: .label)) + .padding(.top, 12) + .padding(.bottom, 40) } - SignInButton(label: "Facebook으로 계속하기", imageName: "facebook") { - viewModel.performFacebookSignIn() + HStack(spacing: 10) { + Rectangle() + .fill(STColor.gray20) + .frame(height: 1) + Text("SNS 계정으로 계속하기") + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(STColor.gray20) + .fixedSize(horizontal: true, vertical: false) + Rectangle() + .fill(STColor.gray20) + .frame(height: 1) } + .padding(.bottom, 24) - SignInButton(label: "Apple로 계속하기", imageName: "apple") { - viewModel.performAppleSignIn() + HStack(spacing: 12) { + Button { + viewModel.performKakaoSignIn() + } label: { + Image("sns.kakao") + } + Button { + viewModel.performGoogleSignIn() + } label: { + Image("sns.google") + } + Button { + viewModel.performFacebookSignIn() + } label: { + Image("sns.facebook") + } + Button { + viewModel.performAppleSignIn() + } label: { + Image("sns.apple") + } } + + Spacer() } - .padding(.horizontal, 20) - Spacer() - .frame(height: 20) + .padding(.horizontal, 12) } .transition(.scale(scale: 1)) } else { @@ -77,41 +124,6 @@ struct OnboardScene: View { } } -struct SignInButton: View { - let label: String - var imageName: String? = nil - var borderColor: Color = .init(uiColor: .tertiaryLabel) - var fontColor: Color = .init(uiColor: .label) - var action: (() -> Void)? = nil - - var body: some View { - Button { - action?() - } label: { - Text(label) - .font(.system(size: 17, weight: .semibold)) - .frame(maxWidth: .infinity) - .foregroundColor(fontColor) - .contentShape(Rectangle()) - .padding(.vertical, 10) - .overlay(HStack { - if let imageName = imageName { - Image(imageName) - .resizable() - .frame(width: 20, height: 20) - .padding() - } - Spacer() - }) - .overlay( - RoundedRectangle(cornerRadius: 10, style: .continuous) - .stroke(borderColor, lineWidth: 1) - ) - } - .buttonStyle(.plain) - } -} - #if DEBUG struct OnboardScene_Previews: PreviewProvider { static var previews: some View { diff --git a/SNUTT-2022/SNUTT/Views/Scenes/Settings/AccountSettingScene.swift b/SNUTT-2022/SNUTT/Views/Scenes/Settings/AccountSettingScene.swift index 1cb1db4d3..a5e25d364 100644 --- a/SNUTT-2022/SNUTT/Views/Scenes/Settings/AccountSettingScene.swift +++ b/SNUTT-2022/SNUTT/Views/Scenes/Settings/AccountSettingScene.swift @@ -9,7 +9,6 @@ import SwiftUI struct AccountSettingScene: View { @ObservedObject var viewModel: ViewModel - @State private var isDisconnectFBAlertPresented: Bool = false @State private var isDeleteAccountAlertPresented: Bool = false @State private var isNicknameCopiedToPasteboard: Bool = false @@ -50,18 +49,9 @@ struct AccountSettingScene: View { } } - if let facebookName = viewModel.currentUser?.fbName { - Section { - SettingsTextItem(title: "페이스북 이름", detail: facebookName) - SettingsButtonItem(title: "페이스북 연동 해제", role: .destructive) { - isDisconnectFBAlertPresented = true - } - } - } else { - Section { - SettingsButtonItem(title: "페이스북 연동") { - viewModel.performFacebookSignIn() - } + Section { + SettingsLinkItem(title: "SNS 계정 연동 및 해제") { + IntegrateAccountScene(viewModel: .init(container: viewModel.container)) } } @@ -82,16 +72,6 @@ struct AccountSettingScene: View { .alert("닉네임이 클립보드에 복사되었습니다.", isPresented: $isNicknameCopiedToPasteboard) { Button("확인") {} } - .alert("페이스북 연동 해제", isPresented: $isDisconnectFBAlertPresented) { - Button("취소", role: .cancel, action: {}) - Button("해제", role: .destructive, action: { - Task { - await viewModel.detachFacebook() - } - }) - } message: { - Text("페이스북 연동을 해제하시겠습니까?") - } .alert("회원 탈퇴", isPresented: $isDeleteAccountAlertPresented) { Button("회원 탈퇴", role: .destructive) { Task { diff --git a/SNUTT-2022/SNUTT/Views/Scenes/Settings/IntegrateAccountScene.swift b/SNUTT-2022/SNUTT/Views/Scenes/Settings/IntegrateAccountScene.swift new file mode 100644 index 000000000..8c67f0261 --- /dev/null +++ b/SNUTT-2022/SNUTT/Views/Scenes/Settings/IntegrateAccountScene.swift @@ -0,0 +1,46 @@ +// +// IntegrateAccountScene.swift +// SNUTT +// +// Created by 이채민 on 7/3/24. +// + +import SwiftUI + +struct IntegrateAccountScene: View { + @ObservedObject var viewModel: ViewModel + @State private var isDisconnectFBAlertPresented: Bool = false + + var body: some View { + List { + if let facebookName = viewModel.currentUser?.fbName { + SettingsTextItem(title: "페이스북 이름", detail: facebookName) + SettingsButtonItem(title: "페이스북 계정 연동 해제", role: .destructive) { + isDisconnectFBAlertPresented = true + } + } else { + SettingsButtonItem(title: "페이스북 계정 연동") { + viewModel.performFacebookSignIn() + } + } + } + .alert("페이스북 계정 연동 해제", isPresented: $isDisconnectFBAlertPresented) { + Button("취소", role: .cancel, action: {}) + Button("해제", role: .destructive, action: { + Task { + await viewModel.detachFacebook() + } + }) + } message: { + Text("페이스북 연동을 해제하시겠습니까?") + } + } +} + +#if DEBUG + struct IntegrateAccountScene_Previews: PreviewProvider { + static var previews: some View { + IntegrateAccountScene(viewModel: .init(container: .preview)) + } + } +#endif