diff --git a/.swiftlint.yml b/.swiftlint.yml index 621fbcb4..841e9e0c 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -5,7 +5,6 @@ disabled_rules: - function_parameter_count - function_body_length - cyclomatic_complexity -- file_length excluded: - Pods - NADA-iOS-forRelease/Sources/AppDelegate.swift diff --git a/NADA-iOS-forRelease.xcodeproj/project.pbxproj b/NADA-iOS-forRelease.xcodeproj/project.pbxproj index e26ead3e..ffba4f11 100644 --- a/NADA-iOS-forRelease.xcodeproj/project.pbxproj +++ b/NADA-iOS-forRelease.xcodeproj/project.pbxproj @@ -12,8 +12,10 @@ 3903CC212769F4F40094C458 /* EmptyCardCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3903CC1F2769F4F40094C458 /* EmptyCardCell.xib */; }; 390515B82706CEBB00C5F7A5 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 390515B72706CEBB00C5F7A5 /* Colors.xcassets */; }; 3909242F26FA15E800236C51 /* UIView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3909242E26FA15E800236C51 /* UIView+Extension.swift */; }; - 3918F66727719C4B00984648 /* UserTokenReissueRequset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3918F66627719C4B00984648 /* UserTokenReissueRequset.swift */; }; + 3918F66727719C4B00984648 /* UserReissueToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3918F66627719C4B00984648 /* UserReissueToken.swift */; }; 3927A7D7275F2A9B008BCD2A /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3927A7D6275F2A9B008BCD2A /* UserDefaults.swift */; }; + 392BAF792793BAF80013DCB3 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392BAF782793BAF80013DCB3 /* KeyChain.swift */; }; + 392BAF7B2793E90D0013DCB3 /* KeyChainKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392BAF7A2793E90D0013DCB3 /* KeyChainKey.swift */; }; 392F7FB4274621F1008CDBF5 /* MoreListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392F7FB2274621F1008CDBF5 /* MoreListTableViewCell.swift */; }; 392F7FB5274621F1008CDBF5 /* MoreListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 392F7FB3274621F1008CDBF5 /* MoreListTableViewCell.xib */; }; 39317D2227646F8E00D87166 /* GroupNameEditBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39317D2127646F8E00D87166 /* GroupNameEditBottomSheetViewController.swift */; }; @@ -35,7 +37,6 @@ 39523E0B270184B100536900 /* CardList.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 39523E0A270184B100536900 /* CardList.storyboard */; }; 39523E5B2701A48900536900 /* CardListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39523E592701A48900536900 /* CardListTableViewCell.swift */; }; 39523E5C2701A48900536900 /* CardListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 39523E5A2701A48900536900 /* CardListTableViewCell.xib */; }; - 39523E5F2701AA9000536900 /* CardListDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39523E5E2701AA9000536900 /* CardListDataModel.swift */; }; 3958F239270FFBBF00B100B2 /* GroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3958F238270FFBBF00B100B2 /* GroupViewController.swift */; }; 3958F23C270FFBD500B100B2 /* Group.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3958F23B270FFBD500B100B2 /* Group.storyboard */; }; 3979709626FA0BE5003FB4F5 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3979709526FA0BE5003FB4F5 /* LoginViewController.swift */; }; @@ -156,8 +157,10 @@ 390515B72706CEBB00C5F7A5 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; 3909242E26FA15E800236C51 /* UIView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extension.swift"; sourceTree = ""; }; 3918F6652771682F00984648 /* NADA-iOS-forRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "NADA-iOS-forRelease.entitlements"; sourceTree = ""; }; - 3918F66627719C4B00984648 /* UserTokenReissueRequset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTokenReissueRequset.swift; sourceTree = ""; }; + 3918F66627719C4B00984648 /* UserReissueToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserReissueToken.swift; sourceTree = ""; }; 3927A7D6275F2A9B008BCD2A /* UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = ""; }; + 392BAF782793BAF80013DCB3 /* KeyChain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyChain.swift; sourceTree = ""; }; + 392BAF7A2793E90D0013DCB3 /* KeyChainKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyChainKey.swift; sourceTree = ""; }; 392F7FB2274621F1008CDBF5 /* MoreListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreListTableViewCell.swift; sourceTree = ""; }; 392F7FB3274621F1008CDBF5 /* MoreListTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MoreListTableViewCell.xib; sourceTree = ""; }; 39317D2127646F8E00D87166 /* GroupNameEditBottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupNameEditBottomSheetViewController.swift; sourceTree = ""; }; @@ -179,7 +182,6 @@ 39523E0A270184B100536900 /* CardList.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CardList.storyboard; sourceTree = ""; }; 39523E592701A48900536900 /* CardListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardListTableViewCell.swift; sourceTree = ""; }; 39523E5A2701A48900536900 /* CardListTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardListTableViewCell.xib; sourceTree = ""; }; - 39523E5E2701AA9000536900 /* CardListDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardListDataModel.swift; sourceTree = ""; }; 3958F238270FFBBF00B100B2 /* GroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupViewController.swift; sourceTree = ""; }; 3958F23B270FFBD500B100B2 /* Group.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Group.storyboard; sourceTree = ""; }; 3979709526FA0BE5003FB4F5 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; @@ -396,14 +398,6 @@ path = CardList; sourceTree = ""; }; - 39523E5D2701AA5700536900 /* CardList */ = { - isa = PBXGroup; - children = ( - 39523E5E2701AA9000536900 /* CardListDataModel.swift */, - ); - path = CardList; - sourceTree = ""; - }; 3958F237270FFB8700B100B2 /* Group */ = { isa = PBXGroup; children = ( @@ -477,7 +471,7 @@ children = ( 39D13564273FDB9C00B1A148 /* User.swift */, 39D13567273FDCB800B1A148 /* UserWithTokenRequest.swift */, - 3918F66627719C4B00984648 /* UserTokenReissueRequset.swift */, + 3918F66627719C4B00984648 /* UserReissueToken.swift */, ); path = User; sourceTree = ""; @@ -764,6 +758,7 @@ children = ( F8C83FBA272F9F370009DF0D /* NetworkResult.swift */, F8C83FBC272F9F430009DF0D /* GenericResponse.swift */, + 392BAF782793BAF80013DCB3 /* KeyChain.swift */, 3981148A273BEB7200E28630 /* User */, F87122722733032300A24E74 /* Card */, 777FF89927359B1000BF69D3 /* Group */, @@ -821,7 +816,6 @@ F8FC438726C01CDD0033E151 /* SceneDelegate.swift */, F8FC439B26C01EC30033E151 /* Cells */, F8FC439C26C01EC90033E151 /* Classes */, - F8FC439D26C01EEC0033E151 /* AppModel */, F8C83FB9272F9F030009DF0D /* NetworkModel */, F8FC439E26C01EF70033E151 /* NetworkService */, F8FC439F26C01EFC0033E151 /* Protocols */, @@ -854,14 +848,6 @@ path = Classes; sourceTree = ""; }; - F8FC439D26C01EEC0033E151 /* AppModel */ = { - isa = PBXGroup; - children = ( - 39523E5D2701AA5700536900 /* CardList */, - ); - path = AppModel; - sourceTree = ""; - }; F8FC439E26C01EF70033E151 /* NetworkService */ = { isa = PBXGroup; children = ( @@ -941,6 +927,7 @@ 3927A7D6275F2A9B008BCD2A /* UserDefaults.swift */, 77F47D92276C79B600414659 /* Header.swift */, 770E58852778A78900498C2E /* Status.swift */, + 392BAF7A2793E90D0013DCB3 /* KeyChainKey.swift */, ); path = Constants; sourceTree = ""; @@ -1166,6 +1153,7 @@ F8268DB927730B0100BF114B /* FirstCardAlertBottomSheetViewController.swift in Sources */, 770E58862778A78900498C2E /* Status.swift in Sources */, F851805B275D047C006BD5ED /* OnboardingViewController.swift in Sources */, + 392BAF7B2793E90D0013DCB3 /* KeyChainKey.swift in Sources */, 39C1E88F270EC762006D2089 /* UIColor+Extension.swift in Sources */, F8C83FC9272FA3190009DF0D /* GroupAPI.swift in Sources */, F8FC43B826C0227D0033E151 /* Const.swift in Sources */, @@ -1192,15 +1180,15 @@ 3981148E273BEBB300E28630 /* CardListEditRequest.swift in Sources */, 39D88B6B274600B100A72164 /* CommonBottomSheetViewController.swift in Sources */, 7734D5B627779EF0004360E4 /* QRCodeView.swift in Sources */, - 3918F66727719C4B00984648 /* UserTokenReissueRequset.swift in Sources */, + 3918F66727719C4B00984648 /* UserReissueToken.swift in Sources */, 7705CF3E2752C7DB005195DF /* CardView.swift in Sources */, F8FC43BA26C022900033E151 /* ViewController.swift in Sources */, - 39523E5F2701AA9000536900 /* CardListDataModel.swift in Sources */, 39D13568273FDCB800B1A148 /* UserWithTokenRequest.swift in Sources */, F84BAFB126FDB552004CA335 /* BackCardCreationCollectionViewCell.swift in Sources */, 39811490273BEBCE00E28630 /* CardListRequest.swift in Sources */, F8FC43BC26C022A20033E151 /* Storyboard.swift in Sources */, F8C83FC1272FA06E0009DF0D /* UserAPI.swift in Sources */, + 392BAF792793BAF80013DCB3 /* KeyChain.swift in Sources */, 7766A40F274FEBE200714912 /* CardInGroupCollectionViewCell.swift in Sources */, 3927A7D7275F2A9B008BCD2A /* UserDefaults.swift in Sources */, 7734D5B82777A8E8004360E4 /* String+Extension.swift in Sources */, @@ -1376,7 +1364,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 1.0.2; PRODUCT_BUNDLE_IDENTIFIER = "YJC.NADA-iOS-forRelease"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -1399,7 +1387,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 1.0.2; PRODUCT_BUNDLE_IDENTIFIER = "YJC.NADA-iOS-forRelease"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/Contents.json deleted file mode 100644 index 46d360f4..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "scale" : "1x", - "idiom" : "universal", - "filename" : "btnMainCreate.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "btnMainCreate@2x.png" - }, - { - "scale" : "3x", - "idiom" : "universal", - "filename" : "btnMainCreate@3x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate.png deleted file mode 100644 index ab913f27..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@2x.png deleted file mode 100644 index 27f8c816..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@3x.png deleted file mode 100644 index 93b2c463..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainCreate.imageset/btnMainCreate@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/Contents.json deleted file mode 100644 index 2c720654..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "scale" : "1x", - "idiom" : "universal", - "filename" : "btnMainDisable.png" - }, - { - "scale" : "2x", - "idiom" : "universal", - "filename" : "btnMainDisable@2x.png" - }, - { - "filename" : "btnMainDisable@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable.png deleted file mode 100644 index 55c60ef6..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@2x.png deleted file mode 100644 index c933bf77..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@3x.png deleted file mode 100644 index f447efa1..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/btnMainDisable.imageset/btnMainDisable@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/Contents.json deleted file mode 100644 index d559915c..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "scale" : "1x", - "filename" : "card.png", - "idiom" : "universal" - }, - { - "filename" : "card@2x.png", - "scale" : "2x", - "idiom" : "universal" - }, - { - "idiom" : "universal", - "filename" : "card@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card.png deleted file mode 100644 index 203a47d8..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@2x.png deleted file mode 100644 index 69df8f69..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@3x.png deleted file mode 100644 index 610eb36a..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/card.imageset/card@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/Contents.json deleted file mode 100644 index 7b6a894a..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "icnApple.png", - "scale" : "1x", - "idiom" : "universal" - }, - { - "filename" : "icnApple@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "icnApple@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple.png deleted file mode 100644 index 2efeba0d..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@2x.png deleted file mode 100644 index 653cce8d..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@3x.png deleted file mode 100644 index dee4a7b6..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnApple.imageset/icnApple@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/Contents.json deleted file mode 100644 index 7d870a8b..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "icnKakao.png", - "scale" : "1x", - "idiom" : "universal" - }, - { - "filename" : "icnKakao@2x.png", - "scale" : "2x", - "idiom" : "universal" - }, - { - "filename" : "icnKakao@3x.png", - "scale" : "3x", - "idiom" : "universal" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao.png deleted file mode 100644 index dde2eaa7..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@2x.png deleted file mode 100644 index 7ea39bcb..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@3x.png deleted file mode 100644 index 9f7de136..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/icnKakao.imageset/icnKakao@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/Contents.json deleted file mode 100644 index 865145ed..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "image020.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "image020@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "image020@3x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020.png deleted file mode 100644 index 5b96f3ff..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@2x.png deleted file mode 100644 index 28c5013e..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@3x.png deleted file mode 100644 index 42387540..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image020.imageset/image020@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/Contents.json deleted file mode 100644 index 26efb8c4..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "scale" : "1x", - "idiom" : "universal", - "filename" : "image2140.png" - }, - { - "filename" : "image2140@2x.png", - "scale" : "2x", - "idiom" : "universal" - }, - { - "filename" : "image2140@3x.png", - "scale" : "3x", - "idiom" : "universal" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140.png deleted file mode 100644 index 33ab6e2c..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@2x.png deleted file mode 100644 index c216eb23..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@3x.png deleted file mode 100644 index e7f520c1..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image2140.imageset/image2140@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/Contents.json deleted file mode 100644 index 41e3a554..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x", - "filename" : "image4160.png" - }, - { - "filename" : "image4160@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "image4160@3x.png", - "scale" : "3x", - "idiom" : "universal" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160.png deleted file mode 100644 index 1a4cb986..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@2x.png deleted file mode 100644 index af9ecd5a..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@3x.png deleted file mode 100644 index 63ad9dfa..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image4160.imageset/image4160@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/Contents.json deleted file mode 100644 index e4107609..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "image6180.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "image6180@2x.png", - "scale" : "2x", - "idiom" : "universal" - }, - { - "filename" : "image6180@3x.png", - "scale" : "3x", - "idiom" : "universal" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180.png deleted file mode 100644 index 8d7575c8..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@2x.png deleted file mode 100644 index 3846416b..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@3x.png deleted file mode 100644 index dadf6bee..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image6180.imageset/image6180@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/Contents.json deleted file mode 100644 index bec6762c..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "image81100.png", - "scale" : "1x", - "idiom" : "universal" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "image81100@2x.png" - }, - { - "idiom" : "universal", - "filename" : "image81100@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100.png deleted file mode 100644 index 9432d926..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@2x.png deleted file mode 100644 index 8199b519..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@3x.png deleted file mode 100644 index 5e0284ce..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/image81100.imageset/image81100@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/Contents.json b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/Contents.json deleted file mode 100644 index a4d1efdc..00000000 --- a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "qrCodeImg21.png", - "scale" : "1x", - "idiom" : "universal" - }, - { - "filename" : "qrCodeImg21@2x.png", - "scale" : "2x", - "idiom" : "universal" - }, - { - "filename" : "qrCodeImg21@3x.png", - "scale" : "3x", - "idiom" : "universal" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21.png deleted file mode 100644 index 6a6a9518..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@2x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@2x.png deleted file mode 100644 index 472fc940..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@2x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@3x.png b/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@3x.png deleted file mode 100644 index c26016b1..00000000 Binary files a/NADA-iOS-forRelease/Resouces/Assets/Assets.xcassets/qrCodeImg21.imageset/qrCodeImg21@3x.png and /dev/null differ diff --git a/NADA-iOS-forRelease/Resouces/Constants/Const.swift b/NADA-iOS-forRelease/Resouces/Constants/Const.swift index 1b721fb6..5bd677f3 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/Const.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/Const.swift @@ -8,5 +8,6 @@ import Foundation struct Const { - static let headerToken: String = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) ?? "" + // TODO: - KeyChain 적용 + // static var headerToken: String = KeyChain.read(key: Const.KeyChainKey.accessToken) ?? "" } diff --git a/NADA-iOS-forRelease/Resouces/Constants/Header.swift b/NADA-iOS-forRelease/Resouces/Constants/Header.swift index 8ff870d3..1854c7ec 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/Header.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/Header.swift @@ -10,9 +10,22 @@ import Foundation extension Const { struct Header { - static var bearerHeader = ["Authorization": "Bearer " + headerToken] + static func applicationJsonHeader() -> [String: String] { + ["Content-Type": "application/json"] + } - static var basicHeader = ["Content-Type": "application/json", - "Authorization": "Bearer " + headerToken] + static func multipartFormHeader() -> [String: String] { + ["Content-Type": "application/json", + "Authorization": "Bearer \(UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) ?? "")"] + } + + static func bearerHeader() -> [String: String] { + ["Authorization": "Bearer \(UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) ?? "")"] + } + + static func basicHeader() -> [String: String] { + ["Content-Type": "application/json", + "Authorization": "Bearer \(UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) ?? "")"] + } } } diff --git a/NADA-iOS-forRelease/Resouces/Constants/KeyChainKey.swift b/NADA-iOS-forRelease/Resouces/Constants/KeyChainKey.swift new file mode 100644 index 00000000..88e3e2fa --- /dev/null +++ b/NADA-iOS-forRelease/Resouces/Constants/KeyChainKey.swift @@ -0,0 +1,15 @@ +// +// KeyChainKey.swift +// NADA-iOS-forRelease +// +// Created by 민 on 2022/01/16. +// + +import Foundation + +extension Const { + struct KeyChainKey { + static let accessToken = "accessToken" + static let refreshToken = "refreshToken" + } +} diff --git a/NADA-iOS-forRelease/Resouces/Constants/URL.swift b/NADA-iOS-forRelease/Resouces/Constants/URL.swift index 71376cbb..ee251acd 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/URL.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/URL.swift @@ -9,7 +9,8 @@ import Foundation extension Const { struct URL { - static let baseURL = "https://nada-server.o-r.kr" +// static let baseURL = "https://nada-server.o-r.kr" + static let baseURL = "http://3.34.197.90" static let policyURL = "https://nadaitzme.notion.site/NADA-8385054bc2e44762a62f590534b2a24d" static let serviceURL = "https://nadaitzme.notion.site/NADA-58544bc9f0a1493c94f223cab3a440d0" static let moyaURL = "https://github.com/Moya/Moya" diff --git a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift index d83b9442..14eb1146 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift @@ -10,13 +10,14 @@ import Foundation extension Const { struct UserDefaultsKey { static let darkModeState = "darkModeState" - static let accessToken = "accessToken" - static let refreshToken = "refreshToken" static let userID = "userID" static let isFirstCard = "isFirstCard" static let isOnboarding = "isOnboarding" static let firstCardID = "firstCardID" static let isAppleLogin = "isAppleLogin" static let isKakaoLogin = "isKakaoLogin" + // TODO: - KeyChain 적용 + static let accessToken = "accessToken" + static let refreshToken = "refreshToken" } } diff --git a/NADA-iOS-forRelease/Sources/AppDelegate.swift b/NADA-iOS-forRelease/Sources/AppDelegate.swift index 249b5af9..e7c503ec 100644 --- a/NADA-iOS-forRelease/Sources/AppDelegate.swift +++ b/NADA-iOS-forRelease/Sources/AppDelegate.swift @@ -20,7 +20,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Override point for customization after application launch. KakaoSDKCommon.initSDK(appKey: "5b8dd8cc878344bb7532eeca4365a4aa") - let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) + + // 기존 사용자 로그아웃 인식을 위한 부분 + if UserDefaults.standard.string(forKey: "accessToken") != nil { + KeyChain.create(key: Const.KeyChainKey.accessToken, token: UserDefaults.standard.string(forKey: "accessToken") ?? "") + KeyChain.create(key: Const.KeyChainKey.refreshToken, token: UserDefaults.standard.string(forKey: "refreshToken") ?? "") + } + let acToken = KeyChain.read(key: Const.KeyChainKey.accessToken) if acToken != nil { if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.isAppleLogin) { diff --git a/NADA-iOS-forRelease/Sources/AppModel/CardList/CardListDataModel.swift b/NADA-iOS-forRelease/Sources/AppModel/CardList/CardListDataModel.swift deleted file mode 100644 index 068011fe..00000000 --- a/NADA-iOS-forRelease/Sources/AppModel/CardList/CardListDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// CardListDataModel.swift -// NADA-iOS-forRelease -// -// Created by 민 on 2021/09/27. -// - -import Foundation - -struct CardListDataModel { - var title: String -} diff --git a/NADA-iOS-forRelease/Sources/Cells/CardList/CardListTableViewCell.swift b/NADA-iOS-forRelease/Sources/Cells/CardList/CardListTableViewCell.swift index a7d45f68..ef10415a 100644 --- a/NADA-iOS-forRelease/Sources/Cells/CardList/CardListTableViewCell.swift +++ b/NADA-iOS-forRelease/Sources/Cells/CardList/CardListTableViewCell.swift @@ -19,7 +19,7 @@ class CardListTableViewCell: UITableViewCell { } static func nib() -> UINib { - return UINib(nibName: "CardListTableViewCell", bundle: nil) + return UINib(nibName: Const.Xib.cardListTableViewCell, bundle: nil) } override func setSelected(_ selected: Bool, animated: Bool) { diff --git a/NADA-iOS-forRelease/Sources/Cells/CreationCard/FrontCardCreationCollectionViewCell.swift b/NADA-iOS-forRelease/Sources/Cells/CreationCard/FrontCardCreationCollectionViewCell.swift index ec1f676b..9c4581fb 100644 --- a/NADA-iOS-forRelease/Sources/Cells/CreationCard/FrontCardCreationCollectionViewCell.swift +++ b/NADA-iOS-forRelease/Sources/Cells/CreationCard/FrontCardCreationCollectionViewCell.swift @@ -222,7 +222,6 @@ extension FrontCardCreationCollectionViewCell { private func setBirthText(notification: NSNotification) { birthLabel.text = notification.object as? String birthLabel.textColor = .primary - birthView.borderWidth = 0 checkFrontCradStatus() @@ -286,7 +285,6 @@ extension FrontCardCreationCollectionViewCell { presentingBirthBottomVCClosure?() birthView.layer.borderColor = UIColor.tertiary.cgColor birthView.layer.borderWidth = 1 - } @objc private func touchMBTIView() { @@ -323,20 +321,13 @@ extension FrontCardCreationCollectionViewCell: UICollectionViewDelegate { } else { defaultImageIndex = 0 } - case 1: - defaultImageIndex = 1 - case 2: - defaultImageIndex = 2 - case 3: - defaultImageIndex = 3 - case 4: - defaultImageIndex = 4 - case 5: - defaultImageIndex = 5 - case 6: - defaultImageIndex = 6 - case 7: - defaultImageIndex = 7 + case 1: defaultImageIndex = 1 + case 2: defaultImageIndex = 2 + case 3: defaultImageIndex = 3 + case 4: defaultImageIndex = 4 + case 5: defaultImageIndex = 5 + case 6: defaultImageIndex = 6 + case 7: defaultImageIndex = 7 default: return } diff --git a/NADA-iOS-forRelease/Sources/Cells/MoreList/MoreListTableViewCell.swift b/NADA-iOS-forRelease/Sources/Cells/MoreList/MoreListTableViewCell.swift index 6eacf75e..2f94818c 100644 --- a/NADA-iOS-forRelease/Sources/Cells/MoreList/MoreListTableViewCell.swift +++ b/NADA-iOS-forRelease/Sources/Cells/MoreList/MoreListTableViewCell.swift @@ -18,7 +18,7 @@ class MoreListTableViewCell: UITableViewCell { } static func nib() -> UINib { - return UINib(nibName: "MoreListTableViewCell", bundle: nil) + return UINib(nibName: Const.Xib.moreListTableViewCell, bundle: nil) } override func setSelected(_ selected: Bool, animated: Bool) { diff --git a/NADA-iOS-forRelease/Sources/NetworkModel/KeyChain.swift b/NADA-iOS-forRelease/Sources/NetworkModel/KeyChain.swift new file mode 100644 index 00000000..c2f5f5df --- /dev/null +++ b/NADA-iOS-forRelease/Sources/NetworkModel/KeyChain.swift @@ -0,0 +1,57 @@ +// +// KeyChain.swift +// NADA-iOS-forRelease +// +// Created by 민 on 2022/01/16. +// + +import Foundation +import Security + +class KeyChain { + // Create + class func create(key: String, token: String) { + let query: NSDictionary = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key, // 저장할 Account + kSecValueData: token.data(using: .utf8, allowLossyConversion: false) as Any // 저장할 Token + ] + SecItemDelete(query) // Keychain은 Key값에 중복이 생기면, 저장할 수 없기 때문에 먼저 Delete해줌 + + let status = SecItemAdd(query, nil) + assert(status == noErr, "failed to save Token") + } + + // Read + class func read(key: String) -> String? { + let query: NSDictionary = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key, + kSecReturnData: kCFBooleanTrue as Any, // CFData 타입으로 불러오라는 의미 + kSecMatchLimit: kSecMatchLimitOne // 중복되는 경우, 하나의 값만 불러오라는 의미 + ] + + var dataTypeRef: AnyObject? + let status = SecItemCopyMatching(query, &dataTypeRef) + + if status == errSecSuccess { + if let retrievedData: Data = dataTypeRef as? Data { + let value = String(data: retrievedData, encoding: String.Encoding.utf8) + return value + } else { return nil } + } else { + print("failed to loading, status code = \(status)") + return nil + } + } + + // Delete + class func delete(key: String) { + let query: NSDictionary = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key + ] + let status = SecItemDelete(query) + assert(status == noErr, "failed to delete the value, status code = \(status)") + } +} diff --git a/NADA-iOS-forRelease/Sources/NetworkModel/NetworkResult.swift b/NADA-iOS-forRelease/Sources/NetworkModel/NetworkResult.swift index 9c3a7a6d..a5f8ca32 100644 --- a/NADA-iOS-forRelease/Sources/NetworkModel/NetworkResult.swift +++ b/NADA-iOS-forRelease/Sources/NetworkModel/NetworkResult.swift @@ -8,9 +8,9 @@ import Foundation enum NetworkResult { - case success(T) // 서버 통신 성공 - case requestErr(T) // 요청 에러 발생 - case pathErr // 경로 에러 - case serverErr // 서버의 내부적 에러 - case networkFail // 네트워크 연결 실패 + case success(T) // 서버 통신 성공 + case requestErr(T) // 요청 에러 발생 + case pathErr // 경로 에러 + case serverErr // 서버의 내부적 에러 + case networkFail // 네트워크 연결 실패 } diff --git a/NADA-iOS-forRelease/Sources/NetworkModel/User/UserTokenReissueRequset.swift b/NADA-iOS-forRelease/Sources/NetworkModel/User/UserReissueToken.swift similarity index 81% rename from NADA-iOS-forRelease/Sources/NetworkModel/User/UserTokenReissueRequset.swift rename to NADA-iOS-forRelease/Sources/NetworkModel/User/UserReissueToken.swift index 09c2de85..064ad561 100644 --- a/NADA-iOS-forRelease/Sources/NetworkModel/User/UserTokenReissueRequset.swift +++ b/NADA-iOS-forRelease/Sources/NetworkModel/User/UserReissueToken.swift @@ -7,7 +7,7 @@ import Foundation -struct UserTokenReissueRequset: Codable { +struct UserReissueToken: Codable { var accessToken: String var refreshToken: String } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Card/CardService.swift b/NADA-iOS-forRelease/Sources/NetworkService/Card/CardService.swift index afc5d8a9..0c77157a 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Card/CardService.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Card/CardService.swift @@ -111,10 +111,12 @@ extension CardService: TargetType { var headers: [String: String]? { switch self { - case .cardDetailFetch, .cardListFetch, .cardDelete, .cardListEdit: - return Const.Header.basicHeader + case .cardDetailFetch, .cardListFetch, .cardDelete: + return Const.Header.bearerHeader() + case .cardListEdit: + return Const.Header.basicHeader() case .cardCreation: - return Const.Header.basicHeader + return Const.Header.multipartFormHeader() } } } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift index af923dbe..591be957 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupService.swift @@ -95,12 +95,10 @@ extension GroupService: TargetType { var headers: [String: String]? { switch self { - case .groupListFetch, .cardListFetchInGroup, .groupDelete, .cardDeleteInGroup: - return Const.Header.bearerHeader + case .groupListFetch, .cardListFetchInGroup, .groupReset, .groupDelete, .cardDeleteInGroup: + return Const.Header.bearerHeader() case .groupAdd, .groupEdit, .cardAddInGroup, .changeCardGroup: - return Const.Header.bearerHeader - case .groupReset: - return Const.Header.basicHeader + return Const.Header.basicHeader() } } } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Plugin/MoyaLoggerPlugin.swift b/NADA-iOS-forRelease/Sources/NetworkService/Plugin/MoyaLoggerPlugin.swift index 6db06b94..df22b0af 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Plugin/MoyaLoggerPlugin.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Plugin/MoyaLoggerPlugin.swift @@ -9,63 +9,105 @@ import Foundation import Moya final class MoyaLoggerPlugin: PluginType { - - // Request를 보낼 때 호출 - func willSend(_ request: RequestType, target: TargetType) { - guard let httpRequest = request.request else { - print("--> 유효하지 않은 요청") - return - } - let url = httpRequest.description - let method = httpRequest.httpMethod ?? "unknown method" - var log = "----------------------------------------------------\n[\(method)] \(url)\n----------------------------------------------------\n" - log.append("API: \(target)\n") - if let headers = httpRequest.allHTTPHeaderFields, !headers.isEmpty { - log.append("header: \(headers)\n") + // Request를 보낼 때 호출 + func willSend(_ request: RequestType, target: TargetType) { + guard let httpRequest = request.request else { + print("--> 유효하지 않은 요청") + return + } + let url = httpRequest.description + let method = httpRequest.httpMethod ?? "unknown method" + var log = "----------------------------------------------------\n[\(method)] \(url)\n----------------------------------------------------\n" + log.append("API: \(target)\n") + if let headers = httpRequest.allHTTPHeaderFields, !headers.isEmpty { + log.append("header: \(headers)\n") + } + if let body = httpRequest.httpBody, let bodyString = String(bytes: body, encoding: String.Encoding.utf8) { + log.append("\(bodyString)\n") + } + log.append("------------------- END \(method) --------------------------") + print(log) } - if let body = httpRequest.httpBody, let bodyString = String(bytes: body, encoding: String.Encoding.utf8) { - log.append("\(bodyString)\n") - } - log.append("------------------- END \(method) --------------------------") - print(log) - } - // Response가 왔을 때 - func didReceive(_ result: Result, target: TargetType) { - switch result { - case let .success(response): - onSuceed(response, target: target, isFromError: false) - case let .failure(error): - onFail(error, target: target) + // Response가 왔을 때 + func didReceive(_ result: Result, target: TargetType) { + switch result { + case let .success(response): + onSuceed(response, target: target, isFromError: false) + case let .failure(error): + onFail(error, target: target) + } } - } - func onSuceed(_ response: Response, target: TargetType, isFromError: Bool) { - let request = response.request - let url = request?.url?.absoluteString ?? "nil" - let statusCode = response.statusCode - var log = "------------------- 네트워크 통신 성공(isFromError: \(isFromError)) -------------------" - log.append("\n[\(statusCode)] \(url)\n----------------------------------------------------\n") - log.append("API: \(target)\n") - response.response?.allHeaderFields.forEach { - log.append("\($0): \($1)\n") - } - if let reString = String(bytes: response.data, encoding: String.Encoding.utf8) { - log.append("\(reString)\n") + func onSuceed(_ response: Response, target: TargetType, isFromError: Bool) { + let request = response.request + let url = request?.url?.absoluteString ?? "nil" + let statusCode = response.statusCode + + var log = "------------------- 네트워크 통신 성공(isFromError: \(isFromError)) -------------------" + log.append("\n[\(statusCode)] \(url)\n----------------------------------------------------\n") + log.append("API: \(target)\n") + response.response?.allHeaderFields.forEach { + log.append("\($0): \($1)\n") + } + if let reString = String(bytes: response.data, encoding: String.Encoding.utf8) { + log.append("\(reString)\n") + } + log.append("------------------- END HTTP (\(response.data.count)-byte body) -------------------") + print(log) + + switch statusCode { + case 401: + let acessToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) + let refreshToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.refreshToken) + userTokenReissueWithAPI(request: UserReissueToken(accessToken: acessToken ?? "", + refreshToken: refreshToken ?? "")) + default: + return + } } - log.append("------------------- END HTTP (\(response.data.count)-byte body) -------------------") - print(log) - } - func onFail(_ error: MoyaError, target: TargetType) { - if let response = error.response { - onSuceed(response, target: target, isFromError: true) - return + func onFail(_ error: MoyaError, target: TargetType) { + if let response = error.response { + onSuceed(response, target: target, isFromError: true) + return + } + var log = "네트워크 오류" + log.append("<-- \(error.errorCode) \(target)\n") + log.append("\(error.failureReason ?? error.errorDescription ?? "unknown error")\n") + log.append("<-- END HTTP") + print(log) + } +} + +extension MoyaLoggerPlugin { + func userTokenReissueWithAPI(request: UserReissueToken) { + UserAPI.shared.userTokenReissue(request: request) { response in + switch response { + case .success(let data): + if let tokenData = data as? UserReissueToken { + UserDefaults.standard.set(tokenData.accessToken, forKey: Const.UserDefaultsKey.accessToken) + UserDefaults.standard.set(tokenData.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) + + print("userTokenReissueWithAPI - success") + } + case .requestErr(let statusCode): + if let statusCode = statusCode as? Int, statusCode == 406 { + let loginVC = UIStoryboard(name: Const.Storyboard.Name.login, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.loginViewController) + UIApplication.shared.windows.first {$0.isKeyWindow}?.rootViewController = loginVC + + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.accessToken) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.refreshToken) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.userID) + } + print("userTokenReissueWithAPI - requestErr: \(statusCode)") + case .pathErr: + print("userTokenReissueWithAPI - pathErr") + case .serverErr: + print("userTokenReissueWithAPI - serverErr") + case .networkFail: + print("userTokenReissueWithAPI - networkFail") + } + } } - var log = "네트워크 오류" - log.append("<-- \(error.errorCode) \(target)\n") - log.append("\(error.failureReason ?? error.errorDescription ?? "unknown error")\n") - log.append("<-- END HTTP") - print(log) - } } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/User/UserAPI.swift b/NADA-iOS-forRelease/Sources/NetworkService/User/UserAPI.swift index f8bc04e6..c53a3a6a 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/User/UserAPI.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/User/UserAPI.swift @@ -15,54 +15,6 @@ public class UserAPI { public init() { } - func userIDFetch(userID: String, completion: @escaping (NetworkResult) -> Void) { - userProvider.request(.userIDFetch(userID: userID)) { (result) in - switch result { - case .success(let response): - let statusCode = response.statusCode - let data = response.data - - let networkResult = self.judgeUserIDFetchStatus(by: statusCode, data) - completion(networkResult) - - case .failure(let err): - print(err) - } - } - } - - func userTokenFetch(userID: String, completion: @escaping (NetworkResult) -> Void) { - userProvider.request(.userTokenFetch(userID: userID)) { (result) in - switch result { - case .success(let response): - let statusCode = response.statusCode - let data = response.data - - let networkResult = self.judgeUserTokenFetchStatus(by: statusCode, data) - completion(networkResult) - - case .failure(let err): - print(err) - } - } - } - - func userSignUp(request: User, completion: @escaping (NetworkResult) -> Void) { - userProvider.request(.userSignUp(request: request)) { (result) in - switch result { - case .success(let response): - let statusCode = response.statusCode - let data = response.data - - let networkResult = self.judgeUserIDFetchStatus(by: statusCode, data) - completion(networkResult) - - case .failure(let err): - print(err) - } - } - } - func userDelete(token: String, completion: @escaping (NetworkResult) -> Void) { userProvider.request(.userDelete(token: token)) { (result) in switch result { @@ -110,7 +62,7 @@ public class UserAPI { } } - func userTokenReissue(request: UserTokenReissueRequset, completion: @escaping (NetworkResult) -> Void) { + func userTokenReissue(request: UserReissueToken, completion: @escaping (NetworkResult) -> Void) { userProvider.request(.userTokenReissue(request: request)) { (result) in switch result { case .success(let response): @@ -126,26 +78,6 @@ public class UserAPI { } } - private func judgeUserIDFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { - - let decoder = JSONDecoder() - guard let decodedData = try? decoder.decode(GenericResponse.self, from: data) - else { - return .pathErr - } - - switch statusCode { - case 200: - return .success(decodedData.data ?? "None-Data") - case 400..<500: - return .requestErr(decodedData.msg) - case 500: - return .serverErr - default: - return .networkFail - } - } - private func judgeUserTokenFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { let decoder = JSONDecoder() @@ -169,7 +101,7 @@ public class UserAPI { private func judgeUserTokenReissueStatus(by statusCode: Int, _ data: Data) -> NetworkResult { let decoder = JSONDecoder() - guard let decodedData = try? decoder.decode(GenericResponse.self, from: data) + guard let decodedData = try? decoder.decode(GenericResponse.self, from: data) else { return .pathErr } @@ -178,7 +110,7 @@ public class UserAPI { case 200: return .success(decodedData.data ?? "None-Data") case 400..<500: - return .requestErr(decodedData.msg) + return .requestErr(statusCode) case 500: return .serverErr default: diff --git a/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift b/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift index 1f025ec8..b85f1eb7 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/User/UserSevice.swift @@ -9,13 +9,10 @@ import Foundation import Moya enum UserSevice { - case userIDFetch(userID: String) - case userTokenFetch(userID: String) - case userSignUp(request: User) case userDelete(token: String) case userSocialSignUp(userID: String) case userLogout(token: String) - case userTokenReissue(request: UserTokenReissueRequset) + case userTokenReissue(request: UserReissueToken) } extension UserSevice: TargetType { @@ -26,12 +23,6 @@ extension UserSevice: TargetType { var path: String { switch self { - case .userIDFetch(let userID): - return "/\(userID)/login" - case .userTokenFetch(let userID): - return "/auth/\(userID)/login" - case .userSignUp: - return "/register" case .userDelete: return "/user" case .userSocialSignUp: @@ -45,9 +36,7 @@ extension UserSevice: TargetType { var method: Moya.Method { switch self { - case .userIDFetch, .userTokenFetch: - return .get - case .userSignUp, .userSocialSignUp, .userTokenReissue: + case .userSocialSignUp, .userTokenReissue: return .post case .userDelete, .userLogout: return .delete @@ -60,10 +49,8 @@ extension UserSevice: TargetType { var task: Task { switch self { - case .userIDFetch, .userTokenFetch, .userDelete, .userLogout: + case .userDelete, .userLogout: return .requestPlain - case .userSignUp(let request): - return .requestJSONEncodable(request) case .userSocialSignUp(let userID): return .requestParameters(parameters: ["userId": userID], encoding: JSONEncoding.default) case .userTokenReissue(let request): @@ -73,12 +60,10 @@ extension UserSevice: TargetType { var headers: [String: String]? { switch self { - case .userIDFetch, .userTokenFetch: - return Const.Header.bearerHeader - case .userSignUp, .userSocialSignUp, .userTokenReissue: - return ["Content-Type": "application/json"] + case .userSocialSignUp, .userTokenReissue: + return Const.Header.applicationJsonHeader() case .userDelete, .userLogout: - return Const.Header.basicHeader + return Const.Header.bearerHeader() } } } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Util/UtilService.swift b/NADA-iOS-forRelease/Sources/NetworkService/Util/UtilService.swift index 3ffa55b0..a7498d13 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Util/UtilService.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Util/UtilService.swift @@ -54,7 +54,7 @@ extension UtilService: TargetType { var headers: [String: String]? { switch self { case .cardHarmonyFetch: - return Const.Header.bearerHeader + return Const.Header.bearerHeader() } } } diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift index 300f11a3..833411de 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift @@ -7,7 +7,6 @@ import Photos import UIKit - import Kingfisher import NVActivityIndicatorView @@ -287,7 +286,6 @@ extension GroupViewController: UICollectionViewDataSource { guard let groupCell = collectionView.dequeueReusableCell(withReuseIdentifier: Const.Xib.groupCollectionViewCell, for: indexPath) as? GroupCollectionViewCell else { return UICollectionViewCell() } - groupCell.groupName.text = serverGroups?.groups[indexPath.row].groupName if indexPath.row == selectedRow { diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift index 2204f689..43891c68 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Login/LoginViewController.swift @@ -196,8 +196,12 @@ extension LoginViewController { print("postUserSignUpWithAPI - success") if let userData = loginData as? UserWithTokenRequest { UserDefaults.standard.set(userData.user.userID, forKey: Const.UserDefaultsKey.userID) + + // TODO: - KeyChain 적용 UserDefaults.standard.set(userData.user.token.accessToken, forKey: Const.UserDefaultsKey.accessToken) UserDefaults.standard.set(userData.user.token.refreshToken, forKey: Const.UserDefaultsKey.refreshToken) + // KeyChain.create(key: Const.KeyChainKey.accessToken, token: userData.user.token.accessToken) + // KeyChain.create(key: Const.KeyChainKey.refreshToken, token: userData.user.token.refreshToken) self.presentToMain() } case .requestErr(let message): diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift index e54720fc..28027510 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/More/MoreViewController.swift @@ -110,10 +110,15 @@ extension MoreViewController { func setLogoutClicked() { makeOKCancelAlert(title: "", message: "로그아웃 하시겠습니까?", okAction: { _ in self.makeOKAlert(title: "", message: "로그아웃이 완료 되었습니다.") { _ in + // TODO: - KeyChain 적용 if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { +// if let acToken = KeyChain.read(key: Const.KeyChainKey.accessToken) { self.logoutUserWithAPI(token: acToken) + // TODO: - KeyChain 적용 self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) self.defaults.removeObject(forKey: Const.UserDefaultsKey.refreshToken) +// KeyChain.delete(key: Const.KeyChainKey.accessToken) +// KeyChain.delete(key: Const.KeyChainKey.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 @@ -130,8 +135,10 @@ extension MoreViewController { print(error) } else { self.makeOKAlert(title: "", message: "받은 명함이 초기화 되었습니다.") + // TODO: - KeyChain 적용 if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { - self.groupResetWithAPI(token: acToken) +// if let acToken = KeyChain.read(key: Const.KeyChainKey.accessToken) { +// self.groupResetWithAPI(token: acToken) } } } @@ -145,10 +152,15 @@ extension MoreViewController { print(error) } else { self.makeOKAlert(title: "", message: "모든 명함이 삭제되었습니다.") { _ in + // TODO: - KeyChain 적용 if let acToken = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.accessToken) { +// if let acToken = KeyChain.read(key: Const.KeyChainKey.accessToken) { self.deleteUserWithAPI(token: acToken) + // TODO: - KeyChain 적용 self.defaults.removeObject(forKey: Const.UserDefaultsKey.accessToken) self.defaults.removeObject(forKey: Const.UserDefaultsKey.refreshToken) +// KeyChain.delete(key: Const.KeyChainKey.accessToken) +// KeyChain.delete(key: Const.KeyChainKey.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 diff --git a/README.md b/README.md index 70ebe7a4..7e07c086 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,96 @@ -# NADA-iOS-ForRelease -릴리즈를 목표로하는 민재이준현규의 으라차차🦾 대소동🧨 iOS❤️‍🔥 TeamNADA +

