commit 0872089c5dd73d9010f7a499c9c058a695928999 Author: seonkyu.kim Date: Wed Jun 26 12:38:42 2024 +0900 [๐Ÿ“] GIT init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe491b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.Pods/ +Podfile +Podfile.lock + +JJUNGTABLE/Common/KEY.swift \ No newline at end of file diff --git a/JJUNGTABLE.xcodeproj/project.pbxproj b/JJUNGTABLE.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5b1f5b6 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/project.pbxproj @@ -0,0 +1,1017 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + A70FD4C72C1803F100D74D8C /* Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70FD4C62C1803F100D74D8C /* Login.swift */; }; + A72BE8D82B28563100C37B40 /* JJUNGIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A72BE8D72B28563100C37B40 /* JJUNGIcon.png */; }; + A7580B9E2AED7090008CBBBB /* AppleIcon.PNG in Resources */ = {isa = PBXBuildFile; fileRef = A7580B9C2AED7090008CBBBB /* AppleIcon.PNG */; }; + A7580B9F2AED7090008CBBBB /* KakaoIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A7580B9D2AED7090008CBBBB /* KakaoIcon.png */; }; + A75F34522B033E96005F04B0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A75F34512B033E96005F04B0 /* GoogleService-Info.plist */; }; + A768757C2B3417CB00044807 /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = A768757B2B3417CB00044807 /* KakaoSDK */; }; + A768757E2B3417CB00044807 /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = A768757D2B3417CB00044807 /* KakaoSDKAuth */; }; + A76875802B3417CB00044807 /* KakaoSDKCert in Frameworks */ = {isa = PBXBuildFile; productRef = A768757F2B3417CB00044807 /* KakaoSDKCert */; }; + A76875822B3417CB00044807 /* KakaoSDKCertCore in Frameworks */ = {isa = PBXBuildFile; productRef = A76875812B3417CB00044807 /* KakaoSDKCertCore */; }; + A76875842B3417CB00044807 /* KakaoSDKCommon in Frameworks */ = {isa = PBXBuildFile; productRef = A76875832B3417CB00044807 /* KakaoSDKCommon */; }; + A77857CB2AED059800621BB7 /* NPSfont_regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = A77857C82AED059800621BB7 /* NPSfont_regular.otf */; }; + A77857CC2AED059800621BB7 /* NPSfont_bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A77857C92AED059800621BB7 /* NPSfont_bold.otf */; }; + A77857CD2AED059800621BB7 /* NPSfont_extrabold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A77857CA2AED059800621BB7 /* NPSfont_extrabold.otf */; }; + A7A7C0042C0FF96000D470D0 /* SwiftUI_Modifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7BFFF2C0FF95700D470D0 /* SwiftUI_Modifier.swift */; }; + A7A7C0052C0FF96000D470D0 /* SwiftUI_Prefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7C0002C0FF95700D470D0 /* SwiftUI_Prefix.swift */; }; + A7A7C0062C0FF96000D470D0 /* ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7C0022C0FF95700D470D0 /* ViewModel.swift */; }; + A7A7C0082C0FF96000D470D0 /* UI_Func_Prefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7C0012C0FF95700D470D0 /* UI_Func_Prefix.swift */; }; + A7A7C0092C0FF96000D470D0 /* Parameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7BFFE2C0FF95700D470D0 /* Parameter.swift */; }; + A7A7C00A2C0FF96000D470D0 /* FB_Functions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7BFFD2C0FF95700D470D0 /* FB_Functions.swift */; }; + A7A7C00C2C0FFA1300D470D0 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A7C00B2C0FFA1300D470D0 /* API.swift */; }; + A7BA337D2C09556F005E58A2 /* KEY.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BA337C2C09556F005E58A2 /* KEY.swift */; }; + A7C240AC2AE9F60D001E0925 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C240AB2AE9F60D001E0925 /* AppDelegate.swift */; }; + A7C240AE2AE9F60D001E0925 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C240AD2AE9F60D001E0925 /* SceneDelegate.swift */; }; + A7C240B52AE9F60E001E0925 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A7C240B42AE9F60E001E0925 /* Assets.xcassets */; }; + A7C240B82AE9F60E001E0925 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A7C240B62AE9F60E001E0925 /* LaunchScreen.storyboard */; }; + A7C240DA2AE9FB00001E0925 /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240D92AE9FB00001E0925 /* KakaoSDK */; }; + A7C240DC2AE9FB00001E0925 /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240DB2AE9FB00001E0925 /* KakaoSDKAuth */; }; + A7C240DE2AE9FB00001E0925 /* KakaoSDKCert in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240DD2AE9FB00001E0925 /* KakaoSDKCert */; }; + A7C240E02AE9FB00001E0925 /* KakaoSDKCertCore in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240DF2AE9FB00001E0925 /* KakaoSDKCertCore */; }; + A7C240E22AE9FB00001E0925 /* KakaoSDKCommon in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240E12AE9FB00001E0925 /* KakaoSDKCommon */; }; + A7C240E42AE9FB00001E0925 /* KakaoSDKFriend in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240E32AE9FB00001E0925 /* KakaoSDKFriend */; }; + A7C240E62AE9FB00001E0925 /* KakaoSDKFriendCore in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240E52AE9FB00001E0925 /* KakaoSDKFriendCore */; }; + A7C240E82AE9FB00001E0925 /* KakaoSDKNavi in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240E72AE9FB00001E0925 /* KakaoSDKNavi */; }; + A7C240EA2AE9FB00001E0925 /* KakaoSDKShare in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240E92AE9FB00001E0925 /* KakaoSDKShare */; }; + A7C240EE2AE9FB00001E0925 /* KakaoSDKTalk in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240ED2AE9FB00001E0925 /* KakaoSDKTalk */; }; + A7C240F02AE9FB00001E0925 /* KakaoSDKTemplate in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240EF2AE9FB00001E0925 /* KakaoSDKTemplate */; }; + A7C240F22AE9FB00001E0925 /* KakaoSDKUser in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240F12AE9FB00001E0925 /* KakaoSDKUser */; }; + A7C240F52AE9FC42001E0925 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240F42AE9FC42001E0925 /* FirebaseAnalytics */; }; + A7C240F72AE9FC42001E0925 /* FirebaseAnalyticsOnDeviceConversion in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240F62AE9FC42001E0925 /* FirebaseAnalyticsOnDeviceConversion */; }; + A7C240F92AE9FC42001E0925 /* FirebaseAnalyticsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240F82AE9FC42001E0925 /* FirebaseAnalyticsSwift */; }; + A7C240FB2AE9FC42001E0925 /* FirebaseAnalyticsWithoutAdIdSupport in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240FA2AE9FC42001E0925 /* FirebaseAnalyticsWithoutAdIdSupport */; }; + A7C240FD2AE9FC42001E0925 /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240FC2AE9FC42001E0925 /* FirebaseAppCheck */; }; + A7C240FF2AE9FC42001E0925 /* FirebaseAppDistribution-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = A7C240FE2AE9FC42001E0925 /* FirebaseAppDistribution-Beta */; }; + A7C241012AE9FC42001E0925 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241002AE9FC42001E0925 /* FirebaseAuth */; }; + A7C241032AE9FC42001E0925 /* FirebaseAuthCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241022AE9FC42001E0925 /* FirebaseAuthCombine-Community */; }; + A7C241052AE9FC42001E0925 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241042AE9FC42001E0925 /* FirebaseCrashlytics */; }; + A7C241072AE9FC42001E0925 /* FirebaseDatabase in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241062AE9FC42001E0925 /* FirebaseDatabase */; }; + A7C241092AE9FC42001E0925 /* FirebaseDatabaseSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241082AE9FC42001E0925 /* FirebaseDatabaseSwift */; }; + A7C2410B2AE9FC42001E0925 /* FirebaseDynamicLinks in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2410A2AE9FC42001E0925 /* FirebaseDynamicLinks */; }; + A7C2410D2AE9FC42001E0925 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2410C2AE9FC42001E0925 /* FirebaseFirestore */; }; + A7C2410F2AE9FC42001E0925 /* FirebaseFirestoreCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2410E2AE9FC42001E0925 /* FirebaseFirestoreCombine-Community */; }; + A7C241112AE9FC42001E0925 /* FirebaseFirestoreSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241102AE9FC42001E0925 /* FirebaseFirestoreSwift */; }; + A7C241132AE9FC42001E0925 /* FirebaseFunctions in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241122AE9FC42001E0925 /* FirebaseFunctions */; }; + A7C241152AE9FC42001E0925 /* FirebaseFunctionsCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241142AE9FC42001E0925 /* FirebaseFunctionsCombine-Community */; }; + A7C241172AE9FC42001E0925 /* FirebaseInAppMessaging-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241162AE9FC42001E0925 /* FirebaseInAppMessaging-Beta */; }; + A7C241192AE9FC42001E0925 /* FirebaseInAppMessagingSwift-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241182AE9FC42001E0925 /* FirebaseInAppMessagingSwift-Beta */; }; + A7C2411B2AE9FC42001E0925 /* FirebaseInstallations in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2411A2AE9FC42001E0925 /* FirebaseInstallations */; }; + A7C2411D2AE9FC42001E0925 /* FirebaseMLModelDownloader in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2411C2AE9FC42001E0925 /* FirebaseMLModelDownloader */; }; + A7C2411F2AE9FC42001E0925 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2411E2AE9FC42001E0925 /* FirebaseMessaging */; }; + A7C241212AE9FC42001E0925 /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241202AE9FC42001E0925 /* FirebasePerformance */; }; + A7C241232AE9FC42001E0925 /* FirebaseRemoteConfig in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241222AE9FC42001E0925 /* FirebaseRemoteConfig */; }; + A7C241252AE9FC42001E0925 /* FirebaseRemoteConfigSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241242AE9FC42001E0925 /* FirebaseRemoteConfigSwift */; }; + A7C241272AE9FC42001E0925 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241262AE9FC42001E0925 /* FirebaseStorage */; }; + A7C241292AE9FC42001E0925 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = A7C241282AE9FC42001E0925 /* FirebaseStorageCombine-Community */; }; + A7C241302AEA1DCC001E0925 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = A7C2412F2AEA1DCC001E0925 /* SnapKit */; }; + A7CAF7392B96F17B009D696F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CAF7382B96F17B009D696F /* ContentView.swift */; }; + A7CD15E92C17E21300985BB8 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CD15E82C17E21300985BB8 /* NetworkMonitor.swift */; }; + A7CD15EB2C17E6A100985BB8 /* BaseViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CD15EA2C17E6A100985BB8 /* BaseViewModifier.swift */; }; + A7DD96F82C1AE12200EF2553 /* EDENON.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DD96F72C1AE12200EF2553 /* EDENON.swift */; }; + A7F35A392C16B89F0001C9B7 /* DataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F35A382C16B89F0001C9B7 /* DataModel.swift */; }; + D941F68892525E1AD0E52C10 /* Pods_JJUNGTABLE.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ED741719FC8497EBF8D3021 /* Pods_JJUNGTABLE.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0ED741719FC8497EBF8D3021 /* Pods_JJUNGTABLE.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JJUNGTABLE.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 69EB80E332E7BC4DF778CE73 /* Pods-JJUNGTABLE.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JJUNGTABLE.release.xcconfig"; path = "Target Support Files/Pods-JJUNGTABLE/Pods-JJUNGTABLE.release.xcconfig"; sourceTree = ""; }; + A3E3F8B281287F643C8D34C6 /* Pods-JJUNGTABLE.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JJUNGTABLE.debug.xcconfig"; path = "Target Support Files/Pods-JJUNGTABLE/Pods-JJUNGTABLE.debug.xcconfig"; sourceTree = ""; }; + A70FD4C62C1803F100D74D8C /* Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Login.swift; sourceTree = ""; }; + A71381E22B32BDF7009DA477 /* Document.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Document.md; sourceTree = ""; }; + A72BE8D72B28563100C37B40 /* JJUNGIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = JJUNGIcon.png; sourceTree = ""; }; + A73F5EAD2AED3F0D00EC6E81 /* JJUNGTABLE.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = JJUNGTABLE.entitlements; sourceTree = ""; }; + A7580B9C2AED7090008CBBBB /* AppleIcon.PNG */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppleIcon.PNG; sourceTree = ""; }; + A7580B9D2AED7090008CBBBB /* KakaoIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = KakaoIcon.png; sourceTree = ""; }; + A75F34512B033E96005F04B0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + A77857C82AED059800621BB7 /* NPSfont_regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = NPSfont_regular.otf; sourceTree = ""; }; + A77857C92AED059800621BB7 /* NPSfont_bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = NPSfont_bold.otf; sourceTree = ""; }; + A77857CA2AED059800621BB7 /* NPSfont_extrabold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = NPSfont_extrabold.otf; sourceTree = ""; }; + A7A7BFF52C0FF95700D470D0 /* HalfView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HalfView.swift; sourceTree = ""; }; + A7A7BFF62C0FF95700D470D0 /* ScorllView_Example.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScorllView_Example.swift; sourceTree = ""; }; + A7A7BFFD2C0FF95700D470D0 /* FB_Functions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FB_Functions.swift; sourceTree = ""; }; + A7A7BFFE2C0FF95700D470D0 /* Parameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Parameter.swift; sourceTree = ""; }; + A7A7BFFF2C0FF95700D470D0 /* SwiftUI_Modifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_Modifier.swift; sourceTree = ""; }; + A7A7C0002C0FF95700D470D0 /* SwiftUI_Prefix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_Prefix.swift; sourceTree = ""; }; + A7A7C0012C0FF95700D470D0 /* UI_Func_Prefix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UI_Func_Prefix.swift; sourceTree = ""; }; + A7A7C0022C0FF95700D470D0 /* ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModel.swift; sourceTree = ""; }; + A7A7C00B2C0FFA1300D470D0 /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; + A7BA337C2C09556F005E58A2 /* KEY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KEY.swift; sourceTree = ""; }; + A7C240A82AE9F60D001E0925 /* JJUNGTABLE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JJUNGTABLE.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A7C240AB2AE9F60D001E0925 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + A7C240AD2AE9F60D001E0925 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + A7C240B42AE9F60E001E0925 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + A7C240B72AE9F60E001E0925 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + A7C240B92AE9F60E001E0925 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A7CAF7382B96F17B009D696F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + A7CD15E82C17E21300985BB8 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; + A7CD15EA2C17E6A100985BB8 /* BaseViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewModifier.swift; sourceTree = ""; }; + A7DD96F72C1AE12200EF2553 /* EDENON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EDENON.swift; sourceTree = ""; }; + A7F35A382C16B89F0001C9B7 /* DataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataModel.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A7C240A52AE9F60D001E0925 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A7C241132AE9FC42001E0925 /* FirebaseFunctions in Frameworks */, + A7C240F92AE9FC42001E0925 /* FirebaseAnalyticsSwift in Frameworks */, + A7C240F72AE9FC42001E0925 /* FirebaseAnalyticsOnDeviceConversion in Frameworks */, + A7C241302AEA1DCC001E0925 /* SnapKit in Frameworks */, + A7C240E22AE9FB00001E0925 /* KakaoSDKCommon in Frameworks */, + A7C241032AE9FC42001E0925 /* FirebaseAuthCombine-Community in Frameworks */, + A7C241112AE9FC42001E0925 /* FirebaseFirestoreSwift in Frameworks */, + A768757E2B3417CB00044807 /* KakaoSDKAuth in Frameworks */, + A7C2411F2AE9FC42001E0925 /* FirebaseMessaging in Frameworks */, + A7C2410F2AE9FC42001E0925 /* FirebaseFirestoreCombine-Community in Frameworks */, + A7C240E62AE9FB00001E0925 /* KakaoSDKFriendCore in Frameworks */, + A7C241092AE9FC42001E0925 /* FirebaseDatabaseSwift in Frameworks */, + A7C240E02AE9FB00001E0925 /* KakaoSDKCertCore in Frameworks */, + A7C241012AE9FC42001E0925 /* FirebaseAuth in Frameworks */, + A7C241212AE9FC42001E0925 /* FirebasePerformance in Frameworks */, + A7C240EA2AE9FB00001E0925 /* KakaoSDKShare in Frameworks */, + A7C241072AE9FC42001E0925 /* FirebaseDatabase in Frameworks */, + A76875822B3417CB00044807 /* KakaoSDKCertCore in Frameworks */, + A7C241252AE9FC42001E0925 /* FirebaseRemoteConfigSwift in Frameworks */, + A7C2411D2AE9FC42001E0925 /* FirebaseMLModelDownloader in Frameworks */, + A7C240FD2AE9FC42001E0925 /* FirebaseAppCheck in Frameworks */, + A7C2410D2AE9FC42001E0925 /* FirebaseFirestore in Frameworks */, + A7C241172AE9FC42001E0925 /* FirebaseInAppMessaging-Beta in Frameworks */, + A7C241292AE9FC42001E0925 /* FirebaseStorageCombine-Community in Frameworks */, + A7C241192AE9FC42001E0925 /* FirebaseInAppMessagingSwift-Beta in Frameworks */, + A7C240DA2AE9FB00001E0925 /* KakaoSDK in Frameworks */, + A7C2410B2AE9FC42001E0925 /* FirebaseDynamicLinks in Frameworks */, + A7C240EE2AE9FB00001E0925 /* KakaoSDKTalk in Frameworks */, + A7C240F22AE9FB00001E0925 /* KakaoSDKUser in Frameworks */, + A7C240DC2AE9FB00001E0925 /* KakaoSDKAuth in Frameworks */, + A7C240FB2AE9FC42001E0925 /* FirebaseAnalyticsWithoutAdIdSupport in Frameworks */, + A7C241152AE9FC42001E0925 /* FirebaseFunctionsCombine-Community in Frameworks */, + A7C240FF2AE9FC42001E0925 /* FirebaseAppDistribution-Beta in Frameworks */, + A7C240F52AE9FC42001E0925 /* FirebaseAnalytics in Frameworks */, + A7C240F02AE9FB00001E0925 /* KakaoSDKTemplate in Frameworks */, + A7C2411B2AE9FC42001E0925 /* FirebaseInstallations in Frameworks */, + A76875802B3417CB00044807 /* KakaoSDKCert in Frameworks */, + A7C241272AE9FC42001E0925 /* FirebaseStorage in Frameworks */, + A7C240E82AE9FB00001E0925 /* KakaoSDKNavi in Frameworks */, + A7C240DE2AE9FB00001E0925 /* KakaoSDKCert in Frameworks */, + A7C241052AE9FC42001E0925 /* FirebaseCrashlytics in Frameworks */, + A7C241232AE9FC42001E0925 /* FirebaseRemoteConfig in Frameworks */, + A7C240E42AE9FB00001E0925 /* KakaoSDKFriend in Frameworks */, + D941F68892525E1AD0E52C10 /* Pods_JJUNGTABLE.framework in Frameworks */, + A76875842B3417CB00044807 /* KakaoSDKCommon in Frameworks */, + A768757C2B3417CB00044807 /* KakaoSDK in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3A60D7D3A33B2E16F29E7C39 /* Pods */ = { + isa = PBXGroup; + children = ( + A3E3F8B281287F643C8D34C6 /* Pods-JJUNGTABLE.debug.xcconfig */, + 69EB80E332E7BC4DF778CE73 /* Pods-JJUNGTABLE.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + A77857C52AED053200621BB7 /* Resource */ = { + isa = PBXGroup; + children = ( + A77857C72AED058200621BB7 /* Images */, + A77857C62AED057E00621BB7 /* Fonts */, + ); + path = Resource; + sourceTree = ""; + }; + A77857C62AED057E00621BB7 /* Fonts */ = { + isa = PBXGroup; + children = ( + A77857C92AED059800621BB7 /* NPSfont_bold.otf */, + A77857CA2AED059800621BB7 /* NPSfont_extrabold.otf */, + A77857C82AED059800621BB7 /* NPSfont_regular.otf */, + ); + path = Fonts; + sourceTree = ""; + }; + A77857C72AED058200621BB7 /* Images */ = { + isa = PBXGroup; + children = ( + A72BE8D72B28563100C37B40 /* JJUNGIcon.png */, + A7580B9C2AED7090008CBBBB /* AppleIcon.PNG */, + A7580B9D2AED7090008CBBBB /* KakaoIcon.png */, + ); + path = Images; + sourceTree = ""; + }; + A7A7BFF72C0FF95700D470D0 /* CustomView */ = { + isa = PBXGroup; + children = ( + A7A7BFF52C0FF95700D470D0 /* HalfView.swift */, + A7A7BFF62C0FF95700D470D0 /* ScorllView_Example.swift */, + ); + path = CustomView; + sourceTree = ""; + }; + A7C2409F2AE9F60D001E0925 = { + isa = PBXGroup; + children = ( + A7C240AA2AE9F60D001E0925 /* JJUNGTABLE */, + A7C240A92AE9F60D001E0925 /* Products */, + 3A60D7D3A33B2E16F29E7C39 /* Pods */, + C0ABA15EF93D468E057DD47F /* Frameworks */, + ); + sourceTree = ""; + }; + A7C240A92AE9F60D001E0925 /* Products */ = { + isa = PBXGroup; + children = ( + A7C240A82AE9F60D001E0925 /* JJUNGTABLE.app */, + ); + name = Products; + sourceTree = ""; + }; + A7C240AA2AE9F60D001E0925 /* JJUNGTABLE */ = { + isa = PBXGroup; + children = ( + A73F5EAD2AED3F0D00EC6E81 /* JJUNGTABLE.entitlements */, + A71381E22B32BDF7009DA477 /* Document.md */, + A7C240CC2AE9F990001E0925 /* APP */, + A7C240BF2AE9F967001E0925 /* Common */, + A7C240CE2AE9F9EB001E0925 /* View */, + A7C240CD2AE9F9B3001E0925 /* ----Separate----- */, + A77857C52AED053200621BB7 /* Resource */, + A7C240B42AE9F60E001E0925 /* Assets.xcassets */, + A7C240B92AE9F60E001E0925 /* Info.plist */, + A75F34512B033E96005F04B0 /* GoogleService-Info.plist */, + A7C240B62AE9F60E001E0925 /* LaunchScreen.storyboard */, + ); + path = JJUNGTABLE; + sourceTree = ""; + }; + A7C240BF2AE9F967001E0925 /* Common */ = { + isa = PBXGroup; + children = ( + A7A7BFFD2C0FF95700D470D0 /* FB_Functions.swift */, + A7F35A372C16B7B30001C9B7 /* API */, + A7CD15EC2C17EAC800985BB8 /* Modifier */, + A7A7BFF72C0FF95700D470D0 /* CustomView */, + A7CD15ED2C17EADC00985BB8 /* Prj_Common */, + A70FD4C62C1803F100D74D8C /* Login.swift */, + A7DD96F72C1AE12200EF2553 /* EDENON.swift */, + ); + path = Common; + sourceTree = ""; + }; + A7C240CC2AE9F990001E0925 /* APP */ = { + isa = PBXGroup; + children = ( + A7C240AB2AE9F60D001E0925 /* AppDelegate.swift */, + A7C240AD2AE9F60D001E0925 /* SceneDelegate.swift */, + ); + path = APP; + sourceTree = ""; + }; + A7C240CD2AE9F9B3001E0925 /* ----Separate----- */ = { + isa = PBXGroup; + children = ( + ); + path = "----Separate-----"; + sourceTree = ""; + }; + A7C240CE2AE9F9EB001E0925 /* View */ = { + isa = PBXGroup; + children = ( + A7CAF7382B96F17B009D696F /* ContentView.swift */, + ); + path = View; + sourceTree = ""; + }; + A7CD15EC2C17EAC800985BB8 /* Modifier */ = { + isa = PBXGroup; + children = ( + A7A7BFFF2C0FF95700D470D0 /* SwiftUI_Modifier.swift */, + A7CD15EA2C17E6A100985BB8 /* BaseViewModifier.swift */, + A7CD15E82C17E21300985BB8 /* NetworkMonitor.swift */, + A7A7C0002C0FF95700D470D0 /* SwiftUI_Prefix.swift */, + ); + path = Modifier; + sourceTree = ""; + }; + A7CD15ED2C17EADC00985BB8 /* Prj_Common */ = { + isa = PBXGroup; + children = ( + A7A7C0012C0FF95700D470D0 /* UI_Func_Prefix.swift */, + A7A7C0022C0FF95700D470D0 /* ViewModel.swift */, + A7A7BFFE2C0FF95700D470D0 /* Parameter.swift */, + A7BA337C2C09556F005E58A2 /* KEY.swift */, + ); + path = Prj_Common; + sourceTree = ""; + }; + A7F35A372C16B7B30001C9B7 /* API */ = { + isa = PBXGroup; + children = ( + A7A7C00B2C0FFA1300D470D0 /* API.swift */, + A7F35A382C16B89F0001C9B7 /* DataModel.swift */, + ); + path = API; + sourceTree = ""; + }; + C0ABA15EF93D468E057DD47F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0ED741719FC8497EBF8D3021 /* Pods_JJUNGTABLE.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A7C240A72AE9F60D001E0925 /* JJUNGTABLE */ = { + isa = PBXNativeTarget; + buildConfigurationList = A7C240BC2AE9F60E001E0925 /* Build configuration list for PBXNativeTarget "JJUNGTABLE" */; + buildPhases = ( + 37627E50496BF6DE14E8FD09 /* [CP] Check Pods Manifest.lock */, + A7C240A42AE9F60D001E0925 /* Sources */, + A7C240A52AE9F60D001E0925 /* Frameworks */, + A7C240A62AE9F60D001E0925 /* Resources */, + C3093239EF449FE8608C7111 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JJUNGTABLE; + packageProductDependencies = ( + A7C240D92AE9FB00001E0925 /* KakaoSDK */, + A7C240DB2AE9FB00001E0925 /* KakaoSDKAuth */, + A7C240DD2AE9FB00001E0925 /* KakaoSDKCert */, + A7C240DF2AE9FB00001E0925 /* KakaoSDKCertCore */, + A7C240E12AE9FB00001E0925 /* KakaoSDKCommon */, + A7C240E32AE9FB00001E0925 /* KakaoSDKFriend */, + A7C240E52AE9FB00001E0925 /* KakaoSDKFriendCore */, + A7C240E72AE9FB00001E0925 /* KakaoSDKNavi */, + A7C240E92AE9FB00001E0925 /* KakaoSDKShare */, + A7C240ED2AE9FB00001E0925 /* KakaoSDKTalk */, + A7C240EF2AE9FB00001E0925 /* KakaoSDKTemplate */, + A7C240F12AE9FB00001E0925 /* KakaoSDKUser */, + A7C240F42AE9FC42001E0925 /* FirebaseAnalytics */, + A7C240F62AE9FC42001E0925 /* FirebaseAnalyticsOnDeviceConversion */, + A7C240F82AE9FC42001E0925 /* FirebaseAnalyticsSwift */, + A7C240FA2AE9FC42001E0925 /* FirebaseAnalyticsWithoutAdIdSupport */, + A7C240FC2AE9FC42001E0925 /* FirebaseAppCheck */, + A7C240FE2AE9FC42001E0925 /* FirebaseAppDistribution-Beta */, + A7C241002AE9FC42001E0925 /* FirebaseAuth */, + A7C241022AE9FC42001E0925 /* FirebaseAuthCombine-Community */, + A7C241042AE9FC42001E0925 /* FirebaseCrashlytics */, + A7C241062AE9FC42001E0925 /* FirebaseDatabase */, + A7C241082AE9FC42001E0925 /* FirebaseDatabaseSwift */, + A7C2410A2AE9FC42001E0925 /* FirebaseDynamicLinks */, + A7C2410C2AE9FC42001E0925 /* FirebaseFirestore */, + A7C2410E2AE9FC42001E0925 /* FirebaseFirestoreCombine-Community */, + A7C241102AE9FC42001E0925 /* FirebaseFirestoreSwift */, + A7C241122AE9FC42001E0925 /* FirebaseFunctions */, + A7C241142AE9FC42001E0925 /* FirebaseFunctionsCombine-Community */, + A7C241162AE9FC42001E0925 /* FirebaseInAppMessaging-Beta */, + A7C241182AE9FC42001E0925 /* FirebaseInAppMessagingSwift-Beta */, + A7C2411A2AE9FC42001E0925 /* FirebaseInstallations */, + A7C2411C2AE9FC42001E0925 /* FirebaseMLModelDownloader */, + A7C2411E2AE9FC42001E0925 /* FirebaseMessaging */, + A7C241202AE9FC42001E0925 /* FirebasePerformance */, + A7C241222AE9FC42001E0925 /* FirebaseRemoteConfig */, + A7C241242AE9FC42001E0925 /* FirebaseRemoteConfigSwift */, + A7C241262AE9FC42001E0925 /* FirebaseStorage */, + A7C241282AE9FC42001E0925 /* FirebaseStorageCombine-Community */, + A7C2412F2AEA1DCC001E0925 /* SnapKit */, + A768757B2B3417CB00044807 /* KakaoSDK */, + A768757D2B3417CB00044807 /* KakaoSDKAuth */, + A768757F2B3417CB00044807 /* KakaoSDKCert */, + A76875812B3417CB00044807 /* KakaoSDKCertCore */, + A76875832B3417CB00044807 /* KakaoSDKCommon */, + ); + productName = JJUNGTABLE; + productReference = A7C240A82AE9F60D001E0925 /* JJUNGTABLE.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A7C240A02AE9F60D001E0925 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + A7C240A72AE9F60D001E0925 = { + CreatedOnToolsVersion = 15.0.1; + }; + }; + }; + buildConfigurationList = A7C240A32AE9F60D001E0925 /* Build configuration list for PBXProject "JJUNGTABLE" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = A7C2409F2AE9F60D001E0925; + packageReferences = ( + A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */, + A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + A7C2412E2AEA1DCC001E0925 /* XCRemoteSwiftPackageReference "SnapKit" */, + ); + productRefGroup = A7C240A92AE9F60D001E0925 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A7C240A72AE9F60D001E0925 /* JJUNGTABLE */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A7C240A62AE9F60D001E0925 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A7C240B82AE9F60E001E0925 /* LaunchScreen.storyboard in Resources */, + A7580B9F2AED7090008CBBBB /* KakaoIcon.png in Resources */, + A77857CD2AED059800621BB7 /* NPSfont_extrabold.otf in Resources */, + A72BE8D82B28563100C37B40 /* JJUNGIcon.png in Resources */, + A77857CC2AED059800621BB7 /* NPSfont_bold.otf in Resources */, + A75F34522B033E96005F04B0 /* GoogleService-Info.plist in Resources */, + A7580B9E2AED7090008CBBBB /* AppleIcon.PNG in Resources */, + A77857CB2AED059800621BB7 /* NPSfont_regular.otf in Resources */, + A7C240B52AE9F60E001E0925 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 37627E50496BF6DE14E8FD09 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-JJUNGTABLE-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C3093239EF449FE8608C7111 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-JJUNGTABLE/Pods-JJUNGTABLE-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-JJUNGTABLE/Pods-JJUNGTABLE-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JJUNGTABLE/Pods-JJUNGTABLE-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A7C240A42AE9F60D001E0925 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A7DD96F82C1AE12200EF2553 /* EDENON.swift in Sources */, + A7C240AC2AE9F60D001E0925 /* AppDelegate.swift in Sources */, + A7A7C0092C0FF96000D470D0 /* Parameter.swift in Sources */, + A7CD15EB2C17E6A100985BB8 /* BaseViewModifier.swift in Sources */, + A7A7C0082C0FF96000D470D0 /* UI_Func_Prefix.swift in Sources */, + A7A7C00C2C0FFA1300D470D0 /* API.swift in Sources */, + A7BA337D2C09556F005E58A2 /* KEY.swift in Sources */, + A70FD4C72C1803F100D74D8C /* Login.swift in Sources */, + A7F35A392C16B89F0001C9B7 /* DataModel.swift in Sources */, + A7CAF7392B96F17B009D696F /* ContentView.swift in Sources */, + A7A7C0052C0FF96000D470D0 /* SwiftUI_Prefix.swift in Sources */, + A7C240AE2AE9F60D001E0925 /* SceneDelegate.swift in Sources */, + A7CD15E92C17E21300985BB8 /* NetworkMonitor.swift in Sources */, + A7A7C0042C0FF96000D470D0 /* SwiftUI_Modifier.swift in Sources */, + A7A7C0062C0FF96000D470D0 /* ViewModel.swift in Sources */, + A7A7C00A2C0FF96000D470D0 /* FB_Functions.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + A7C240B62AE9F60E001E0925 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A7C240B72AE9F60E001E0925 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + A7C240BA2AE9F60E001E0925 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A7C240BB2AE9F60E001E0925 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A7C240BD2AE9F60E001E0925 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A3E3F8B281287F643C8D34C6 /* Pods-JJUNGTABLE.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = JJUNGTABLE/JJUNGTABLE.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1.0.0.0; + DEVELOPMENT_TEAM = 45MYH7ZHUQ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = JJUNGTABLE/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = JJungTable; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "์˜ˆ์•ฝ ์žฅ์†Œ๋ฅผ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์น˜ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "์ตœ์ ํ™”๋œ ๊ฐœ์ธ ๊ฐ„ ์—ฐ๊ฒฐ๊ณผ ๋งž์ถค ํ—คํƒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "kr.kro.sean-k.JJUNGTABLE"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG FCM"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + A7C240BE2AE9F60E001E0925 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 69EB80E332E7BC4DF778CE73 /* Pods-JJUNGTABLE.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = JJUNGTABLE/JJUNGTABLE.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1.0.0.0; + DEVELOPMENT_TEAM = 45MYH7ZHUQ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = JJUNGTABLE/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = JJungTable; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "์˜ˆ์•ฝ ์žฅ์†Œ๋ฅผ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์น˜ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "์ตœ์ ํ™”๋œ ๊ฐœ์ธ ๊ฐ„ ์—ฐ๊ฒฐ๊ณผ ๋งž์ถค ํ—คํƒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "kr.kro.sean-k.JJUNGTABLE"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = FCM; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A7C240A32AE9F60D001E0925 /* Build configuration list for PBXProject "JJUNGTABLE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A7C240BA2AE9F60E001E0925 /* Debug */, + A7C240BB2AE9F60E001E0925 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A7C240BC2AE9F60E001E0925 /* Build configuration list for PBXNativeTarget "JJUNGTABLE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A7C240BD2AE9F60E001E0925 /* Debug */, + A7C240BE2AE9F60E001E0925 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kakao/kakao-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.18.1; + }; + }; + A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 10.16.0; + }; + }; + A7C2412E2AEA1DCC001E0925 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.6.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + A768757B2B3417CB00044807 /* KakaoSDK */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDK; + }; + A768757D2B3417CB00044807 /* KakaoSDKAuth */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKAuth; + }; + A768757F2B3417CB00044807 /* KakaoSDKCert */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCert; + }; + A76875812B3417CB00044807 /* KakaoSDKCertCore */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCertCore; + }; + A76875832B3417CB00044807 /* KakaoSDKCommon */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCommon; + }; + A7C240D92AE9FB00001E0925 /* KakaoSDK */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDK; + }; + A7C240DB2AE9FB00001E0925 /* KakaoSDKAuth */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKAuth; + }; + A7C240DD2AE9FB00001E0925 /* KakaoSDKCert */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCert; + }; + A7C240DF2AE9FB00001E0925 /* KakaoSDKCertCore */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCertCore; + }; + A7C240E12AE9FB00001E0925 /* KakaoSDKCommon */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKCommon; + }; + A7C240E32AE9FB00001E0925 /* KakaoSDKFriend */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKFriend; + }; + A7C240E52AE9FB00001E0925 /* KakaoSDKFriendCore */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKFriendCore; + }; + A7C240E72AE9FB00001E0925 /* KakaoSDKNavi */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKNavi; + }; + A7C240E92AE9FB00001E0925 /* KakaoSDKShare */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKShare; + }; + A7C240ED2AE9FB00001E0925 /* KakaoSDKTalk */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKTalk; + }; + A7C240EF2AE9FB00001E0925 /* KakaoSDKTemplate */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKTemplate; + }; + A7C240F12AE9FB00001E0925 /* KakaoSDKUser */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240D82AE9FB00001E0925 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; + productName = KakaoSDKUser; + }; + A7C240F42AE9FC42001E0925 /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + A7C240F62AE9FC42001E0925 /* FirebaseAnalyticsOnDeviceConversion */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalyticsOnDeviceConversion; + }; + A7C240F82AE9FC42001E0925 /* FirebaseAnalyticsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalyticsSwift; + }; + A7C240FA2AE9FC42001E0925 /* FirebaseAnalyticsWithoutAdIdSupport */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalyticsWithoutAdIdSupport; + }; + A7C240FC2AE9FC42001E0925 /* FirebaseAppCheck */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAppCheck; + }; + A7C240FE2AE9FC42001E0925 /* FirebaseAppDistribution-Beta */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseAppDistribution-Beta"; + }; + A7C241002AE9FC42001E0925 /* FirebaseAuth */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAuth; + }; + A7C241022AE9FC42001E0925 /* FirebaseAuthCombine-Community */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseAuthCombine-Community"; + }; + A7C241042AE9FC42001E0925 /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; + A7C241062AE9FC42001E0925 /* FirebaseDatabase */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseDatabase; + }; + A7C241082AE9FC42001E0925 /* FirebaseDatabaseSwift */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseDatabaseSwift; + }; + A7C2410A2AE9FC42001E0925 /* FirebaseDynamicLinks */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseDynamicLinks; + }; + A7C2410C2AE9FC42001E0925 /* FirebaseFirestore */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFirestore; + }; + A7C2410E2AE9FC42001E0925 /* FirebaseFirestoreCombine-Community */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseFirestoreCombine-Community"; + }; + A7C241102AE9FC42001E0925 /* FirebaseFirestoreSwift */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFirestoreSwift; + }; + A7C241122AE9FC42001E0925 /* FirebaseFunctions */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFunctions; + }; + A7C241142AE9FC42001E0925 /* FirebaseFunctionsCombine-Community */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseFunctionsCombine-Community"; + }; + A7C241162AE9FC42001E0925 /* FirebaseInAppMessaging-Beta */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseInAppMessaging-Beta"; + }; + A7C241182AE9FC42001E0925 /* FirebaseInAppMessagingSwift-Beta */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseInAppMessagingSwift-Beta"; + }; + A7C2411A2AE9FC42001E0925 /* FirebaseInstallations */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseInstallations; + }; + A7C2411C2AE9FC42001E0925 /* FirebaseMLModelDownloader */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMLModelDownloader; + }; + A7C2411E2AE9FC42001E0925 /* FirebaseMessaging */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMessaging; + }; + A7C241202AE9FC42001E0925 /* FirebasePerformance */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebasePerformance; + }; + A7C241222AE9FC42001E0925 /* FirebaseRemoteConfig */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseRemoteConfig; + }; + A7C241242AE9FC42001E0925 /* FirebaseRemoteConfigSwift */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseRemoteConfigSwift; + }; + A7C241262AE9FC42001E0925 /* FirebaseStorage */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseStorage; + }; + A7C241282AE9FC42001E0925 /* FirebaseStorageCombine-Community */ = { + isa = XCSwiftPackageProductDependency; + package = A7C240F32AE9FC42001E0925 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = "FirebaseStorageCombine-Community"; + }; + A7C2412F2AEA1DCC001E0925 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = A7C2412E2AEA1DCC001E0925 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = A7C240A02AE9F60D001E0925 /* Project object */; +} diff --git a/JJUNGTABLE.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/JJUNGTABLE.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/JJUNGTABLE.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7adaf92 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,140 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", + "version" : "1.2022062300.0" + } + }, + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa", + "version" : "5.8.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "837d4af6ead57cec1fc38007892500d3139c7556", + "version" : "10.16.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "56f681586ff006a7982b53dc94082eea31971acf", + "version" : "10.16.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "aae45a320fd0d11811820335b1eabc8753902a40", + "version" : "9.2.5" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "c38ce365d77b04a9a300c31061c5227589e5597b", + "version" : "7.11.5" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98", + "version" : "1.49.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd", + "version" : "3.1.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "kakao-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kakao/kakao-ios-sdk", + "state" : { + "revision" : "4747117b01d8b28efbfcb004dbd122b8e1626f79", + "version" : "2.18.1" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", + "version" : "1.22.2" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit.git", + "state" : { + "revision" : "f222cbdf325885926566172f6f5f06af95473158", + "version" : "5.6.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "3c54ab05249f59f2c6641dd2920b8358ea9ed127", + "version" : "1.24.0" + } + } + ], + "version" : 2 +} diff --git a/JJUNGTABLE.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..67f8465 Binary files /dev/null and b/JJUNGTABLE.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/JJUNGTABLE.xcodeproj/xcshareddata/xcschemes/JJUNGTABLE.xcscheme b/JJUNGTABLE.xcodeproj/xcshareddata/xcschemes/JJUNGTABLE.xcscheme new file mode 100644 index 0000000..1de72d5 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/xcshareddata/xcschemes/JJUNGTABLE.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e085076 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist b/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..28fea14 --- /dev/null +++ b/JJUNGTABLE.xcodeproj/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,85 @@ + + + + + SchemeUserState + + JJUNGTABLE.xcscheme_^#shared#^_ + + orderHint + 4 + + Promises (Playground) 1.xcscheme + + isShown + + orderHint + 5 + + Promises (Playground) 2.xcscheme + + isShown + + orderHint + 6 + + Promises (Playground).xcscheme + + isShown + + orderHint + 0 + + SnapKitPlayground (Playground) 1.xcscheme + + isShown + + orderHint + 2 + + SnapKitPlayground (Playground) 2.xcscheme + + isShown + + orderHint + 3 + + SnapKitPlayground (Playground) 3.xcscheme + + isShown + + orderHint + 7 + + SnapKitPlayground (Playground) 4.xcscheme + + isShown + + orderHint + 8 + + SnapKitPlayground (Playground) 5.xcscheme + + isShown + + orderHint + 9 + + SnapKitPlayground (Playground).xcscheme + + isShown + + orderHint + 1 + + + SuppressBuildableAutocreation + + A7C240A72AE9F60D001E0925 + + primary + + + + + diff --git a/JJUNGTABLE.xcworkspace/contents.xcworkspacedata b/JJUNGTABLE.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a9eb0a6 --- /dev/null +++ b/JJUNGTABLE.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/JJUNGTABLE.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/JJUNGTABLE.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/JJUNGTABLE.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/JJUNGTABLE.xcworkspace/xcshareddata/swiftpm/Package.resolved b/JJUNGTABLE.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..fda98c2 --- /dev/null +++ b/JJUNGTABLE.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,149 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", + "version" : "1.2022062300.0" + } + }, + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad", + "version" : "5.8.1" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "5746b2d35c91c50581590ed97abe4c06b5037274", + "version" : "10.18.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "c60c958e707c50a9cf8bcb7cfd7d51c566d726c5", + "version" : "10.19.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "6b332152355c372ace9966d8ee76ed191f97025e", + "version" : "10.17.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a732a4b47f59e4f725a2ea10f0c77e93a7131117", + "version" : "9.3.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "bc27fad73504f3d4af235de451f02ee22586ebd3", + "version" : "7.12.1" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98", + "version" : "1.49.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "115f75e43851774934d695449a4836123c3246e1", + "version" : "3.2.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "kakao-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kakao/kakao-ios-sdk", + "state" : { + "revision" : "ae3c60cbd4e3b348775f8c766e5b908fa1e66c5a", + "version" : "2.20.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "9d108e9112aa1d65ce508facf804674546116d9c", + "version" : "1.22.3" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit.git", + "state" : { + "revision" : "f222cbdf325885926566172f6f5f06af95473158", + "version" : "5.6.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "65e8f29b2d63c4e38e736b25c27b83e012159be8", + "version" : "1.25.2" + } + } + ], + "version" : 2 +} diff --git a/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..62874c6 Binary files /dev/null and b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..8d72359 --- /dev/null +++ b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..ce30820 --- /dev/null +++ b/JJUNGTABLE.xcworkspace/xcuserdata/seankim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,93 @@ + + + + + SchemeUserState + + Promises (Playground) 1.xcscheme + + isShown + + orderHint + 5 + + Promises (Playground) 2.xcscheme + + isShown + + orderHint + 6 + + Promises (Playground) 3.xcscheme + + isShown + + orderHint + 12 + + Promises (Playground) 4.xcscheme + + isShown + + orderHint + 13 + + Promises (Playground) 5.xcscheme + + isShown + + orderHint + 14 + + Promises (Playground).xcscheme + + isShown + + orderHint + 4 + + SnapKitPlayground (Playground) 1.xcscheme + + isShown + + orderHint + 8 + + SnapKitPlayground (Playground) 2.xcscheme + + isShown + + orderHint + 9 + + SnapKitPlayground (Playground) 3.xcscheme + + isShown + + orderHint + 3 + + SnapKitPlayground (Playground) 4.xcscheme + + isShown + + orderHint + 10 + + SnapKitPlayground (Playground) 5.xcscheme + + isShown + + orderHint + 11 + + SnapKitPlayground (Playground).xcscheme + + isShown + + orderHint + 7 + + + + diff --git a/JJUNGTABLE/.DS_Store b/JJUNGTABLE/.DS_Store new file mode 100644 index 0000000..c8a17b8 Binary files /dev/null and b/JJUNGTABLE/.DS_Store differ diff --git a/JJUNGTABLE/APP/AppDelegate.swift b/JJUNGTABLE/APP/AppDelegate.swift new file mode 100644 index 0000000..9fd06a5 --- /dev/null +++ b/JJUNGTABLE/APP/AppDelegate.swift @@ -0,0 +1,376 @@ +// +// AppDelegate.swift +// JJUNGTABLE +// +// Created by Sean Kim on 10/26/23. +// + +import UIKit +import SwiftUI +import Combine + +import UserNotifications + +import Firebase +import FirebaseMessaging + +import KakaoSDKCommon + + + + +@main +class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate{ + var viewModel = ViewModel() + + private var cancellables = Set() + private var version: [Version] = [] + + private let gcmMessageIDKey = "gcm.message_id" + +// private var cancellables = Set() +// private var versions: [Version] = [] + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + } + + private func checkVersion() { + API.shared.readData(path: "/db/version/read", + queryItems: [URLQueryItem(name: "os_type", value: "I")]) + .sink { completion in + switch completion { + case .finished: + printLog(self.version) + + //ํ˜„์žฌ ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ ๋ฒ„์ „๋ณด๋‹ค OOO ํ•˜๋‹ค + switch compareVersion(currentVersion(), self.version[0].update_ver) { + case .bigger: + self.viewModel.isUpdate = "N" + case .smaller, .equal: + self.viewModel.isUpdate = "Y" + case .error: + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + + switch compareVersion(currentVersion(), self.version[0].final_ver) { + case .bigger, .equal: + // ํ˜„์žฌ ๋ฒ„์ „์ด ์Šคํ† ์–ด ๋ฒ„์ „๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์„ ๊ฐ™์„ ๋–„ - ์ด์ƒ x + break + case .smaller: + let choice = self.version[0].update_choice == "Y" ? true : false + switch compareVersion(currentVersion(), self.version[0].force_ver) { + case .bigger, .equal: + // ํ˜„์žฌ ๋ฒ„์ „์ด ๊ฐ•์—…๋ณด๋‹ค ๋†’๋‹ค + if !choice { + break // ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ๋‚ดํ•  ํ•„์š” ์—†์Œ + } + else { + self.viewModel.alertData = .init(title: "์—…๋ฐ์ดํŠธ ์•ˆ๋‚ด", + body: """ + ์•ฑ ์ตœ์‹  ๋ฒ„์ „์ด ์ƒˆ๋กœ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. + ์ง€๊ธˆ ์—…๋ฐ์ดํŠธ ํ•˜์‹œ๊ฒ ์–ด์š”? + """, + button: [ButtonType(name: "์ง€๊ธˆ ์—…๋ฐ์ดํŠธ", role: .cancel , + function: {exit(1)}), + ButtonType(name: "๋‚˜์ค‘์—", role: .none , + function: nil), + ]) + self.viewModel.showAlert.toggle() + } + case .smaller: + // ํ˜„์žฌ ๋ฒ„์ „์ด ๊ฐ•์—…๋ณด๋‹ค ๋‹ž๋‹ค -> ๊ฐ•์—…์„ ํ•ด์•ผ ํ•œ๋‹ค. + self.viewModel.alertData = .init(title: "์—…๋ฐ์ดํŠธ ์•ˆ๋‚ด", + body: """ + ์‹œ์Šคํ…œ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. + ์•ฑ์„ ์ข…๋ฃŒํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. + """, + button: [ButtonType(name: "์ง€๊ธˆ ์—…๋ฐ์ดํŠธ", role: .none, + function: {exit(1)})]) + self.viewModel.showAlert.toggle() + case .error: + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + case .error: + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + // ๋ฒ„์ „ ๋น„๊ต ์ฒ˜๋ฆฌ + case .failure(let error): + printLog(error) + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + } receiveValue: { data in + do { + let decoder = JSONDecoder() + self.version = try decoder.decode([Version].self, from: data) + } catch { + printLog(error) + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + } + .store(in: &cancellables) + } +} + + +// MARK: - ๊ธฐ์ดˆ ์…‹์—… +extension AppDelegate { + func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + printLog("Start Set AppDelegate") + if isIllegalDevice() { + viewModel.alertData = .init(title:"๊ฒฝ๊ณ ", + body: """ + ๋ณ€๊ฒฝ๋œ OS('ํƒˆ์˜ฅ'๋“ฑ)์˜ ์Šค๋งˆํŠธํฐ์€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. + """, + button: [ButtonType(name: "ํ™•์ธ", role: .none , + function: {exit(1)})]) + viewModel.showAlert.toggle() + } + else { + checkVersion() + + // Firebase ์„ค์ • + FirebaseApp.configure() + + + // App Check ์„ค์ • + // AppCheck.setAppCheckProviderFactory(AppCheckDebugProviderFactory()) + + // ์นด์นด์˜ค SDK ์ดˆ๊ธฐํ™” ์ฝ”๋“œ + KakaoSDK.initSDK(appKey: KEY.kakaoAppKey) + +#if FCM + // FCM ์„ค์ • + Messaging.messaging().delegate = self +#endif + // Noti ์„ค์ • + UNUserNotificationCenter.current().delegate = self + + let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] + UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in + if let error = error { + printLog("Authorization error: \(error.localizedDescription)") + } + if granted { + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + } else { + printLog("Notification permission denied.") + } + } + + application.registerForRemoteNotifications() + UIApplication.shared.registerForRemoteNotifications() + + // ๋„คํŠธ์›Œํฌ ๋ชจ๋‹ˆํ„ฐ ์ดˆ๊ธฐํ™” + _ = NetworkMonitor.shared + } + + printLog("End Set AppDelegate") + return true + } + + + func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + } + + +} + +extension AppDelegate { + + // 24.05.30 (์ˆ˜์ •์™„) - ์•ฑ์ด ์›๊ฒฉ ํ‘ธ์‹œ ์•Œ๋ฆผ ๋“ฑ๋ก์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ์นœ ํ›„ ํ˜ธ์ถœ + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + + // ํŒŒ์ด์–ด ๋ฒ ์ด์Šค SMS ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์„ธํŒ… + Auth.auth().setAPNSToken(deviceToken, type: .unknown) + + printLog("์›๊ฒฉ ํ‘ธ์‹œ ์•Œ๋ฆผ ๋“ฑ๋ก ์„ฑ๊ณต ") + + let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02.2hX", $1)}) + viewModel.deviceToken = deviceTokenString + + // Firebase์— ๋””๋ฐ”์ด์Šค ํ† ํฐ ๋“ฑ๋ก + Messaging.messaging().apnsToken = deviceToken + printLog("DeviceToken: \(viewModel.deviceToken)") + } + + // 24.05.30 (์ˆ˜์ •์™„) - ์ดˆ๊ธฐ FCMํ† ํฐ ๋“ฑ๋ก + func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { + @UserDefault (key: "isRegisterToken", defaultValue: "F") var isRegisterToken + printLog("ํ† ํฐ ๋“ฑ๋ก ๋™์ž‘ ์‹œ์ž‘") + guard let fcmToken = fcmToken else { return } + viewModel.pushFCMToken = fcmToken + + Task { + if isRegisterToken == "F" { +// switch await FB_CRUD.shared.create("Token", doc: "\(viewModel.deviceToken)", +// data: ["fcmToken":"\(viewModel.pushFCMToken)"]) { +// case .success(_): +// viewModel.pushFCMToken = fcmToken +// isRegisterToken = "T" +// printLog("์ดˆ๊ธฐ ํ† ํฐ ๋“ฑ๋ก ์„ฑ๊ณต") +// case .failure(let error): +// isRegisterToken = "F" +// viewModel.alertData = .init(body:""" +// ์‹œ์Šคํ…œ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. +// ์•ฑ์„ ์ข…๋ฃŒํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. +// """, +// button: [ButtonType(name: "์ข…๋ฃŒ", role: .destructive ,function: {exit(1)})]) +// viewModel.showAlert.toggle() +// printLog("์ดˆ๊ธฐ ํ† ํฐ ๋“ฑ๋ก ์‹คํŒจ") +// } + } + else { +// if viewModel.pushFCMToken != fcmToken { +// switch await FB_CRUD.shared.update("Token", doc: "\(viewModel.deviceToken)", +// data: ["fcmToken":"\(viewModel.pushFCMToken)"]) { +// case .success(_): +// viewModel.pushFCMToken = fcmToken +// isRegisterToken = "T" +// printLog("ํ† ํฐ ์žฌ๋“ฑ๋ก ์„ฑ๊ณต") +// case .failure(_): +// viewModel.alertData = .init(body:""" +// ์‹œ์Šคํ…œ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. +// ์•ฑ์„ ์ข…๋ฃŒํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. +// """, +// button: [ButtonType(name: "์ข…๋ฃŒ", role: .destructive ,function: {exit(1)})]) +// viewModel.showAlert.toggle() +// printLog("ํ† ํฐ ์žฌ๋“ฑ๋ก ์‹คํŒจ") +// } +// } + } + printLog("FCM Token: \(viewModel.pushFCMToken)") + } + } + + + // ์•ฑ ์ผœ์ ธ์žˆ์„๋•Œ ์•Œ๋Ÿฟ ๋ฐ›์œผ๋ฉด + func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions { + + let userInfo = notification.request.content.userInfo + + //ํŒŒ์ด์–ด ๋ฒ ์ด์Šค SMS ์ˆ˜์‹ ์„ค์ • ๋ถ€ + if Auth.auth().canHandleNotification(userInfo) { + return [] + } + + if let apsData = userInfo["aps"] as? [AnyHashable: Any], + let messageId = userInfo["gcm.message_id"] as? String, + let badge = apsData["badge"] as? Int { + +// switch await FB_CRUD.shared.read("Users", doc: "\(viewModel.userId)") { +// case .success(let data): +// if var noReadList = data["noReadAlert"] as? [String] { +// noReadList.append(messageId) +// viewModel.noReadAlertList = noReadList +// switch await FB_CRUD.shared.update("Users", doc: "\(viewModel.userId)", +// data: ["noReadAlert":noReadList]) { +// case .success(let data): +// await viewModel.setBadge() +// case .failure(let gg): +// printLog(noReadList) +// } +// printLog(viewModel.noReadAlertList) +// printLog(viewModel.noReadAlertList.count) +// +// } +// case .failure(let failure): +// printLog(failure) +// } + + } + + Messaging.messaging().appDidReceiveMessage(userInfo) + + + + + if #available(iOS 14.0, *) { + return [[.list,.banner,.sound]] + } else { + return[[.alert,.sound]] + } + + + + } + + // Background ์ƒํƒœ์—์„œ ์ˆ˜์‹  ๋ฐ›์€ Notification์„ ํ„ฐ์น˜ํ•ด ์•ฑ์œผ๋กœ ์ง„์ž…ํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ + func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) { + printLog("ININININININi") + let userInfo = response.notification.request.content.userInfo + + //ํŒŒ์ด์–ด ๋ฒ ์ด์Šค SMS ์ˆ˜์‹ ์„ค์ • ๋ถ€ + if Auth.auth().canHandleNotification(userInfo) { + return + } + + if let apsData = userInfo["aps"] as? [AnyHashable: Any] { + if let alert = apsData["alert"] as? [AnyHashable: Any], + let messageKey = apsData[gcmMessageIDKey] as? String { + printLog("apsData: \(apsData)") + printLog("alert: \(alert)") + printLog("key: \(messageKey)") + if let param = alert["parameter"] { + printLog(param as? String) + } +// viewModel.setBadge() + } + } + } + + func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + + // ํŒŒ์ด์–ด ๋ฒ ์ด์Šค SMS ์„ค์ •๋ถ€ + if Auth.auth().canHandleNotification(userInfo) { + completionHandler(.noData) + return + } + +// printLog("Back = \(userInfo)") +// FB_CRUD.shared.sendPushNotification("ํ™•์ธ", body: "ํ™•์ธ") +// @UserDefault (key: "fcmToken", defaultValue: "") var pushFCMToken +// @UserDefault (key: "userId", defaultValue: "") var userId +// @UserDefault (key: "noReadAlertList", defaultValue: [""]) var noReadAlertList +// +// let userInfo = notification.request.content.userInfo +// +// if let apsData = userInfo["aps"] as? [AnyHashable: Any], +// let messageId = userInfo["gcm.message_id"] as? String, +// let badge = apsData["badge"] as? Int { +// +// switch await FB_CRUD.shared.read("Users", doc: "\(userId)") { +// case .success(let data): +// printLog(data) +// if var noReadList = data["noReadAlert"] as? [String] { +// noReadList.append(messageId) +// noReadAlertList = noReadList +// await FB_CRUD.shared.update("Users", doc: "\(userId)", +// data: ["noReadAlert":noReadList]) +// printLog(noReadList) +// printLog(noReadAlertList) +// printLog(noReadAlertList.count) +// await viewModel.setBadge(badge: noReadAlertList.count) +// } +// case .failure(let failure): +// printLog(failure) +// } +// +// } + } + + +} + + + diff --git a/JJUNGTABLE/APP/SceneDelegate.swift b/JJUNGTABLE/APP/SceneDelegate.swift new file mode 100644 index 0000000..957a9f4 --- /dev/null +++ b/JJUNGTABLE/APP/SceneDelegate.swift @@ -0,0 +1,88 @@ +// +// SceneDelegate.swift +// JJUNGTABLE +// +// Created by Sean Kim on 10/26/23. +// + +import UIKit +import SwiftUI + +import KakaoSDKAuth + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? +// private var appCoordinator: AppCordinator? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } + guard let windowScene = scene as? UIWindowScene else { return } + var contentView = ContentView().environmentObject(appDelegate.viewModel) + + window = UIWindow(windowScene: windowScene) + window?.rootViewController = UIHostingController(rootView: contentView) + window?.makeKeyAndVisible() +// self.window = window + + /* + let navigationController = UINavigationController() + + navigationController.navigationBar.isHidden = true + navigationController.interactivePopGestureRecognizer?.isEnabled = false + + self.appCoordinator = AppCordinator(navigationController: navigationController) + self.appCoordinator?.choiceVC(.intro, isPop: F) + + window = UIWindow(windowScene: windowScene) + window?.windowScene = windowScene + window?.rootViewController = navigationController + window?.makeKeyAndVisible() + */ + + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + + // ์นด์นด์˜คํ†ก ์„ค์ • ๋ถ€๋ถ„ + if let url = URLContexts.first?.url { + if url.scheme == "ํŠน์ •์Šคํ‚ค๋งˆ" { + //๋™์ž‘ + } + else if AuthApi.isKakaoTalkLoginUrl(url) { + _ = AuthController.handleOpenUrl(url: url) + } + } + } + +} + diff --git a/JJUNGTABLE/Assets.xcassets/.DS_Store b/JJUNGTABLE/Assets.xcassets/.DS_Store new file mode 100644 index 0000000..95c40d9 Binary files /dev/null and b/JJUNGTABLE/Assets.xcassets/.DS_Store differ diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/Contents.json b/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..bab6132 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "JJungTable_Icon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/JJungTable_Icon.png b/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/JJungTable_Icon.png new file mode 100644 index 0000000..bbdf5e3 Binary files /dev/null and b/JJUNGTABLE/Assets.xcassets/1. New Set/AppIcon.appiconset/JJungTable_Icon.png differ diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/BrandColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/1. New Set/BrandColor.colorset/Contents.json new file mode 100644 index 0000000..0ccc4a4 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/1. New Set/BrandColor.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "68", + "green" : "83", + "red" : "230" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.267", + "green" : "0.325", + "red" : "0.902" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/Contents.json b/JJUNGTABLE/Assets.xcassets/1. New Set/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/1. New Set/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/KakaoColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/1. New Set/KakaoColor.colorset/Contents.json new file mode 100644 index 0000000..4093b9d --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/1. New Set/KakaoColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.294", + "green" : "0.886", + "red" : "0.965" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/1. New Set/PageBackColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/1. New Set/PageBackColor.colorset/Contents.json new file mode 100644 index 0000000..4bf8506 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/1. New Set/PageBackColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "184", + "green" : "220", + "red" : "255" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Contents.json b/JJUNGTABLE/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/AccentColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..73620ba --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.310", + "green" : "0.800", + "red" : "0.969" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/BackColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/BackColor.colorset/Contents.json new file mode 100644 index 0000000..7803d70 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/BackColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.699", + "green" : "0.699", + "red" : "0.699" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.699", + "green" : "0.699", + "red" : "0.699" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/BrandBackColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/BrandBackColor.colorset/Contents.json new file mode 100644 index 0000000..cfe2136 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/BrandBackColor.colorset/Contents.json @@ -0,0 +1,23 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0", + "green" : "102", + "red" : "255" + } + }, + "idiom" : "iphone" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/GreenColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/GreenColor.colorset/Contents.json new file mode 100644 index 0000000..a80bf12 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/GreenColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.250", + "green" : "0.650", + "red" : "0.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/SeparateColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/SeparateColor.colorset/Contents.json new file mode 100644 index 0000000..8024a51 --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/SeparateColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.251", + "green" : "0.251", + "red" : "0.251" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.251", + "green" : "0.251", + "red" : "0.251" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Assets.xcassets/Old Color/ViewBackColor.colorset/Contents.json b/JJUNGTABLE/Assets.xcassets/Old Color/ViewBackColor.colorset/Contents.json new file mode 100644 index 0000000..ec4f65c --- /dev/null +++ b/JJUNGTABLE/Assets.xcassets/Old Color/ViewBackColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "0.200", + "blue" : "0.698", + "green" : "0.698", + "red" : "0.698" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "0.200", + "blue" : "0.698", + "green" : "0.698", + "red" : "0.698" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/JJUNGTABLE/Base.lproj/LaunchScreen.storyboard b/JJUNGTABLE/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..8f52db3 --- /dev/null +++ b/JJUNGTABLE/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + NPS-font-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JJUNGTABLE/Common/API/API.swift b/JJUNGTABLE/Common/API/API.swift new file mode 100644 index 0000000..cd053eb --- /dev/null +++ b/JJUNGTABLE/Common/API/API.swift @@ -0,0 +1,93 @@ +// +// API.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/5/24. +// + +import SwiftUI +import Combine + +struct InfoKey { + static var httpURL: String { + return Bundle.main.object(forInfoDictionaryKey: "httpURL") as? String ?? "" + } + + static var httpsURL: String { + return Bundle.main.object(forInfoDictionaryKey: "httpsURL") as? String ?? "" + } + + static var apiPort: String { + return Bundle.main.object(forInfoDictionaryKey: "PORT") as? String ?? "" + } +} + +class API { + static let shared = API() + + private init() {} + + private func makeURLComponents(path: String, queryItems: [URLQueryItem]? = nil) -> Result { +// let url = InfoKey.httpURL +// let port = InfoKey.apiPort + let url = "https://ipstein.myds.me" + let port = "5004" + let path = "/JJ\(path)" + + printLog("\(url):\(port)\(path)?\(queryItems)") + + if url == "" || port == "" { + return .failure(API_ERROR(caseType: .API_PLIST_WRONG, message: "์ €์žฅ๋œ API ์ฃผ์†Œ ์˜ค๋ฅ˜")) + } + + guard var components = URLComponents(string: url) else { + return .failure(API_ERROR(caseType: .API_PATH_WRONG, message: "API ์ฃผ์†Œ ์˜ค๋ฅ˜")) + } + components.port = Int(port) + components.path = path + components.queryItems = queryItems + + return .success(components) + } + + func createUserInfo() -> AnyPublisher<[UserInfo], Error> { +// switch self.makeURLComponents() { +// case .success(let components): +// break +// case .failure(let error): +// return Fail(error: error) +// .eraseToAnyPublisher() +// } + + return Fail(error: API_ERROR(caseType: .API_PATH_WRONG, message: "API ์ฃผ์†Œ ์˜ค๋ฅ˜")) + .eraseToAnyPublisher() + } + + func readData(path: String, queryItems: [URLQueryItem]? = nil) -> AnyPublisher { + switch self.makeURLComponents(path: path, queryItems: queryItems) { + case .success(let components): + guard let url = components.url else { + return Fail(error: API_ERROR(caseType: .API_PATH_WRONG, message: "API ์ฃผ์†Œ ์˜ค๋ฅ˜")) + .eraseToAnyPublisher() + } + return URLSession.shared.dataTaskPublisher(for: url) + .tryMap { result in + guard let httpResponse = result.response as? HTTPURLResponse, httpResponse.statusCode == 200 else { + throw API_ERROR(caseType: .API_CONNECT, message: "์„œ๋ฒ„ ์ ‘์† ์˜ค๋ฅ˜") + } + return result.data + } + .mapError { error in + return API_ERROR(caseType: .API_READ, message: "\(error.localizedDescription)") + } + .receive(on: DispatchQueue.main) + .eraseToAnyPublisher() + + case .failure(let error): + return Fail(error: error) + .eraseToAnyPublisher() + } + + } + +} diff --git a/JJUNGTABLE/Common/API/DataModel.swift b/JJUNGTABLE/Common/API/DataModel.swift new file mode 100644 index 0000000..ad670e4 --- /dev/null +++ b/JJUNGTABLE/Common/API/DataModel.swift @@ -0,0 +1,39 @@ +// +// DataModel.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/10/24. +// + +import Foundation + +struct Version: Codable { + let os_type: String + let final_ver: String + let force_ver: String + let update_ver: String + let update_choice: String +} + +struct UserInfo: Codable, Identifiable { + let id: String + let connect_type: String + let os_type: String + let table_id: String + let name: String + let birth: String + + private enum CodingKeys: String, CodingKey { + case id = "user_cid" + case connect_type + case os_type + case table_id + case name + case birth + } +} + +struct UserCID: Codable { + let user_cid: String +} + diff --git a/JJUNGTABLE/Common/CustomView/HalfView.swift b/JJUNGTABLE/Common/CustomView/HalfView.swift new file mode 100644 index 0000000..4a24620 --- /dev/null +++ b/JJUNGTABLE/Common/CustomView/HalfView.swift @@ -0,0 +1,97 @@ +// +// HalfView.swift +// PersonalHealthDiary +// +// Created by Sean Kim on 3/6/24. +// + +import SwiftUI + +//struct HalfView: View { +// @State var showSheet: Bool = false +// +// var body: some View { +//// NavigationView { +// Button { +// showSheet.toggle() +// } label: { +// Text("Button Click2") +// } +// .halfSheet(showSheet: $showSheet) { +// Text("HELLO HALF") +// } onEnd: { +// print("?") +// } +// // } +// } +//} + +extension View { + func halfSheet(showSheet: Binding, @ViewBuilder sheetView: @escaping ()->SheetView, onEnd: @escaping ()->() ) -> some View { + return self + .background( + // ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋กœ๋Š” ์Šค์œ ์˜ ์‚ฌ์ด์ฆˆ๋กœ๋งŒ ์‚ฌ์šฉํ• ๊ฒƒ์ด๋‹ˆ๊นŒ + HalfSheetHelper(sheetView: sheetView(), showSheet: showSheet, onEnd: onEnd) + ) + } +} + +//UIKit์„ ์จ์•ผ ํ•˜๋Š”๊ฒƒ ๊ฐ™์Œ +struct HalfSheetHelper: UIViewControllerRepresentable { + + var sheetView: SheetView + @Binding var showSheet: Bool + var onEnd: ()->() + // ๋‚˜์ค‘์— ํ˜ธ์ถœ์‹œ ์ด๊ฑฐ ์ˆœ์„œ ๋”ฐ๋ผ์„œ ์ธ์ˆ˜ ์œ„์น˜๋„ ๋ฐ”๋€œ + + let vc = UIViewController() + + func makeCoordinator() -> Coordinator { + return Coordinator(parent: self) + } + + func makeUIViewController(context: Context) -> UIViewController { + vc.view.backgroundColor = .clear + return vc + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + if showSheet { + let sheetController = CustomHostingController(rootView: sheetView) + sheetController.presentationController?.delegate = context.coordinator + uiViewController.present(sheetController, animated: true) + } + else { + // showSheet ๊ฐ€ ํ† ๊ธ€ ๋˜์–ด view ๊ฐ€ ๋‹ซํž ๋•Œ +// uiViewController.dismiss(animated: true) + uiViewController.presentedViewController?.dismiss(animated: true) + } + } + + // ์ข…๋ฃŒ + class Coordinator: NSObject, UISheetPresentationControllerDelegate { + + var parent: HalfSheetHelper + + init(parent: HalfSheetHelper) { + self.parent = parent + } + + func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { + parent.showSheet = false + parent.onEnd() + } + } +} + +class CustomHostingController: UIHostingController { + override func viewDidLoad() { +// view.backgroundColor = .clear + // ๋ณด์—ฌ์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ”„๋กœํผํ‹ฐ ์„ค์ • ๋ถ€ + if let presentationController = presentationController as? UISheetPresentationController { + presentationController.detents = [.medium()] + // ๋ชจ๋‹ฌ ๋ทฐ ์œ„์— ์ž‘๊ฒŒ ๋ฐ” ํ‘œ์‹œ ์žˆ๋Š”๊ฑฐ + presentationController.prefersGrabberVisible = false + } + } +} diff --git a/JJUNGTABLE/Common/CustomView/ScorllView_Example.swift b/JJUNGTABLE/Common/CustomView/ScorllView_Example.swift new file mode 100644 index 0000000..a7a61d8 --- /dev/null +++ b/JJUNGTABLE/Common/CustomView/ScorllView_Example.swift @@ -0,0 +1,103 @@ +// +// ScorllView_Example.swift +// RememberbyAnything +// +// Created by Sean Kim on 5/14/24. +// +import SwiftUI + +struct ScorllView_Example: View { + @StateObject private var scrollViewModel: ScrollViewModel = ScrollViewModel() + @State var isStartScroll: Bool = true + + // scroll ์œ„์น˜ ๊ฐ์ง€ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€๋ถ„ + private var scrollObservableView: some View { + GeometryReader { proxy in + let offsetY = proxy.frame(in: .global).origin.y + Color.clear + .preference( + key: ScrollOffsetKey.self, + value: offsetY + + ) + .onAppear { + scrollViewModel.setOriginOffset(offsetY) + } + } + .frame(height: 0) + } + + var body: some View { + ScrollViewReader { scroll in + ScrollView(showsIndicators: false) { + scrollObservableView.id(-1) + } + .onPreferenceChange(ScrollOffsetKey.self) { + scrollViewModel.setOffset($0) + self.isStartScroll = scrollViewModel.isStartScroll + } + // ์Šคํฌ๋กค์ด ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ๋ฒ„ํŠผ ๊ทธ๋ฆฌ๊ธฐ + .overlay(alignment: .top) { + if isStartScroll { + GeometryReader { geo in + Button { + withAnimation { + scroll.scrollTo(-1, anchor: .center) + } + } label: { + Icon.up + .font(.nps(size: 30)) + .foregroundStyle(.brandDeepBlue) + .frame(width: geo.size.width, height: isStartScroll ? 30 : 0,alignment: .center) + .padding(.init(top: 10, leading: 0, bottom: 20, trailing: 0)) + .background( + LinearGradient( + colors: [.whiteSora, .whiteSora.opacity(0)], + startPoint: .top, + endPoint: .bottom) + ) + } + } + } + } + + } + } +} +// MARK: - ์Šคํฌ๋กค ๋ทฐ ๊ด€๋ จ modifier +struct HeightPreferenceKey: PreferenceKey { + static var defaultValue: CGFloat = 0 + + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value = nextValue() + } +} + +// ์ž์‹๋ทฐ์—์„œ ์ƒ์œ„ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์‹œ ์‚ฌ์šฉ = PreferenceKey +struct ScrollOffsetKey: PreferenceKey { + static var defaultValue: CGFloat = .zero + + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value += nextValue() + } +} + +final class ScrollViewModel: ObservableObject { + @Published var offset: CGFloat = 0 + @Published var isStartScroll: Bool = false + var originOffset: CGFloat = 0 + var isCheckedOriginOffset: Bool = false + + func setOriginOffset(_ offset: CGFloat) { + guard !isCheckedOriginOffset else { return } + self.originOffset = offset - 30 // ์Šคํฌ๋กค ํŒจ๋”ฉ ๋„ฃ์€๊ฑฐ ๋งŒํผ ๋นผ์•ผ ํ•จ + self.offset = offset + isCheckedOriginOffset = true + } + + func setOffset(_ offset: CGFloat) { + self.offset = offset + if self.offset < self.originOffset { isStartScroll = true } + else { isStartScroll = false } + } +} diff --git a/JJUNGTABLE/Common/EDENON.swift b/JJUNGTABLE/Common/EDENON.swift new file mode 100644 index 0000000..dcc8943 --- /dev/null +++ b/JJUNGTABLE/Common/EDENON.swift @@ -0,0 +1,269 @@ +// +// EDENON.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/13/24. +// + +import Foundation +import Combine + +/* +์•”ํ˜ธํ™” (5๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ) +์˜ˆ์‹œ) + ๊ฐ’: 12345678 + ํ‚ค: 20240612 + +0๋‹จ๊ณ„ +์•”ํ˜ธํ™” ์‹œํ‚ฌ ๋ฒˆํ˜ธ์™€ ํ‚ค์˜ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๋‘˜์ด ๊ฐ™์€์ง€ ํ™•์ธ + +1๋‹จ๊ณ„ +์•”ํ˜ธํ™” ์‹œํ‚ฌ ๊ฐ’๊ณผ ํ‚ค๋ฅผ ์ž๋ฆฌ์ˆ˜ ๋Œ€๋กœ ๋ง์…ˆ์„ ํ•ด์ค€๋‹ค. + - ๋งŒ์ผ 1์ž๋ฆฌ ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ์•ž์— 0์„ ๋ถ™์—ฌ์„œ ํ‘œ์‹œํ•œ๋‹ค. +์˜ˆ์‹œ) + 1 2 3 4 5 6 7 8 + 2 0 2 4 0 6 1 2 + +๊ฒฐ๊ณผ: 03 02 05 08 05 12 08 10 + +2๋‹จ๊ณ„ +1๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ(๊ธธ์ด: n)์—์„œ 1๋ฒˆ์งธ์™€ n๋ฒˆ์งธ๋ฅผ ๋ฌถ๊ณ  2๋ฒˆ์งธ์™€ n-1๋ฒˆ์งธ 3๋ฒˆ์งธ์™€ n-2๋ฒˆ์งธ๋ฅผ ์ค‘์•™์ด ๋  ๋•Œ๊นŒ์ง€ ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค. +์˜ˆ์‹œ) + 03 02 05 08 05 12 08 10 + +๊ฒฐ๊ณผ: 0310 0208 0512 0805 + +3๋‹จ๊ณ„ +2๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์—์„œ ๋‚˜ํƒ€๋‚œ ๊ทธ๋ฃน๋“ค์„ ์ˆœ์„œ์— ๋งž๊ฒŒ ํŠน์ •ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. +์ฒซ๋ฒˆ์งธ ๊ทธ๋ฃน์€ 1๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ ์ˆซ์ž๋ฅผ ๋–ผ์„œ ๋‚จ์•„์žˆ๋Š” ์ˆซ์ž์˜ ๋’ค์— ๋ถ™์ด๊ณ , +๋‘๋ฒˆ์งธ ๊ทธ๋ฃน์€ 1~2๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ ์ˆซ์ž๋ฅผ ๋–ผ์„œ ๋‚จ์•„์žˆ๋Š” ์ˆซ์ž์˜ ๋’ค์— ๋ถ™์ด๊ณ , +์„ธ๋ฒˆ์งธ ๊ทธ๋ฃน์€ 1~3๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋–ผ์„œ ๋‚จ์•„์žˆ๋Š” ์ˆซ์ž์˜ ๋’ค์— ๋ถ™์ธ๋‹ค. +๋„ค๋ฒˆ์งธ ๊ทธ๋ฃน์€ 1~4๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋–ผ์„œ ๋‚จ์•„์žˆ๋Š” ์ˆซ์ž์˜ ๋’ค์— ๋ถ™์ธ๋‹ค. +์˜ˆ์‹œ) + 0310 0208 0512 0805 + ์ฒซ๋ฒˆ์งธ: 0310 -> 0 ์„ ๋—€๋‹ค -> ๋‚จ์•„์žˆ๋Š” ์ˆ˜: 310 -> ๋’ค์— ๋ถ™์ธ๋‹ค = 3100 + ๋‘๋ฒˆ์งธ: 0208 -> 02 ๋ฅผ ๋—€๋‹ค -> ๋‚จ์•„์žˆ๋Š” ์ˆ˜: 08 -> ๋’ค์— ๋ถ™์ธ๋‹ค = 0802 + ์„ธ๋ฒˆ์จฐ: 0512 -> 051 ์„ ๋—€๋‹ค -> ๋‚จ์•„์žˆ๋Š” ์ˆ˜: 2 -> ๋’ค์— ๋ถ™์ธ๋‹ค = 2051 + ๋„ค๋ฒˆ์งธ: 0805 -> 0805 ๋ฅผ ๋—€๋‹ค -> ๋‚จ์•„์žˆ๋Š” ์ˆ˜: -> ๋’ค์— ๋ถ™์ธ๋‹ค = 0805 + +๊ฒฐ๊ณผ: 3100 0802 2051 0805 + +4๋‹จ๊ณ„ +3๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์—์„œ ๊ฐ ๊ทธ๋ฃน์˜ ์ˆซ์ž๋“ค์„ ์œ„์น˜๋ฅผ ๋งž์ถฐ ๋‹ค์‹œ ๊ทธ๋ฃนํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. + +์˜ˆ์‹œ) + 3100 0802 2051 0805 + [์ƒˆ ๊ทธ๋ฃน] + ์ฒซ๋ฒˆ์งธ: 3 0 2 0 + ๋‘๋ฒˆ์งธ: 1 8 0 8 + ์„ธ๋ฒˆ์งธ: 0 0 5 0 + ๋„ค๋ฒˆ์งธ: 0 2 1 5 + +๊ฒฐ๊ณผ: 3020 1808 0050 0215 + +5๋‹จ๊ณ„ +4๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์—์„œ ์ง„ํ–‰์„ ํ•˜๋Š”๋ฐ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ ๋ณ€์ˆ˜(isToggle: default = false)๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค. +4๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์—์„œ ์ˆซ์ž๋ฅผ ์˜๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. +1 = A, 2 = B, 3 = C, 4 = D, 5 = E, 6 = F, 7 = G, 8 = H, 9 = I ์— ๋งž์ถฐ์„œ ๋ฐ”๊ฟ”์ฃผ๋Š”๋ฐ isToggle์˜ ๊ฐ’์ด false๋ฉด ๋Œ€๋ฌธ์ž๋กœ true์ด๋ฉด ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜์„ ํ•ด์ค€๋‹ค. + +ํ•˜์ง€๋งŒ 0์„ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด isToggle์˜ Bool๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋ฉฐ 0์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ฃน์ด ์กด์žฌ ํ• ๊ฒฝ์šฐ 1๋ถ€ํ„ฐ 9์— ์น˜ํ™˜๋˜๋Š” ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์•ŒํŒŒ๋ฒณ (J~Z)๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค. + + ๋งŒ์•ฝ 0์ด ์—ฐ์†๋˜๋Š” ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ ๊ฒฝ์šฐ 2์ž๋ฆฌ ์ด์ƒ์ผ ๊ฒฝ์šฐ์—๋Š” 0์˜ ๊ฐฏ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ด์ค€๋‹ค. 4์ž๋ฆฌ์ธ ๊ฒฝ์šฐ์—๋Š” ์•ž์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ ํ•œ๋‹ค. + +์˜ˆ์‹œ) + 3020 1808 0050 0215 + ์ˆซ์ž - ์ถœ๋ ฅ๊ฐ’ - isToggle + ์ฒซ๋ฒˆ์งธ + 3 - C - F + 0 - - T + 2 - b - T + 0 - - F + ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฃน์ด 0000 ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰ + ๋งŒ์•ฝ 0000์ผ ๊ฒฝ์šฐ์— (J~Z)์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์•„๋ฌด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค + + ๋‘๋ฒˆ์จฐ + 1 - A - F + 8 - H - F + 0 - - T + 8 - h - T + ๋‘๋ฒˆ์งธ ๊ทธ๋ฃน์ด 0000 ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰ + ๋งŒ์•ฝ 0000์ผ ๊ฒฝ์šฐ์— (J~Z)์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์•„๋ฌด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค + + ์„ธ๋ฒˆ์งธ + 0 - - F + 0 - 2 - T - ์ด๋•Œ 0์ด 2๋ฒˆ ๋ฐ˜๋ณต ๋˜์—ˆ์œผ๋ฏ€๋กœ 2๋ฅผ ํ‘œ์‹œ + 5 - e - T + 0 - - F + ์„ธ๋ฒˆ์งธ ๊ทธ๋ฃน์ด 0000 ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰ + ๋งŒ์•ฝ 0000์ผ ๊ฒฝ์šฐ์— (J~Z)์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์•„๋ฌด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค + + ๋„ค๋ฒˆ์งธ + 0 - 2 - T - ์„ธ๋ฒˆ์งธ ๊ทธ๋ฃน์˜ ๋งˆ์ง€๋ง‰์—์„œ๋„ 0์ด ๋‚˜์™€์„œ ์ด๋ฒˆ๊นŒ์ง€ 0์ด 2๋ฒˆ ๋ฐ˜๋ณต๋˜์—ˆ๊ธฐ์— 2๋ฅผ ํ‘œ์‹œ + 2 - b - T + 1 - a - T + 5 - e - T + ๋„ค๋ฒˆ์งธ ๊ทธ๋ฃน์ด 0000 ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰ + ๋งŒ์•ฝ 0000์ผ ๊ฒฝ์šฐ์— (J~Z)์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์•„๋ฌด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค + +๊ฒฐ๊ณผ: Cb AHh 2e 2bae + + +์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•œ๋‹ค. +๊ฐ’: 12345678 +ํ‚ค: 20240612 +๊ฒฐ๊ณผ: Cb AHh 2e 2bae + + */ + +struct ENDC_ERROR:Error { + var caseType: CASE + var message: String + + enum CASE: Error{ + case EN_DIGIT + case DC_WRONG + } +} + +func edon_E(value: String, key: String) -> Future { + return Future { promise in + var result = "" + + // 0๋‹จ๊ณ„: ์ž๋ฆฌ์ˆ˜ ํ™•์ธ + if value.count != key.count { promise(.failure(ENDC_ERROR(caseType: .EN_DIGIT, message: "digit ERROR"))) } + + /// 1๋‹จ๊ณ„: ์ž๋ฆฌ๋ณ„ ๋ง์…ˆ + ๊ทธ๋ฃนํ™” + ์…”ํ”Œ + /// <์ˆœ์„œ> + /// 1. ์•”ํ˜ธํ™” ํ•  ๊ฐ’๊ณผ ํ‚ค๋ฅผ ์ž๋ฆฌ ๋ณ„๋กœ ๋ง์…ˆ์„ ์ง„ํ–‰ + /// 2. 1์˜ ๊ฒฐ๊ณผ๊ฐ€ 1์ž๋ฆฌ์ผ ๊ฒฝ์šฐ์—๋Š” ์•ž์— 0์„ ๋ถ™์—ฌ์„œ 2์ž๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์คŒ + /// 3. 0 ~ index ๊นŒ์ง€์˜ ๋ฐฐ์—ด์„ [index+1... end] ๋’ค์— ๋ถ™์—ฌ์ค€๋‹ค. + /// 4. 3์˜ ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ทธ๋ฃน์—์„œ ๊ฐ ์ž๋ฆฌ ์œ„์น˜์— ์žˆ๋Š” ์ˆซ์ž๋“ค๋กœ ์ƒˆ๋กœ์šด ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. + /// 5. 4์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋‚˜์˜ String ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. + let sum = { () -> String in + var tempArray = ["","","",""] + let add = zip(value, key).map{ + guard let first = Int(String($0)), let second = Int(String($1)) else { return ""} + return String(format: "%02d", first + second) + } + + zip(add[...3],add[4...].reversed()) + .map{"\($0)\($1)"}.enumerated() + .map { (index, value) in + let sumValue = value.map{$0} + return "\(String(sumValue[(index+1)...]))\(String(sumValue[...(index)]))" + } + .joined(separator: "") + .enumerated().map { (index, value) in + tempArray[index % 4] += "\(value)" + } +// print(tempArray) +// print(tempArray.joined(separator: "")) + return tempArray.joined(separator: "") + }() + +// print(sum) + +// print(String(Character(UnicodeScalar(73)))) + //"I".unicodeScalars.first?.value + + /// 2๋‹จ๊ณ„ + /// [์˜๋ฌธ์ž ์•„์Šคํ‚ค ์ฝ”๋“œ : 65~73] + /// <์ˆœ์„œ> + /// 1. + var isToggle = false + var zCnt = 0 + + let ascii = { (value: Int) -> String in + if let scalar = UnicodeScalar(value) { return "\(scalar)" } + return "" + } + + for value in sum { + if value == "0" { + isToggle.toggle() + zCnt += 1 + if zCnt == 4 { + result += isToggle ? ascii(Int.random(in: 74...90)).lowercased() : ascii(Int.random(in: 74...90)) + zCnt = 0 + } + } + else { + if zCnt > 1 { result += "\(zCnt)" } + zCnt = 0 + result += isToggle ? ascii(Int("\(value)")!+64).lowercased() : ascii(Int("\(value)")!+64) + } + } + promise(.success(result)) + } +} +func edon_D(value: String, key: String) -> Future { + return Future { promise in + var result = "" + var temp = "" + var isToggle = false + + let ascii = { (value: String) -> Int in + if let scalar = value.unicodeScalars.first, let sInt = Int("\(scalar.value)") { return sInt } + return 0 + } + + // ๋Œ€ = 65~73, ์†Œ = 97~105 + value.map { + if let codeNum = Int("\($0)") { + for _ in 0.. 64 && code < 74 { + if isToggle { + temp += "0\(code-64)" + isToggle.toggle() + } + else { temp += "\(code-64)" } + } + else if code > 96 && code < 106 { + + if !isToggle { + temp += "0\(code-96)" + isToggle.toggle() + } + else { temp += "\(code-96)" } + } + else { + temp += "0000" + } + } + } + + if temp.count % 4 > 0 { for _ in 0 ..< 4-(temp.count%4) { temp += "0" } } + + var tempArray = ["","","",""] + temp.enumerated().map {(index,value) in tempArray[index%4] += "\(value)" } + + var saveArray = [String].init(repeating: "", count: 8) + var saveTArray = [[String]]() + + + tempArray.enumerated().map {(index,value) in + let sepValue = value.map{$0} + + saveTArray.append("\(String(sepValue[(3-index)...]))\(String(sepValue[...(3-index-1)]))".map{"\($0)"}) + + saveArray[index] = saveTArray[index][0...1].joined(separator: "") + saveArray[(7-index)] = saveTArray[index][2...3].joined(separator: "") + } + + for (v,k) in zip(saveArray,key) { + if let value = Int(v), let key = Int("\(k)") { + if value-key > 0 { result += "\(value-key)" } + else { result += "\((value-key) * -1)" } + } + } + + promise(.success(result)) + } +} diff --git a/JJUNGTABLE/Common/FB_Functions.swift b/JJUNGTABLE/Common/FB_Functions.swift new file mode 100644 index 0000000..b63f270 --- /dev/null +++ b/JJUNGTABLE/Common/FB_Functions.swift @@ -0,0 +1,47 @@ +// +// FB_Functions.swift +// CheckAnything +// +// Created by Sean Kim on 5/23/24. +// + +import Foundation + +import FirebaseMessaging +import FirebaseAuth + +class FB_FUNC { + static var shared = FB_FUNC() + private init() {} + + //CheckAnything.com + func sendPushNotification(_ title: String, body: String) { + @UserDefault (key: "fcmToken", defaultValue: "") var pushFCMToken + +// let url = URL(string: "\(KEY.apiLink)send?&")! +// var request = URLRequest(url: url) +// request.httpMethod = "GET" +// let task = URLSession.shared.dataTask(with: request) { data, response, error in +// if let error = error { +// print("Error sending FCM token: \(error)") +// return +// } +// if let response = response as? HTTPURLResponse, response.statusCode == 200 { +// print("FCM token sent successfully") +// } else { +// print("Failed to send FCM token") +// } +// } +// task.resume() + } + + + func login(_ id: String, _ password: String, _ code: String) { + Auth.auth().signIn(withEmail: "\(id)@checkanythingemail.com", password: password) { authResult, error in + if let error = error { + printLog(error.localizedDescription) + return + } + } + } +} diff --git a/JJUNGTABLE/Common/Login.swift b/JJUNGTABLE/Common/Login.swift new file mode 100644 index 0000000..669929c --- /dev/null +++ b/JJUNGTABLE/Common/Login.swift @@ -0,0 +1,190 @@ +// +// Login.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/11/24. +// + +import SwiftUI +import Combine + +import AuthenticationServices + +import KakaoSDKCommon +import KakaoSDKAuth +import KakaoSDKUser + +import Firebase +import FirebaseAuth + +/* + + 2024-06-11 01:26:08184 [โ„น๏ธ][Api.swift 136:41] -> response: + Optional({ + "app_id" = 987284; + "expires_in" = 43199; + id = 3138117983; + }) + ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ +* LOCATION : [ContentView.swift : 69] - body +| TIME : [2024/06/12 14:39:17:856] +> NOTE : 001273.49bfcb15b70d440a9666b4434336fc2c.0741 + ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ + */ + + + +class Login: NSObject, ObservableObject{ + // let appId = "987284" + + @State private var verificationCode: String = "" + @State private var verificationID: String? + + private var cancellables = Set() + private var currentPromise: Future.Promise? + + func tryKakaoLogin() -> Future { + return Future { promise in + if UserApi.isKakaoTalkLoginAvailable() { // ์นด์นด์˜ค ๊ฐ„ํŽธ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ + UserApi.shared.loginWithKakaoTalk { (oauthToken, error) in + if let error = error { + promise(.failure(.init(caseType: .KAKAO_LOGIN, + message: "\(error.localizedDescription)"))) + } else { + printLog("Login success.: \(oauthToken)") + self.kakaoAccessUserInfo().sink( + receiveCompletion: { completion in + if case .failure(let error) = completion { + promise(.failure(error)) + } + }, + receiveValue: { id in + promise(.success(id)) + } + ).store(in: &self.cancellables) + } + } + } else { + UserApi.shared.loginWithKakaoAccount { (oauthToken, error) in + if let error = error { + promise(.failure(.init(caseType: .KAKAO_LOGIN, + message: "\(error.localizedDescription)"))) + } else { + print("Login success.") + // AccessToken ์ €์žฅ ๋˜๋Š” ๋‹ค๋ฅธ ๋กœ๊ทธ์ธ ํ›„ ์ฒ˜๋ฆฌ + self.kakaoAccessUserInfo().sink( + receiveCompletion: { completion in + if case .failure(let error) = completion { + promise(.failure(error)) + } + }, + receiveValue: { id in + promise(.success(id)) + } + ).store(in: &self.cancellables) + } + } + } + } + } + + func kakaoAccessUserInfo() -> Future { + return Future { promise in + UserApi.shared.me { user, error in + if let error = error { + printLog("[ERROR] Kakao me: \(error)") + promise(.failure(.init(caseType: .KAKAO_ACC_USER, + message: "\(error.localizedDescription)"))) + } + else if let user = user, let id = user.id { + printLog("Access Kakao UserInfo") + promise(.success("\(id)")) + } + else { + promise(.failure(.init(caseType: .KAKAO_ACC_USER, + message: "undefined ERROR"))) + } + } + + } + } +} +extension Login: ASAuthorizationControllerDelegate { + func tryAppleLogin() -> Future { + return Future { promise in + let request = ASAuthorizationAppleIDProvider().createRequest() +// request.requestedScopes = [.fullName, .email] + + let controller = ASAuthorizationController(authorizationRequests: [request]) + controller.delegate = self + controller.presentationContextProvider = self + // ์ด๊ฑฐ๋ฅผ ์จ์•ผ์ง€ ๋กœ๊ทธ์ธ ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค + controller.performRequests() + + self.currentPromise = promise + } + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + printLog("APPLE success") + if let credential = authorization.credential as? ASAuthorizationAppleIDCredential { + let userId = credential.user + currentPromise?(.success(userId)) + } else { + currentPromise?(.failure(.init(caseType: .APPLE_LOGIN, message: "๋กœ๊ทธ์ธ ์‹คํŒจ"))) + } + currentPromise = nil + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: any Error) { + currentPromise?(.failure(.init(caseType: .APPLE_LOGIN, message: "\(error.localizedDescription)"))) + currentPromise = nil + } +} + +extension Login: ASAuthorizationControllerPresentationContextProviding{ + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { + return ASPresentationAnchor() + } + + // Return the first window of the window scene + return windowScene.windows.first { $0.isKeyWindow } ?? ASPresentationAnchor() + } +} + +extension Login { + + + func sendCodeToPhone() { + PhoneAuthProvider.provider().verifyPhoneNumber("+821034523551", uiDelegate: nil) { verificationID, error in + if let error = error { + print("Error: \(error.localizedDescription)") + return + } + +// self.verificationID = verificationID + UserDefaults.standard.set(verificationID, forKey: "authVerifyID") + printLog(verificationID) + } + } + + func verifyCode(code: String) { + printLog(code) + // let verificationID = UserDefaults.standard.string(forKey: "authVerifyID") + guard let verificationID = UserDefaults.standard.string(forKey: "authVerifyID") else { + printLog("Please request verification code first.") + return + } + + let credential = PhoneAuthProvider.provider().credential( + withVerificationID: verificationID, + verificationCode: code + ) + + + printLog(credential) + } + +} diff --git a/JJUNGTABLE/Common/Modifier/BaseViewModifier.swift b/JJUNGTABLE/Common/Modifier/BaseViewModifier.swift new file mode 100644 index 0000000..f12fe01 --- /dev/null +++ b/JJUNGTABLE/Common/Modifier/BaseViewModifier.swift @@ -0,0 +1,55 @@ +// +// BaseViewModifier.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/11/24. +// + + +import SwiftUI +import Combine + + +struct BaseViewModifier: ViewModifier { + @ObservedObject private var networkMonitor = NetworkMonitor.shared + @EnvironmentObject var viewModel: ViewModel + + func body(content: Content) -> some View { + content + // ๋„คํŠธ์›Œํฌ ๋Š๊ธฐ๊ฒŒ ๋˜๋ฉด ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ ํ•จ + .onChange(of: networkMonitor.isConnected) { isConnectd in + if !isConnectd { + viewModel.alertData = .init(body: """ + ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. + ํ™•์ธ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. + """, + button: [ButtonType(name: "ํ™•์ธ", role: .none , + function: {exit(1)})]) + viewModel.showAlert.toggle() + } + } + // ์•Œ๋Ÿฟ์€ ๊ณตํ†ต๋‹จ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•ด๋†“์„ ๊ฑฐ์ž„ + .alert(viewModel.alertData.title, + isPresented: $viewModel.showAlert, + presenting: $viewModel.alertData) { data in + let count = data.button.count + ForEach(0 ..< count, id: \.self) { index in + let btn = data.wrappedValue.button[index] + Button(role: btn.role) { + printLog(btn) + if let function = btn.function { function() } + } label: { + Text("\(btn.name)") + } + } + } message: { data in + Text("\(data.body.wrappedValue)") + } + } +} + +extension View { + func setBaseViewModifier() -> some View { + self.modifier(BaseViewModifier()) + } +} diff --git a/JJUNGTABLE/Common/Modifier/NetworkMonitor.swift b/JJUNGTABLE/Common/Modifier/NetworkMonitor.swift new file mode 100644 index 0000000..17ed8c8 --- /dev/null +++ b/JJUNGTABLE/Common/Modifier/NetworkMonitor.swift @@ -0,0 +1,27 @@ +// +// NetworkMonitor.swift +// JJUNGTABLE +// +// Created by Sean Kim on 6/11/24. +// + +import Network +import Combine + +class NetworkMonitor: ObservableObject { + static let shared = NetworkMonitor() + + private let monitor = NWPathMonitor() + private let queue = DispatchQueue.global(qos: .background) + + @Published var isConnected: Bool = true + + private init() { + monitor.pathUpdateHandler = { [weak self] path in + DispatchQueue.main.async { + self?.isConnected = (path.status == .satisfied) + } + } + monitor.start(queue: queue) + } +} diff --git a/JJUNGTABLE/Common/Modifier/SwiftUI_Modifier.swift b/JJUNGTABLE/Common/Modifier/SwiftUI_Modifier.swift new file mode 100644 index 0000000..6eda091 --- /dev/null +++ b/JJUNGTABLE/Common/Modifier/SwiftUI_Modifier.swift @@ -0,0 +1,139 @@ +// +// SwiftUI_Modifier.swift +// PersonalHealthDiary +// +// Created by Sean Kim on 2/20/24. +// + +import SwiftUI + + +extension View { + func makeSystemButton(_ systemName: String, text: String = "",color: Color = .black, img:CGFloat = 40,size: CGFloat = 20) -> some View { + modifier(BottomModifier(systemName: systemName,color: color,text: text, fontSize: size, imgSize: img)) + } + + func fullPage(_ backColor: Color) -> some View { + self + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(backColor) + } + + func font(_ type: FontType)-> some View { + switch type { + case .Title: + return AnyView(self.modifier(TitleFont())) + case .Content: + return AnyView(self.modifier(ContentFont())) + case .Small: + return AnyView(self.modifier(SmallFont())) + } + } +} +#if canImport(UIKit) +extension View { + func hideKeyboard() { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } +} +#endif + +struct BottomModifier: ViewModifier { + var systemName: String + var color: Color + var text: String + var fontSize: CGFloat + var imgSize: CGFloat + + func body(content: Content) -> some View { + VStack { + Image(systemName: systemName) + .resizable().aspectRatio(contentMode: .fill) + .tint(color) + .frame(width: imgSize ,height: imgSize) + .padding(.init(top: 0, leading: 10, bottom: 0, trailing: 10)) + if text != "" { + Text(text) + .tint(color) + .font(.system(size: fontSize)) + .padding(.init(top: 0, leading: 0, bottom: 5, trailing: 0)) + } + } + } +} + + +struct MenuButtonBack: ViewModifier { + func body(content: Content) -> some View { + content + .font(.nps(size: 24)) + .tint(.brand) + .frame(width: 40, height: 40, alignment: .center) + .background{ + RoundedRectangle(cornerRadius: 10) + .strokeBorder(.brand, + style: StrokeStyle(lineWidth: 2)) + } + + } +} + +struct TitleFont: ViewModifier { + func body(content: Content) -> some View { + content + .font(.nps(font: .bold, size: 32)) + .minimumScaleFactor(0.1) + .tint(.brand) + .frame(maxHeight: 32, alignment: .leading) + } +} + +// Title ๋ณด๋‹ค 40% ๊ฐ์†Œ +struct ContentFont: ViewModifier { + func body(content: Content) -> some View { + content + .font(.nps(size: 20)) + .minimumScaleFactor(0.1) + .tint(.brand) + .frame(maxHeight: 20, alignment: .leading) + } +} + +// Content ๋ณด๋‹ค 30% ๊ฐ์†Œ +struct SmallFont: ViewModifier { + func body(content: Content) -> some View { + content + .font(.nps(size: 14)) + .minimumScaleFactor(0.1) + .tint(.brand) + .frame(maxHeight: 14, alignment: .leading) + } +} + +struct AlignmentView: ViewModifier { + enum AlignmentType { + case leading + case trailing + case top + case bottom + } + + var type: AlignmentType + + func body(content: Content) -> some View { + if type == .leading || type == .trailing { + HStack(spacing: 0) { + if type == .trailing { Spacer() } + content + if type == .leading { Spacer() } + } + } + else { + VStack(spacing: 0) { + if type == .bottom { Spacer() } + content + if type == .top { Spacer() } + } + } + } +} diff --git a/JJUNGTABLE/Common/Modifier/SwiftUI_Prefix.swift b/JJUNGTABLE/Common/Modifier/SwiftUI_Prefix.swift new file mode 100644 index 0000000..de6832e --- /dev/null +++ b/JJUNGTABLE/Common/Modifier/SwiftUI_Prefix.swift @@ -0,0 +1,448 @@ +// +// SwiftUI_Prefix.swift +// PersonalHealthDiary +// +// Created by Sean Kim on 2/20/24. +// +import SwiftUI + +// MARK: - TYPEALIAS +typealias VOID_TO_VOID = () -> () + +// MARK: - VARIABLE +public var APPSTORE_URL = "https://itunes.apple.com/app/" +public var KEYBOARD_UP_HEIGHT: CGFloat = 46.0 + +enum Compare: Int{ + case bigger = 0 + case smaller + case equal + case error +} + +// MARK: - FUNCTION +/// print ๋ฅผ ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ํ‘œ๊ธฐํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ +public func printLog(_ object: T, _ file: String = #file, _ function: String = #function, _ line: Int = #line){ +#if DEBUG + let dateString = Date().convertString("yyyy/MM/dd HH:mm:ss:SSS") + Swift.print( +// """ +// ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ +// |* TIME = [\(dateString)] || FILE = [\(file.lastPathComponent)] +// | NAME = [\(function)] || LINE = [\(line)] +// |>>> PRINT = \(object) +// ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ +// """ + """ + ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ๏ผฟ + * LOCATION : [\(file.lastPathComponent) : \(line)] - \(function) + | TIME : [\(dateString)] + > NOTE : \(object) + ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ๏ฟฃ + """ + ) +#else + +#endif +} + +public func getDeviceWidth() -> CGFloat { UIScreen.main.bounds.size.width } +public func getDeviceHeight() -> CGFloat { UIScreen.main.bounds.size.height } + + +/// ํƒˆ์˜ฅ ์—ฌ๋ถ€ ํŒŒ์•… ํ•จ์ˆ˜ +/// false ๋– ์•ผ ์ •์ƒ์ ์ธ๊ฒƒ +public func isIllegalDevice() -> Bool { + func canOpen(path: String) -> Bool { + let file = fopen(path, "r") + guard file != nil else { return false } + fclose(file) + return true + } + + guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return false } + if UIApplication.shared.canOpenURL(cydiaUrlScheme as URL) { + return true + } + +#if arch(i386) || arch(x86_64) + return false +#endif + + let fileManager = FileManager.default + if fileManager.fileExists(atPath: "/Applications/Cydia.app") || + fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") || + fileManager.fileExists(atPath: "/bin/bash") || + fileManager.fileExists(atPath: "/usr/sbin/sshd") || + fileManager.fileExists(atPath: "/etc/apt") || + fileManager.fileExists(atPath: "/usr/bin/ssh") || + fileManager.fileExists(atPath: "/private/var/lib/apt") { + return true + } + if canOpen(path: "/Applications/Cydia.app") || + canOpen(path: "/Library/MobileSubstrate/MobileSubstrate.dylib") || + canOpen(path: "/bin/bash") || + canOpen(path: "/usr/sbin/sshd") || + canOpen(path: "/etc/apt") || + canOpen(path: "/usr/bin/ssh") { + return true + } + let path = "/private/" + NSUUID().uuidString + do { + try "anyString".write(toFile: path, atomically: true, encoding: String.Encoding.utf8) + try fileManager.removeItem(atPath: path) + return true + } catch let error { // ์ด ๋ถ€๋ถ„ + printLog("Jail ERROR: \(error))") + return false + } +} + +public func fontNameCheck() { + for family: String in UIFont.familyNames { + print(family) + for names : String in UIFont.fontNames(forFamilyName: family){ + printLog("\(names)") + } + } +} + +/// a ๊ฐ€ b ๋ณด๋‹ค ํด ๊ฒฝ์šฐ true ๋ฐ˜ํ™˜ ( ๊ทธ์™ธ ์ „๋ถ€ false) +public func isBigger (_ a: Int, _ b: Int) -> Bool { + if a > b { return true } else { return false } +} + +/// JSON ํ˜•ํƒœ์˜ String ์„ ๋ฐ›์•„์„œ Dictionary ์˜ ํ˜•ํƒœ๋กœ ๋‚ด๋ณด๋ƒ„ +public func jsonToDict(_ input: String) -> [String: Any] { + if let jsonData = input.data(using: .utf8){ + do { + if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { + return jsonObject + } + } catch let error { // ์ด ๋ถ€๋ถ„ + printLog("JSON ERROR: \(error))") + } + } + return [:] +} + +func currentVersion() -> String { + guard let currentVer = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return "" } + return currentVer + +} + +func versionChange(ver: String) -> [Int] { + return ver.components(separatedBy: ["."]).map {Int($0) ?? 0} +} + + +/// a ๊ฐ€ b ๋ณด๋‹ค OOO ํ•˜๋‹ค. +func compareVersion(_ a: String, _ b: String) -> Compare { + let aList = versionChange(ver: a) + let bList = versionChange(ver: b) + if aList.count != bList.count { return .error } + else { + for i in 0 ..< aList.count { + if aList[i] > bList[i] { return .bigger } + else if aList[i] < bList[i] { return .smaller } + } + return .equal + } +} + +func copyToClipboard(_ text: String){ + UIPasteboard.general.string = text +} + + + +// MARK: - CUSTOM COMPONENTS + + +// MARK: - EXTENSION +extension String { + /// ๋งˆ์ง€๋ง‰ ๊ฒฝ๋กœ ๊ตฌ์„ฑ ์š”์†Œ + var lastPathComponent: String { + get { + return (self as NSString).lastPathComponent + } + } + + /// ์›ํ•˜๋Š” ๊ธธ์ด ๋งŒํผ ์ ˆ๋‹จ + func cut(start: Int, end: Int) -> String { + let startIndex = self.index(self.startIndex,offsetBy: start >= 0 ? start : 0) + let endIndex = self.index(self.startIndex,offsetBy: end >= 0 ? end : 0) + let result: String = "\(self[startIndex ..< endIndex])" + return result + } + + /// ๊ธ€์ž ํ•˜๋‚˜ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ + func letter() -> [String] { + return self.map { String($0) } + } + + /// ๋‹จ์–ด ํ•˜๋‚˜ ๋‹จ์œ„๋กœ ๊ตฌ๋ฌธ (๋„์–ด์“ฐ๊ธฐ) + func word() -> [String] { + return self.components(separatedBy: " ") + } + + /// Date() ๋กœ ๋ณ€ํ™˜ -> (Bool, Date) ์ถœ๋ ฅ + func convertDate(_ dateFormat: String = "yyyyMMdd") -> (Bool, Date) { + let dateFormatter = Date().setDateFormatter(dateFormat) + if let convert = dateFormatter.date(from: self) { + return (true, convert) + } else { + return (false, Date()) + } + } + + /// ์ •๊ทœ์‹ ์ฒดํฌ + /// + /// ์ด๋ฉ”์ผ ์ •๊ทœ์‹ ์˜ˆ์‹œ: "[A-Z0-9a-z._%+-]+@[A-Z0-9a-z._%+-]+\\.[A-Za-z]{2,64}" + /// ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •๊ทœ์‹ ์—์‹œ: "[A-Z0-9a-z._%+-]{6,12}" + func checkFilter(_ filter: String) -> Bool { + if self == "" { return false } + return self.range(of: filter, options: .regularExpression) != nil + + } + + /// Bool ๊ฐ’์— ๋งž๊ฒŒ DateFormat์„ ๋ฐ˜ํ™˜ + static func makeDateFormat(year: Bool, month: Bool, day: Bool, dayOfWeek: Bool = false, am_pm: Bool = false, hour: Bool = false,_ fullTime: Bool = true, minute: Bool = false, second: Bool = false, mSecond: Bool = false, mSDigit: Int = 1) -> String { + + var dateFormat = "" + + if year { + dateFormat = dateFormat + "yyyy" + } + if month { + dateFormat = dateFormat + "MM" + } + if day { + dateFormat = dateFormat + "dd" + } + if dayOfWeek { + dateFormat = dateFormat + "EEEEEE" + } + + if am_pm { + dateFormat = dateFormat + "a" + } + + if fullTime { // 24์‹œ๊ฐ„ + if hour { + dateFormat = dateFormat + "HH" + } + } else { // 12์‹œ๊ฐ„ + if hour { + dateFormat = dateFormat + "hh" + } + } + + if minute { + dateFormat = dateFormat + "mm" + } + + if second { + dateFormat = dateFormat + "ss" + } + + if mSecond { + for _ in 0 ..< mSDigit { + dateFormat = dateFormat + "S" + } + } + + return dateFormat + } + + /// ๋‚ ์งœ๋ฅผ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ String์œผ๋กœ ๋ฐ˜ํ™˜ + static func combineDate(year: Int, month: Int, day: Int) -> String { + return "\(year * 10000 + month * 100 + day)" + } + + func stringToInt() -> Int { + if let intValue = Int(self) { + return intValue + } else { + return 0 + } + } +} + +extension Date { + /// ์—ฐ๋„ ํ‘œ์‹œ + /// + /// ๋ณ€ํ™˜์— ์‹คํŒจ์‹œ ํ˜„์žฌ ๋‚ ์งœ์˜ ๋…„ ํ‘œ์‹œ + var year: Int { + let dateFormatter = self.setDateFormatter("yyyy") + if let year = Int(dateFormatter.string(from: self)){ + return year + } else { + return Calendar.current.component(.year, from: self) + } + } + + /// ์›” ํ‘œ์‹œ + /// + /// ๋ณ€ํ™˜ ์‹คํŒจ์‹œ ํ˜„์žฌ ๋‚ ์งœ์˜ ์›” ํ‘œ์‹œ + var month: Int { + let dateFormatter = self.setDateFormatter("MM") + if let month = Int(dateFormatter.string(from: self)) { + return month + } else { + return Calendar.current.component(.month, from: self) + } + } + + /// ์ผ ํ‘œ์‹œ + /// + /// ๋ณ€ํ™˜ ์‹คํŒจ์‹œ ํ˜„์žฌ ๋‚ ์งœ์˜ ์›” ํ‘œ์‹œ + var day: Int { + let dateFormatter = self.setDateFormatter("dd") + if let day = Int(dateFormatter.string(from: self)) { + return day + } else { + return Calendar.current.component(.day, from: self) + } + } + + /// ์š”์ผ ํ‘œ์‹œ + /// + /// ์ผ์š”์ผ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด 0~6๊นŒ์ง€ ๋ฐ˜ํ™˜ + /// + /// -1 ๋ฐ˜ํ™˜์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ + var dayOfWeek: Int { + let dateFormatter = self.setDateFormatter("EEEEEE") + let convert = dateFormatter.string(from: self) + switch convert { + case "์ผ": + return 0 + case "์›”": + return 1 + case "ํ™”": + return 2 + case "์ˆ˜": + return 3 + case "๋ชฉ": + return 4 + case "๊ธˆ": + return 5 + case "ํ† ": + return 6 + default: + return -1 + } + } + + func setDateFormatter(_ dateFormat: String) -> DateFormatter { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = dateFormat + dateFormatter.timeZone = TimeZone(abbreviation: "KST") + dateFormatter.locale = Locale(identifier: "ko_kr") + return dateFormatter + } + + /// String ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ + func convertString(_ dateFormat: String = "yyyyMMdd") -> String { + let dateFormatter = self.setDateFormatter(dateFormat) + return dateFormatter.string(from: self) + } + + + /// ํ•ด๋‹น ๋…„๋„๊ฐ€ ์œค๋…„์ธ์ง€ ํ™•์ธ + /// + /// ๊ฐ’์ด ์ •ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ ๋‚ ์งœ๋กœ ํŒŒ์•… + func checkLeapMonth() -> Bool { + if self.year % 4 == 0 { + if self.year % 100 == 0 { + if self.year % 400 == 0 { + return true + } + } else { + return true + } + } + return false + } + + /// ํ•ด๋‹น ์›”์˜ ๋‚ ์งœ ์ˆ˜ ํ™•์ธ + /// + /// ๊ฐ’์ด ์ •ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ ๋‚ ์งœ๋กœ ํŒŒ์•… + func getLastDayOfMonth() -> Int { + switch self.month { + case 1,3,5,7,8,10,12 : + return 31 + case 2: + if self.checkLeapMonth() { + return 29 + } else { + return 28 + } + case 4,6,9,11: + return 30 + default: + return -1 + } + } +} + + +extension Font { + enum NPS_Font : String { + case regular + case bold + + var value: String { + switch self { + case .regular: + return "NPS-font-Regular" + case .bold: + return "NPS-font-Bold" + } + } + } + + static func nps(font: NPS_Font = .regular, size: CGFloat = 12) -> Font { + return .custom(font.value, size: size) + } + + +} + +extension View { + func endTextEditing() { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } +} + +// MARK: - ANNOTATION + +/// ์‚ฌ์šฉ๋ฐฉ๋ฒ• +/// @UserDefault (key: "keyName", defaultValue: "default") var ๋ณ€์ˆ˜ +/// print(๋ณ€์ˆ˜) +/// - ์œ„์—์ฒ˜๋Ÿผ ํ•˜๊ฒŒ ๋˜๋ฉด UserDefaults์— ์ €์žฅ๋œ key ๊ฐ’์„ ๊ฐ–๊ณ ์žˆ๋Š”๊ฑธ ๋ณด์—ฌ์ฃผ๋“ ๊ฐ€ ๊ธฐ๋ณธ ๊ฐ’ ๋ณด์—ฌ์คŒ +/// ๋ณ€์ˆ˜ = ๋ณ€๊ฒฝ๊ฐ’ +/// - ์œ„์—์ฒ˜๋Ÿผ ํ•˜๊ฒŒ๋˜๋ฉด UserDefaults์— ํ•ด๋‹น key ๊ฐ’์— ๋ณ€๊ฒฝ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋“ค๊ณ  ์žˆ์Œ +@propertyWrapper +struct UserDefault { + private let ud: UserDefaults = .standard + private let key: String + private var defaultValue: T + + var wrappedValue: T { + set { ud.set(newValue, forKey: key) } + get { ud.object(forKey: key) as? T ?? defaultValue } + } + + init(key: String, defaultValue: T) { + self.key = key + self.defaultValue = defaultValue + } + + ///์‚ฌ์šฉ๋ฒ•: _๋ณ€์ˆ˜.removeData() + /// - ์ค‘์š”์‚ฌํ•ญ ๋ณ€์ˆ˜ ์•ž์— _ ๋ฌด์กฐ๊ฑด ๋ถ™์—ฌ์•ผ ํ•จ + func removeData() { + ud.removeObject(forKey: key) + } +} diff --git a/JJUNGTABLE/Common/Prj_Common/KEY.swift b/JJUNGTABLE/Common/Prj_Common/KEY.swift new file mode 100644 index 0000000..2a3d887 --- /dev/null +++ b/JJUNGTABLE/Common/Prj_Common/KEY.swift @@ -0,0 +1,28 @@ +// +// KEY.swift +// JJUNGTABLE +// +// Created by Sean Kim on 1/9/24. +// + +import Foundation + +enum KEY { + static let kakaoAppKey: String = "8ff66cbbf8fb74673db5c642c64dda73" + static let appStoreURL: String = "" +// public var SERVER_URL = "http://ipstein.myds.me:6004/" +#if DEVELOPE + static let apiLink: String = "" +#else + static let apiLink: String = "http://ipstein.myds.me:6000/" +#endif + + static let naverGeocodingURL: String = "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?" + static let naverReverseGeocodingURL: String = "https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?" + static let naverClientID = ("X-NCP-APIGW-API-KEY-ID", "qc2z3auwbq") + static let naverClientSecret = ("X-NCP-APIGW-API-KEY", "OY9b0gsIppzwvqzYMcamyBGSI3QblFsICGBBuHpN") + + // ์ฃผ์†Œ ๊ฒ€์ƒ‰ web ์ฃผ์†Œ + static let githubPagesLink: String = "https://sean-59.github.io/Kakao-Postcode/" + +} diff --git a/JJUNGTABLE/Common/Prj_Common/Parameter.swift b/JJUNGTABLE/Common/Prj_Common/Parameter.swift new file mode 100644 index 0000000..ba1b456 --- /dev/null +++ b/JJUNGTABLE/Common/Prj_Common/Parameter.swift @@ -0,0 +1,102 @@ +// +// Parameter.swift +// RememberbyAnything +// +// Created by Sean Kim on 4/26/24. +// + +import SwiftUI + +//MARK: - Alert ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์ •์˜ + +enum AlertType { + case sign +} + +struct AlertData { + var title: String + var body: String + var button: [ButtonType] + + init(title: String = "์•Œ๋ฆผ", body: String, button: [ButtonType] = [.init(name: "ํ™•์ธ", role: .none, function: nil)]) { + self.title = title + self.body = body + self.button = button + } +} + +struct ButtonType { + var name: String + var role: ButtonRole? + var function: (()->())? +} + +// MARK: - API ERROR +struct API_ERROR:Error { + var caseType: CASE + var message: String + + enum CASE: Error{ + case API_PLIST_WRONG + case API_PATH_WRONG + case API_CONNECT + case API_READ + } +} + +struct LOGIN_ERROR: Error { + var caseType: CASE + var message: String + + enum CASE: Error { + case KAKAO_LOGIN + case KAKAO_ACC_USER + case APPLE_LOGIN + } +} + +//MARK: - FB_CRUD ๋ฐ์ดํ„ฐ ์ •์˜ +struct FB_ERROR:Error { + var caseType: CASE + var message: String + + enum CASE: Error{ + case FB_CREATE_PARSING + case FB_CREATE_SAVING + case FB_UPDATE_DOC_READ + case FB_UPDATE_TRY + case FB_READ_PARSING + case FB_READ_PATH + case FB_READ_EXIST + case FB_DELETE_TRY + case FB_PATH_WRONG + } + +} + +//MARK: - ์œ ์ € ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์ •์˜ +enum Role: String { + case Admin = "A" + case Tester = "T" + + case Master = "M" + case Employee = "E" +} + +struct userData { + var name: String + var code: String + var company: String + var role: Role + var noReadAlert: [String] + var readAlert: [String] + + init(name: String, code: String, company: String, role: Role, noReadAlert: [String], readAlert: [String]) { + self.name = name + self.code = code + self.company = company + self.role = role + self.noReadAlert = noReadAlert + self.readAlert = readAlert + } +} diff --git a/JJUNGTABLE/Common/Prj_Common/UI_Func_Prefix.swift b/JJUNGTABLE/Common/Prj_Common/UI_Func_Prefix.swift new file mode 100644 index 0000000..6d73d8e --- /dev/null +++ b/JJUNGTABLE/Common/Prj_Common/UI_Func_Prefix.swift @@ -0,0 +1,84 @@ +// +// UI_Func_Prefix.swift +// SwiftDataTest +// +// Created by Sean Kim on 3/27/24. +// + +import SwiftUI + +enum FontType { + case Title + case Content + case Small +} + +enum Icon { + static let left = Image(systemName: "chevron.left") + static let right = Image(systemName: "chevron.right") + static let up = Image(systemName: "chevron.up") + static let down = Image(systemName: "chevron.down") + + static let menu = Image(systemName: "line.3.horizontal") + static let house = Image(systemName: "house") + static let magazine = Image(systemName: "magazine") + static let calendar = Image(systemName: "calendar") + static let gearshape = Image(systemName: "gearshape") + + static let plus = Image(systemName: "plus") + static let bookmark = Image(systemName: "bookmark") + static let bookmark_fill = Image(systemName: "bookmark.fill") + + static let book = Image(systemName: "book") + static let book_closed = Image(systemName: "book.closed") + static let books = Image(systemName: "books.vertical") + + static let filter = Image(systemName: "line.3.horizontal.decrease") + + static let circle = Image(systemName: "circle") + static let circle_fill = Image(systemName: "circle.fill") + static let circle_check = Image(systemName: "checkmark.circle") + static let smallCircle = Image(systemName: "smallcircle.filled.circle") + + static let checkmark = Image(systemName: "checkmark") + + + static let trash = Image(systemName: "trash") + + static let xmarkCircle = Image(systemName: "xmark.circle.fill") + +} + + + +// MARK: - ๊ณ ์œ  ์ฝ”๋“œ ์ƒ์„ฑ +enum CodeName: String{ + case group = "01" + case item = "02" +} + +func makeCode(_ name: CodeName) -> String{ + let dateString = Date().convertString("yyyyMMddHHmmssSSS") // 17๊ธ€์ž + return "\(name.rawValue):\(dateString)" +} + +func generate8Code() -> String { + let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + let digits = "0123456789" + let allCharacters = letters + digits + var code: [Character] = [] + + for _ in 0..<3 { + if let digit = digits.randomElement() { + code.append(digit) + } + } + for _ in 0..<5 { + if let char = allCharacters.randomElement() { + code.append(char) + } + } + code.shuffle() + + return String(code) +} diff --git a/JJUNGTABLE/Common/Prj_Common/ViewModel.swift b/JJUNGTABLE/Common/Prj_Common/ViewModel.swift new file mode 100644 index 0000000..72a82b0 --- /dev/null +++ b/JJUNGTABLE/Common/Prj_Common/ViewModel.swift @@ -0,0 +1,47 @@ +// +// ViewModel.swift +// CheckAnything +// +// Created by Sean Kim on 5/29/24. +// + +import SwiftUI +import Combine + +class ViewModel: ObservableObject { + @UserDefault (key: "isUpdate", defaultValue: "N") var isUpdate + + @UserDefault (key: "deviceToken", defaultValue: "") var deviceToken + @UserDefault (key: "fcmToken", defaultValue: "") var pushFCMToken + + @UserDefault (key: "notiBadge", defaultValue: 0) var notiBadge + + + /* + @UserDefault (key: "userId", defaultValue: "") var userId + @UserDefault (key: "noReadAlertList", defaultValue: [""]) var noReadAlertList + @UserDefault (key: "errorApp", defaultValue: [String:String]()) var errorApp + */ + + @Published var showAlert: Bool = false + + var alertData: AlertData = .init(body: "") + +// func setBadge() async { +// let center = UNUserNotificationCenter.current() +// do { +// try await center.setBadgeCount(noReadAlertList.count) +// } catch { +// // Handle any errors. +// } +// } + + + func systemErrorAlert() -> AlertData { + return .init(body: """ + ์‹œ์Šคํ…œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. + ํ™•์ธ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. + """, + button: [ButtonType(name: "ํ™•์ธ", role: .none , function: {exit(1)})]) + } +} diff --git a/JJUNGTABLE/Document.md b/JJUNGTABLE/Document.md new file mode 100644 index 0000000..716a1b8 --- /dev/null +++ b/JJUNGTABLE/Document.md @@ -0,0 +1,50 @@ +# ๊ณ„์ • ๊ด€๋ จ + +## KAKAO +Link:https://developers.kakao.com/console/app/987284 +Account: sean.kk@kakao.com + +## NAVER +Link: https://console.ncloud.com/naver-service/application +Account: sean_kk@naver.com + +# Protocol ๊ด€๋ จ +## ๊ณตํ†ต๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ protocol ์šด์˜์‹œ์— Any๋กœ ๊ฐ’์„ ๋ณด๋‚ด๋Š”๋ฐ ํ•ด๋‹น ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๋ณด๋‚ด๋Š” ์ชฝ์˜ (Object's Identifier: Data) ์‹์œผ๋กœ ๋ณด๋‚ด์„œ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ข‹์„๊ฒƒ ๊ฐ™๋‹ค. + + +# ์ฃผ์„ +## [THINKING] ์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด ์ƒ๊ฐํ•ด๋ณผ๊ฒƒ +## Remove, test ์ฒ˜๋ฆฌ ๋œ ์ฝ”๋“œ๋Š” ๋‹ค ์‚ญ์ œ ํ•  ์˜ˆ์ • + + + + func readDataBase(key: String, completion: @escaping (DataBase) -> Void) { + // key ๊ฐ€ ๋นˆ๊ฐ’์œผ๋กœ ์˜ฌ ๊ฒฝ์šฐ ๋ฐ”๋กœ Type์œผ๋กœ ๋งŒ๋“ค์ง€๋งŒ ๊ทธ๊ฒŒ ์•„๋‹ˆ๊ณ  key์— ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ€ ๊ฐ™์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ๊ทธ ๋ถ€๋ถ„์„ ํฌํ•จํ•ด์„œ ์ฃผ์†Œ ๊ตฌ์„ฑ + self.readDataBase(key: "go") { result in + if let check2 = result as? DB_FAILURE { + printLog(check2) + } + + } + self.readDataBase(key: "") { result in + printLog(result) + } + + + if key == "" { + completion(DB_FAILURE(key: "out", type: .friends, errorType: .db_CreateERROR)) + } else { + completion(DB_SUCCESS(key: "go", type: .getFriend)) + } + + } + + DatabaseManager().readDataBase(.user, key: loginId) { dataBase in + if let db = dataBase as? DB_SUCCESS { + printLog(db.key) + printLog(db.value) + } + else if let db = dataBase as? DB_FAILURE { + printLog(db.key) + } + } diff --git a/JJUNGTABLE/GoogleService-Info.plist b/JJUNGTABLE/GoogleService-Info.plist new file mode 100644 index 0000000..f94c03c --- /dev/null +++ b/JJUNGTABLE/GoogleService-Info.plist @@ -0,0 +1,32 @@ + + + + + API_KEY + AIzaSyCeHcMO2hbmfxuYaiC8BATYvLbpWdQyNxA + GCM_SENDER_ID + 480609810019 + PLIST_VERSION + 1 + BUNDLE_ID + kr.kro.sean-k.JJUNGTABLE + PROJECT_ID + jjungtable-e5087 + STORAGE_BUCKET + jjungtable-e5087.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:480609810019:ios:9a49754201d22353462a56 + DATABASE_URL + https://jjungtable-e5087-default-rtdb.firebaseio.com + + \ No newline at end of file diff --git a/JJUNGTABLE/Info.plist b/JJUNGTABLE/Info.plist new file mode 100644 index 0000000..a5a0da1 --- /dev/null +++ b/JJUNGTABLE/Info.plist @@ -0,0 +1,82 @@ + + + + + NSAppTransportSecurity + + NSExceptionDomains + + ipstein.myds.me + + NSIncludesSubdomains + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + + + + ServerURL + + httpURL + http://ipstein.myds.me + httpsURL + https://ipstein.myds.me + PORT + 6000 + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + kakao8ff66cbbf8fb74673db5c642c64dda73 + + app-1-480609810019-ios-9a49754201d22353462a56 + + + + FirebaseAppDelegateProxyEnabled + + LSApplicationQueriesSchemes + + kakaokompassauth + kakaolink + kakaoplus + + NMFClientId + qc2z3auwbq + UIAppFonts + + NPSfont_regular.otf + NPSfont_bold.otf + NPSfont_extrabold.otf + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UIBackgroundModes + + external-accessory + fetch + remote-notification + + + diff --git a/JJUNGTABLE/JJUNGTABLE.entitlements b/JJUNGTABLE/JJUNGTABLE.entitlements new file mode 100644 index 0000000..80b5221 --- /dev/null +++ b/JJUNGTABLE/JJUNGTABLE.entitlements @@ -0,0 +1,12 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + + diff --git a/JJUNGTABLE/Resource/.DS_Store b/JJUNGTABLE/Resource/.DS_Store new file mode 100644 index 0000000..ff74a11 Binary files /dev/null and b/JJUNGTABLE/Resource/.DS_Store differ diff --git a/JJUNGTABLE/Resource/Fonts/NPSfont_bold.otf b/JJUNGTABLE/Resource/Fonts/NPSfont_bold.otf new file mode 100644 index 0000000..4404262 Binary files /dev/null and b/JJUNGTABLE/Resource/Fonts/NPSfont_bold.otf differ diff --git a/JJUNGTABLE/Resource/Fonts/NPSfont_extrabold.otf b/JJUNGTABLE/Resource/Fonts/NPSfont_extrabold.otf new file mode 100644 index 0000000..3f39fc6 Binary files /dev/null and b/JJUNGTABLE/Resource/Fonts/NPSfont_extrabold.otf differ diff --git a/JJUNGTABLE/Resource/Fonts/NPSfont_regular.otf b/JJUNGTABLE/Resource/Fonts/NPSfont_regular.otf new file mode 100644 index 0000000..2564e67 Binary files /dev/null and b/JJUNGTABLE/Resource/Fonts/NPSfont_regular.otf differ diff --git a/JJUNGTABLE/Resource/Images/AppleIcon.PNG b/JJUNGTABLE/Resource/Images/AppleIcon.PNG new file mode 100644 index 0000000..2f6e062 Binary files /dev/null and b/JJUNGTABLE/Resource/Images/AppleIcon.PNG differ diff --git a/JJUNGTABLE/Resource/Images/JJUNGIcon.png b/JJUNGTABLE/Resource/Images/JJUNGIcon.png new file mode 100644 index 0000000..579aad6 Binary files /dev/null and b/JJUNGTABLE/Resource/Images/JJUNGIcon.png differ diff --git a/JJUNGTABLE/Resource/Images/KakaoIcon.png b/JJUNGTABLE/Resource/Images/KakaoIcon.png new file mode 100644 index 0000000..6eaf887 Binary files /dev/null and b/JJUNGTABLE/Resource/Images/KakaoIcon.png differ diff --git a/JJUNGTABLE/Resource/Images/tableArchitecture.png b/JJUNGTABLE/Resource/Images/tableArchitecture.png new file mode 100644 index 0000000..dd8c2a6 Binary files /dev/null and b/JJUNGTABLE/Resource/Images/tableArchitecture.png differ diff --git a/JJUNGTABLE/View/.DS_Store b/JJUNGTABLE/View/.DS_Store new file mode 100644 index 0000000..22d3691 Binary files /dev/null and b/JJUNGTABLE/View/.DS_Store differ diff --git a/JJUNGTABLE/View/ContentView.swift b/JJUNGTABLE/View/ContentView.swift new file mode 100644 index 0000000..ba2bf88 --- /dev/null +++ b/JJUNGTABLE/View/ContentView.swift @@ -0,0 +1,134 @@ +// +// ContentView.swift +// JJUNGTABLE +// +// Created by Sean Kim on 3/5/24. +// + +import SwiftUI +import Combine + + +struct ContentView: View { + @EnvironmentObject var viewModel: ViewModel + + @StateObject private var login = Login() + + @State private var cancellables = Set() + + + @State private var selectedOption = "Option 1" + let options = ["Option 1", "Option 2", "Option 3", "Option 4"] + @State private var phoneNum = ("0000", "0000") + + var body: some View { + VStack(spacing: 0) { + Spacer() + Button { + Login().tryKakaoLogin() + .sink { completion in + if case .failure(_) = completion { + viewModel.alertData = .init(body: "SNS ๋กœ๊ทธ์ธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.") + viewModel.showAlert.toggle() + } + } receiveValue: { data in + printLog(data) + API.shared.readData(path: "/db/userInfo/read", + queryItems: [ + URLQueryItem(name: "id", value: data), + URLQueryItem(name: "type", value: "01") + ]) + .sink { completion in + switch completion { + case .finished: + break + case .failure(let error): + printLog(error) + } + } receiveValue: { data in + do { + let decoder = JSONDecoder() + let cid = try decoder.decode([UserCID].self, from: data) + printLog(cid) + } catch { + printLog(error) + self.viewModel.alertData = self.viewModel.systemErrorAlert() + self.viewModel.showAlert.toggle() + } + } + .store(in: &cancellables) + } + .store(in: &cancellables) + + } label: { + Text("Kakao ID๋กœ ๋กœ๊ทธ์ธ") + .font(.nps(font: .bold, size: 32)) + } + .padding(.bottom,20) + + Button { + login.tryAppleLogin() + .sink { completion in + + } receiveValue: { data in + printLog("APPLE ID: \(data)") + } + .store(in: &cancellables) + + } label: { + Text("Apple ID๋กœ ๋กœ๊ทธ์ธ") + .font(.nps(font: .bold, size: 32)) + } + + + HStack(spacing: 0){ + Picker("Select an option", selection: $selectedOption) { + ForEach(options, id: \.self) { option in + Text(option).tag(option) + } + } + .pickerStyle(MenuPickerStyle()) // This line makes the Picker a dropdown menu + .background { + RoundedRectangle(cornerRadius: 10) + .foregroundStyle(.clear) + .frame(height: 50) + } + + TextField("digit 4",text: $phoneNum.0) + + TextField("last",text: $phoneNum.1) + .font(.Content) + .padding([.top,.bottom,.leading],5) + .frame(height: 50) + .cornerRadius(10) + + } + .background { + RoundedRectangle(cornerRadius: 10) + .stroke(Color.brand,lineWidth: 2) + .foregroundStyle(.clear) + } + .padding() + + + Button { + login.sendCodeToPhone() + } label: { + Text("code") + .font(.nps(font: .bold, size: 32)) + } + + Button { + login.verifyCode(code: phoneNum.1) + } label: { + Text("veri") + .font(.nps(font: .bold, size: 32)) + } + + Spacer() + + } + .fullPage(.pageBack) + .setBaseViewModifier() + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..59a4dc3 --- /dev/null +++ b/README.md @@ -0,0 +1,236 @@ +README.md +# ๋ชฉ์ฐจ +[1. ๊ฐœ๋ฐœ ์ผ์ง€](#๊ฐœ๋ฐœ-์ผ์ง€) +[2. ์ƒ๊ฐ ๊ฑฐ๋ฆฌ](#์ƒ๊ฐ-๊ฑฐ๋ฆฌ) + +--- +--- + +# ๊ฐœ๋ฐœ ์ผ์ง€ +### 2024.02.27 +
+๋‚ด์šฉ + +1. ์ƒˆ๋กญ๊ฒŒ ์ž‘์—… ์ง„ํ–‰ + - ์„œ๋ฅ˜ ์ž‘์—… ์ง„ํ–‰ ์ค‘ : [Google Docs](https://docs.google.com/document/d/1g_SE7cnZK-gPrU62XBe27zmer31h1jtdHPL6NYA95OY/edit?usp=sharing) + +
+ +### 2024.02.01 +
+๋‚ด์šฉ + +1. UI Code ์ „ํ™˜ + - TopView ์ „ํ™˜ ์™„๋ฃŒ + - BottomView ์ „ํ™˜ ์™„๋ฃŒ + - CommonAlertVC ์— Coordinator ์ ์šฉ์™„๋ฃŒ + - ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์€ ์ „ํ™˜ ์š”์†Œ ํŒŒ์•…ํ•ด์„œ ๋กœ์ง ์ž์ฒด๋ฅผ ๋‹ค์‹œ ์งค ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ž„ + +
+ +### 2024.01.29 +
+๋‚ด์šฉ + +1. common ๋‹จ ๋ณ€ํ™” ์‹œ๋„ ๋ฐ ๊ฐ์ข… VC๋“ค ๋ณ€ํ™˜ ์ž‘์—… ์ค‘ + +
+ +### 2024.01.28 +
+๋‚ด์šฉ + +1. UI ์ž‘์„ฑ ์ฝ”๋“œ๋“ค ๋ชจ๋“ˆํ™”(?) ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ์ค„์ž„ + - Common.TopView ๋ณ€ํ™˜ ์ž‘์—… ์ค‘ + - MainVC ๋ณ€ํ™˜ ์ž‘์—… ์ค‘ + +
+ +### 2024.01.26 +
+๋‚ด์šฉ + +1. Coordinator ํŒจํ„ด ์ ์šฉ ์ค‘ + - AppCoordinator ์ƒ์„ฑ + - IntroCoordinator ์ƒ์„ฑ - IntroVC ์™€ ์ ์šฉ + - LoginCoordinator ์ƒ์„ฑ - LoginVC ์™€ ์ ์šฉ + - MainCoordinator ์ƒ์„ฑ - MainVC ๋ฏธ์ ์šฉ +2. .xib -> SnapKit Code ์ „ํ™˜ + - IntroVC ์— ๋Œ€ํ•œ ํ™”๋ฉด UI ์ฝ”๋“œ ์ „ํ™˜ ์™„๋ฃŒ + - LoginVC ์— ๋Œ€ํ•œ ํ™”๋ฉด UI ์ฝ”๋“œ ์ „ํ™˜ ์™„๋ฃŒ + - MainVC ํ™”๋ฉด UI ์ฝ”๋“œ ์ „ํ™˜ ์ค‘ +3. VC ๊ธฐ๋Šฅ ๋™์ž‘ ํ™•์ธ + - IntroVC ํŒจํ„ด ์ ์šฉํ•˜๊ณ  ์ฝ”๋“œ ์ „ํ™˜ ํ›„ ๊ธฐ๋Šฅ ์ ์šฉ ์™„๋ฃŒ + - LoginVC ํŒจํ„ด ์ ์šฉํ•˜๊ณ  ์ฝ”๋“œ ์ „ํ™˜ ํ›„ ๊ธฐ๋Šฅ ์ ์šฉ ์™„๋ฃŒ + - MainVC ์ „ํ™˜ ์ ์šฉ ์ค‘ + +
+ +### 2024.01.25 +
git +๋‚ด์šฉ + +1. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ƒ๊ฐ ๋ณ€๊ฒฝ + - ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๋Œ€๋กœ ๋งŒ๋“ค์–ด์„œ ์•ฑ์„ ์Šคํ† ์–ด์— ์˜ฌ๋ฆด ์ƒ๊ฐ์ด์—ˆ์œผ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋ฒ„์™€ DB๋‹จ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด์„œ ํ”„๋กœ์ ํŠธ ์ž์ฒด์˜ ๋Œ€๊ทœ๋ชจ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•จ์„ ๋А๋‚Œ + +2. ๋ณ€๊ฒฝ ๋‚ด์šฉ + 1. iOS APP ๊ด€๋ จ + - Design Pattern ๋„์ž… (Coordinator Pattern, Observer Pattern) + - UI ์ž‘์„ฑ ๋ฐฉ์‹ ๋ณ€๊ฒฝ (xib -> code) + - ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€ ๋จ์œผ๋กœ ์ธํ•ด ๋‚ด๋ถ€ ๋กœ์ง๋“ค ๋Œ€๊ฑฐ ๋ณ€๊ฒฝ + 2. ์„œ๋ฒ„ ์ถ”๊ฐ€ + - firebase ์˜ realTime DB๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ด์šฉ์„ ํ•˜์˜€์œผ๋‚˜ ์‹ค ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋А๋ผ๊ฒŒ ๋˜์–ด ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ • + - ๋ฌผ๋ฆฌ์ ์ธ ์„œ๋ฒ„๋Š” ๊ฐœ์ธ NAS๊ฐ€ ์กด์žฌํ•˜์—ฌ ํ•ด๋‹น ๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉ + - Back ๋‹จ์€ Node.js ๋ฅผ ์‚ฌ์šฉ + - DB ๋Š” MongoDB(MySQL) ๋ฅผ ์‚ฌ์šฉ + 3. MongoDB ์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ +
+ +
+ + + +
+ +### 2024.01.22 +
+๋‚ด์šฉ + +1. ๊ฐœ๋ฐœ ๋ฌด๊ธฐํ•œ ์ค‘๋‹จ + - ์„œ๋ฒ„ ๋ฐ ๋ฐ์ดํ„ฐ ์ „ํ™˜ ์ž‘์—… + - firebase -> node.js + - firebase.realtiemDB -> MariaDB + +
+ +### 2024.01.18 +
+๋‚ด์šฉ + +1. ์˜ˆ์•ฝ PAGE ์ˆ˜์ • + - ๋’ค์— ์‹œ๊ฐ„ ๊ฑด๋“ค๊ณ  ์•ž์— ๊ฑด๋“ค๋ฉด ๋’ค์—๊บผ ๋‚ ์•„๊ฐ€๋Š” ์˜ค๋ฅ˜ +2. Main ์ž์ฒด์—์„œ ์˜ค๋ฅ˜๋“ค ๋ฐœ์ƒ + - ์‹น๋‹ค ๋กœ์ง ์ „์ฒด ์ˆ˜์ •์œผ๋กœ ํ•ด๊ฒฐ + +
+ +### 2024.01.17 +
+๋‚ด์šฉ + +1. ์˜ˆ์•ฝ PAGE ์™„๋ฃŒ + - ์˜ˆ์•ฝ ๊ด€๋ จ ๋ถ€๋ถ„ ์™„๋ฃŒ +2. Main ์ž์ฒด์—์„œ ์˜ค๋ฅ˜๋“ค ๋ฐœ์ƒ + - ๋ฌธ์ œ + 1. ์ฒ˜์Œ ๊ฐ€์ž…์‹œ ์ด๋ฆ„์ด Name์œผ๋กœ ํ‘œ๊ธฐ๋˜๋Š” ์˜ค๋ฅ˜ + 2. ์˜ˆ์•ฝ ๋ฐ›๊ณ  ๋‚˜๋ฉด ๋– ์žˆ๋Š” ์ฐฝ ์ง€์šฐ๊ณ  ์˜ค๋Š˜์˜ ์ผ์ •์— ํ•ด๋‹น๋˜๋ฉด ์˜ค๋Š˜์˜ ์ผ์ •์—๋„ ๋„์šฐ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•จ + - ๋‹น์—ฐ ์˜ˆ์•ฝ์„ ์ค€์‚ฌ๋žŒ๋„ ์ž‘์—…์„ ํ•ด์ค˜์•ผ ํ•จ + 3. ์นœ๊ตฌ ์ถ”๊ฐ€ ํ–ˆ์„ ๋–„ ์นœ๊ตฌ ์š”์ฒญ์„ ๊ฐฑ์‹ ํ•ด์•ผ ๋ฐ›์•„์˜ค๋Š”๋ฐ ์ด๋ถ€๋ถ„์„ Main์—์„œ ํ•˜๊ธฐ์— ํ•ด๋‹น ์ฐฝ ์ง„์ž…์‹œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋ณ€๊ฒฝ + 4. ์˜ค๋Š˜์˜ ์ผ์ •์—์„œ ์•Œ๋ฆผ ํ† ๊ธ€ ๋ถ€๋ถ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ + 5. ์นœ๊ตฌcell์— ์žˆ๋Š” ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ  ๋‹ค๋ฅธ VC ๊ฐ”๋‹ค๊ฐ€ ๋Œ์•„์˜ค๋ฉด ์นœ๊ตฌcell ๋ฒ„ํŠผ์ด ๋™์ž‘์„ ์•ˆํ•จ + - Main ์ž์ฒด์— Logic์—์„œ ๋ฌธ์ œ์ ์„ ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ „๋ฉด ์ˆ˜์ • ์ค‘ + +
+ +### 2024.01.16 +
+๋‚ด์šฉ + +1. ์˜ˆ์•ฝ PAGE view ์ž‘๋™ + - DB ์ž‘์—…ํ•ด์„œ ๋‹ค๋ฅธ ์•„์ด๋””์—์„œ๋„ ์•„๋ฌด ์ด์ƒ์—†์ด ์ž˜ ๋œจ๋Š”์ง€ ํ™•์ธ ํ•„์š” +2. Add Friends ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ์ ์ด ๋ฐœ๊ฒฌ + - ์นœ๊ตฌ ์กฐํšŒ๊ฐ€ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ + - ๊ฒ€์ƒ‰ํ•˜๋Š” DBManager ๋ถ€๋ถ„์ด ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธด๋“ฏ + +
+ +### 2024.01.13 +
+๋‚ด์šฉ + +1. SecondReserveView ์ถ”๊ฐ€ + - View ์ถ”๊ฐ€ +2. reserveData ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ณ€๊ฒฝ + +
+ +### 2024.01.10 +
+๋‚ด์šฉ + +1. SearchAddressView ์ถ”๊ฐ€ + - ์ฃผ์†Œ ์ž…๋ ฅํ•˜๋Š”๋ฐ Map์„ ๋ณด์—ฌ์ค„ ํ•„์š”๋Š” ์—†๋‹ค๋Š” ํŒ๋‹จ์ด ๋“ค์–ด์„œ ํ•ด๋‹น ๋ถ€๋ถ„์„ Kakao์˜ ์ฃผ์†Œ ๊ฒ€์ƒ‰ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•จ + - ๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์กด์žฌํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ง์ ‘ HTML๋กœ ๊นƒ ํ—ˆ๋ธŒ์— ์˜ฌ๋ ค๋‘” ์ƒํƒœ์—์„œ Handler๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” WebView ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ์Œ +2. ReserveView ์ •๋ฆฌ + - ๋‚ ์งœ ์„ ํƒ๊ณผ ๊ด€๋ จํ•œ ์˜ค๋ฅ˜๋“ค ์ˆ˜์ • + - ๋นˆ ๊ฐ’์ธ๋ฐ๋„ ์Šคํฌ๋กค์ด ๋˜๋Š” ์˜ค๋ฅ˜ ์ˆ˜์ • + - ๋‚ ์งœ, ์‹œ๊ฐ„, ์žฅ์†Œ ์ €์žฅ๊นŒ์ง€๋Š” ์™„๋ฃŒ ์ด์ œ ๋‹ค์Œ ์˜ˆ์•ฝ ๋กœ์ง์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋จ + +
+ +### 2024.01.09 +
+๋‚ด์šฉ + +1. View ๋‹ค๋“ฌ๊ธฐ + - NaverView ์™€ ReserveView ๊ฐ€ ์กฐ๊ธˆ๋” ์ž์—ฐ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋‹ค๋“ฌ๊ธฐ +
+ +### 2024.01.07 +
+๋‚ด์šฉ + +1. MapView + - ์ง€๋„์˜ ๊ถŒํ•œ ํ—ˆ์šฉ ํŒ์—… ๋ฉ˜ํŠธ ์„ค์ • ๋ฐ ๊ถŒํ•œ ๋™์ž‘ ๊ตฌํ˜„ + - ํ˜„์žฌ ์œ„์น˜์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ›์•„์™€ ํ˜„์žฌ ์œ„์น˜๋กœ ์ด๋™ +
+ +### 2024.01.06 +
+๋‚ด์šฉ + +1. ReserveView: datePicker ์ˆ˜์ • + - ์˜ค๋Š˜ ๋‚ ์งœ๋ณด๋‹ค ์ด์ „ ์˜ˆ์•ฝ์€ ๋ง‰์•„์•ผ ํ•˜๋Š”๋ฐ ๋‚ด๋ถ€ ๋กœ์ง ์ƒ ๋‚ ์งœ ์ž…๋ ฅ์ด ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ ๋˜์ง€ ์•Š์•„ ์ˆ˜์ • + - yyyyMMdd ๋กœ ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ๋‘์ž๋ฆฌ ์ˆ˜ ๋ฏธ๋งŒ์˜ [์›”,์ผ]์ด ์ž…๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ์— yyyyMd ์™€ ๊ฐ™์ด ์ด์ƒํ•œ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๋Š”๊ฒƒ์„ ํ™•์ธ ํ•˜์˜€์Œ +2. ReserveView: MapView_searchView ์ˆ˜์ • + - ์ง€๋„ ํ™•์ธ์„ ์œ„ํ•ด ๋„์šฐ๋Š” VC์—์„œ AutoLayout ์„ค์ •๊ณผ ๊บผ์กŒ๋‹ค ์ผœ์ง ๋“ฑ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ • +
+ +### 2024.01.05 +
+๋‚ด์šฉ + +1. Git ๋“ฑ๋ก + - Local ๊ด€๋ฆฌ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ฒด๊ณ„์ ์ธ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ๋‹ค์‹œ ๋А๊ปด์„œ ์ž‘์—…๋ฌผ์„ Git์— ๋“ฑ๋ก +2. ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ • + - ๋‚ด๋ถ€ ๋กœ์ง์„ ๋Œ€๋Œ€๋กœ ์ˆ˜์ •ํ•˜๋ฉด์„œ "InputUserInfoView" ์™€์˜ ์—ฐ๊ฒฐ์ด ๋Š๊ฒจ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ • + +
+ + +--- +--- + +# ์ƒ๊ฐ ๊ฑฐ๋ฆฌ + +### ์ƒ๊ฐ์ค‘ +
+2024.01.06 + +``` +[ ] 1. ViewDelegate์™€ BaseVCDelegate ๋ฅผ ํ™œ์šฉํ•˜๋Š”๋ฐ ์ด ๋ถ€๋ถ„์„ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋Œ€์ฒด๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„ +``` +> ์ด๊ฑด ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ์ „ ๋ฒ”์œ„๋ฅผ ์ปค๋ฒ„์น˜๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ์„ธ์„ธํ•˜๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๊ณ ๋ ค๋ฅผ ํ•ด์•ผ ํ•˜๊ณ  ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋А๋‚Œ + +
+ +### ์‹คํ–‰ +
+2024.01.05 + +``` +[โœ“] 1. DatabaseManager์˜ Delegate ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋ถˆํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ์Œ completion ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ ํ•˜๋Š”๊ฒŒ ์–ด๋– ํ• ๊นŒ ํ•จ +``` +> ๋ถˆํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค๋ณด๋‹ˆ common ๋‹จ์œผ๋กœ ๊ตฌ์„ฑ์„ ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ณ„์†ํ•ด์„œ ํŠน์ • ์ƒํ™ฉ์— ๋งž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•˜๋Š” ์ด์ƒํ•œ ์ง“์„ ํ•˜๊ฒŒ ๋˜์–ด์„œ ์ˆ˜์ •์„ ํ•ด์•ผ ํ•จ์„ ๋А๋‚Œ + +
\ No newline at end of file