+ Flicking Logo
+

+ +# 가장 간편한 자기소개, '나를 다' 담은 명함 서비스, 나다 NADA + + + + ![Swift](https://img.shields.io/badge/Swift-5.0-orange.svg) + [![Platform](https://img.shields.io/cocoapods/p/LFAlertController.svg?style=flat)](http://creativecommons.org/licenses/by/4.0/) + +‘안녕하세요.. 만나서 반갑습니다! 앗... 혹시 인스타하세요..? MBTI는요..?’ + +매번 어색하고 할 말 없는 첫 만남, 매번 반복되는 똑같은 자기소개! 생각만 해도.. 스트레스 받죠? + +이제는 나다로 명함을 교환하며 쉽고 재미있게 서로를 알아가 보세요. + +
+ +**#1. 나에 대한 모든 정보를 명함 한 장에 담아보세요.** + +앞면에는 이름, 생일 등 기본적인 정보를, 뒷면에는 더 재미있는 정보를 담을 수 있어요. +동아리, 회사, 학교... 다양한 페르소나를 대비해 여러 개의 명함을 만들 수 있어요. + +
+ +**#2. 명함을 교환하며 서로에 대한 정보를 쉽게 파악해보세요.** + +하나의 명함마다 QR코드, ID가 생성돼요. 상대방과 명함을 교환하며 서로를 더 잘 기억해 보세요. +받은 명함은 그룹별로 분류하여 관리할 수 있어요. + +
+ +**#3. 처음 만난 사람들과의 즐거운 만남을 도와드려요.** + +교환한 명함을 통해 서로의 정보를 더 잘 파악하고, 기억할 수 있어요. +MBTI, 취향 등이 조합된 NADA만의 궁합 시스템으로 재미있는 만남을 가져보세요. + +
+ +## 🧑🏻‍💻 iOS Developers + + + + + + +

현규 교수님


이준 교수님


민재 학부연구생

+ +
+ +## 📦 Libraries +|Library|Version|Description| +|:-----:|:-----:|:-----:| +|[**Moya**](https://github.com/Moya/Moya)|14.0.0|네트워킹 시 사용| +|[**SkeletonView**](https://github.com/Juanpe/SkeletonView)|1.21.2|API 호출 프로세스가 작동하는동안, 사용자들에게 보여주는 로딩 뷰| +|[**SwiftLint**](https://github.com/realm/SwiftLint)|0.43.1|개발자 사이, 코딩 컨벤션 규칙을 설정하는 데 사용| +|[**VerticalCardSwiper**](https://github.com/JoniVR/VerticalCardSwiper)|2.3.1|메인 뷰, 카드 스와이프 방식 기능을 구현할 때 사용| +|[**KakaoSDK**](https://developers.kakao.com/sdk/reference/ios/release/KakaoSDKCommon/index.html)|2.5.6|카카오 소셜 로그인 관련| +|[**IQKeyboardManagerSwift**](https://github.com/hackiftekhar/IQKeyboardManager)|6.5.6|앱 내, 키보드를 편리하게 다루기 위해 사용| +|[**Kingfisher**](https://github.com/onevcat/Kingfisher)|7.1.1|URL 주소를 가지고 있는 이미지를 앱 내에서 보여지게 할 때, 사용| +|[**NVActivityIndicatorView**](https://github.com/ninjaprox/NVActivityIndicatorView)|5.1.1|로딩 화면에서 사용되는 애니메이션| + +
+ +## 📂 Foldering Convention +```bash +├── Info.plist +├── Resource +│ ├── Assets +│ └── Assets.xcassets +│ ├── Constants +│ ├── Extensions +│ ├── Fonts +│ └── Storyboards +├── Source +│ ├── AppDelegate +│ ├── SceneDelegate +│ ├── Cells +│ ├── Classes +│ ├── Models +│ ├── Network +│ ├── Protocols +│ ├── ViewControllers +│ └── Views +└── +``` + +## 📖 Coding Convention +See [Coding Convention Wiki](https://github.com/TeamNADA/NADA-iOS-ForRelease/wiki/Code-Convention) page. + +## 🎋 Git Branch Rule +See [Git Branch Rule Wiki](https://github.com/TeamNADA/NADA-iOS-ForRelease/wiki/Branch-Rule) page. + +## 🙌 Git Commit, Issue, PR Message Convention +See [Git Commit, Issue, PR Message Convention Wiki](https://github.com/TeamNADA/NADA-iOS-ForRelease/wiki/Commit,-Issue,-PR) page.