diff --git a/HalfFifty_FE/HalfFifty_FE.xcodeproj/project.pbxproj b/HalfFifty_FE/HalfFifty_FE.xcodeproj/project.pbxproj index 7885498..66636ea 100644 --- a/HalfFifty_FE/HalfFifty_FE.xcodeproj/project.pbxproj +++ b/HalfFifty_FE/HalfFifty_FE.xcodeproj/project.pbxproj @@ -8,8 +8,34 @@ /* Begin PBXBuildFile section */ 62B81F99579F54E3D0651E96 /* Pods_HalfFifty_FE.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063645F4E90C0E574D210B72 /* Pods_HalfFifty_FE.framework */; }; + A308F4627641A2E70EA14229 /* Pods_HalfFifty_Watch_Watch_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72002AFD7628AB971CC5C511 /* Pods_HalfFifty_Watch_Watch_App.framework */; }; + A52007552DC1170600C011A3 /* HalfFifty_Watch Watch App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = A52007322DC1170500C011A3 /* HalfFifty_Watch Watch App.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + A52007422DC1170600C011A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A5EAB71C2D2B6D2900FE064E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A52007312DC1170500C011A3; + remoteInfo = "HalfFifty_Watch Watch App"; + }; + A520074C2DC1170600C011A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A5EAB71C2D2B6D2900FE064E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A52007312DC1170500C011A3; + remoteInfo = "HalfFifty_Watch Watch App"; + }; + A52007532DC1170600C011A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A5EAB71C2D2B6D2900FE064E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A52007312DC1170500C011A3; + remoteInfo = "HalfFifty_Watch Watch App"; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ C9270D752D36472E00BDFD97 /* Embed Watch Content */ = { isa = PBXCopyFilesBuildPhase; @@ -17,6 +43,7 @@ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; dstSubfolderSpec = 16; files = ( + A52007552DC1170600C011A3 /* HalfFifty_Watch Watch App.app in Embed Watch Content */, ); name = "Embed Watch Content"; runOnlyForDeploymentPostprocessing = 0; @@ -27,10 +54,31 @@ 063645F4E90C0E574D210B72 /* Pods_HalfFifty_FE.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HalfFifty_FE.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 588071A65175D135D5607050 /* Pods-HalfFifty_FE.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HalfFifty_FE.debug.xcconfig"; path = "Target Support Files/Pods-HalfFifty_FE/Pods-HalfFifty_FE.debug.xcconfig"; sourceTree = ""; }; 648D7711C03ECCDD7DCC700E /* Pods-HalfFifty_FE.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HalfFifty_FE.release.xcconfig"; path = "Target Support Files/Pods-HalfFifty_FE/Pods-HalfFifty_FE.release.xcconfig"; sourceTree = ""; }; + 72002AFD7628AB971CC5C511 /* Pods_HalfFifty_Watch_Watch_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HalfFifty_Watch_Watch_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8FA234054B70C62A1E46B5CC /* Pods-HalfFifty_Watch Watch App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HalfFifty_Watch Watch App.debug.xcconfig"; path = "Target Support Files/Pods-HalfFifty_Watch Watch App/Pods-HalfFifty_Watch Watch App.debug.xcconfig"; sourceTree = ""; }; + A52007322DC1170500C011A3 /* HalfFifty_Watch Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "HalfFifty_Watch Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + A52007412DC1170600C011A3 /* HalfFifty_Watch Watch AppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HalfFifty_Watch Watch AppTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + A520074B2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HalfFifty_Watch Watch AppUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; A5EAB7242D2B6D2900FE064E /* HalfFifty_FE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HalfFifty_FE.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A6D7F3A9AB55E923F53F9CFA /* Pods-HalfFifty_Watch Watch App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HalfFifty_Watch Watch App.release.xcconfig"; path = "Target Support Files/Pods-HalfFifty_Watch Watch App/Pods-HalfFifty_Watch Watch App.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ + A52007332DC1170500C011A3 /* HalfFifty_Watch Watch App */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "HalfFifty_Watch Watch App"; + sourceTree = ""; + }; + A52007442DC1170600C011A3 /* HalfFifty_Watch Watch AppTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "HalfFifty_Watch Watch AppTests"; + sourceTree = ""; + }; + A520074E2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "HalfFifty_Watch Watch AppUITests"; + sourceTree = ""; + }; A5EAB7262D2B6D2900FE064E /* HalfFifty_FE */ = { isa = PBXFileSystemSynchronizedRootGroup; path = HalfFifty_FE; @@ -39,6 +87,28 @@ /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ + A520072F2DC1170500C011A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A308F4627641A2E70EA14229 /* Pods_HalfFifty_Watch_Watch_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A520073E2DC1170600C011A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A52007482DC1170600C011A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5EAB7212D2B6D2900FE064E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -54,6 +124,7 @@ isa = PBXGroup; children = ( 063645F4E90C0E574D210B72 /* Pods_HalfFifty_FE.framework */, + 72002AFD7628AB971CC5C511 /* Pods_HalfFifty_Watch_Watch_App.framework */, ); name = Frameworks; sourceTree = ""; @@ -62,6 +133,9 @@ isa = PBXGroup; children = ( A5EAB7262D2B6D2900FE064E /* HalfFifty_FE */, + A52007332DC1170500C011A3 /* HalfFifty_Watch Watch App */, + A52007442DC1170600C011A3 /* HalfFifty_Watch Watch AppTests */, + A520074E2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests */, A5EAB7252D2B6D2900FE064E /* Products */, BF302A069AA22BB498E776DD /* Pods */, 089E995F0F13B02E256D59D2 /* Frameworks */, @@ -72,6 +146,9 @@ isa = PBXGroup; children = ( A5EAB7242D2B6D2900FE064E /* HalfFifty_FE.app */, + A52007322DC1170500C011A3 /* HalfFifty_Watch Watch App.app */, + A52007412DC1170600C011A3 /* HalfFifty_Watch Watch AppTests.xctest */, + A520074B2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests.xctest */, ); name = Products; sourceTree = ""; @@ -81,6 +158,8 @@ children = ( 588071A65175D135D5607050 /* Pods-HalfFifty_FE.debug.xcconfig */, 648D7711C03ECCDD7DCC700E /* Pods-HalfFifty_FE.release.xcconfig */, + 8FA234054B70C62A1E46B5CC /* Pods-HalfFifty_Watch Watch App.debug.xcconfig */, + A6D7F3A9AB55E923F53F9CFA /* Pods-HalfFifty_Watch Watch App.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -88,6 +167,69 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + A52007312DC1170500C011A3 /* HalfFifty_Watch Watch App */ = { + isa = PBXNativeTarget; + buildConfigurationList = A520075C2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch App" */; + buildPhases = ( + 9D82DB479A424B574A0312FD /* [CP] Check Pods Manifest.lock */, + A520072E2DC1170500C011A3 /* Sources */, + A520072F2DC1170500C011A3 /* Frameworks */, + A52007302DC1170500C011A3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + A52007332DC1170500C011A3 /* HalfFifty_Watch Watch App */, + ); + name = "HalfFifty_Watch Watch App"; + productName = "HalfFifty_Watch Watch App"; + productReference = A52007322DC1170500C011A3 /* HalfFifty_Watch Watch App.app */; + productType = "com.apple.product-type.application"; + }; + A52007402DC1170600C011A3 /* HalfFifty_Watch Watch AppTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A520075D2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch AppTests" */; + buildPhases = ( + A520073D2DC1170600C011A3 /* Sources */, + A520073E2DC1170600C011A3 /* Frameworks */, + A520073F2DC1170600C011A3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A52007432DC1170600C011A3 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + A52007442DC1170600C011A3 /* HalfFifty_Watch Watch AppTests */, + ); + name = "HalfFifty_Watch Watch AppTests"; + productName = "HalfFifty_Watch Watch AppTests"; + productReference = A52007412DC1170600C011A3 /* HalfFifty_Watch Watch AppTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + A520074A2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A520075E2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch AppUITests" */; + buildPhases = ( + A52007472DC1170600C011A3 /* Sources */, + A52007482DC1170600C011A3 /* Frameworks */, + A52007492DC1170600C011A3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A520074D2DC1170600C011A3 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + A520074E2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests */, + ); + name = "HalfFifty_Watch Watch AppUITests"; + productName = "HalfFifty_Watch Watch AppUITests"; + productReference = A520074B2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; A5EAB7232D2B6D2900FE064E /* HalfFifty_FE */ = { isa = PBXNativeTarget; buildConfigurationList = A5EAB7322D2B6D2A00FE064E /* Build configuration list for PBXNativeTarget "HalfFifty_FE" */; @@ -101,6 +243,7 @@ buildRules = ( ); dependencies = ( + A52007542DC1170600C011A3 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( A5EAB7262D2B6D2900FE064E /* HalfFifty_FE */, @@ -120,6 +263,17 @@ LastSwiftUpdateCheck = 1620; LastUpgradeCheck = 1610; TargetAttributes = { + A52007312DC1170500C011A3 = { + CreatedOnToolsVersion = 16.2; + }; + A52007402DC1170600C011A3 = { + CreatedOnToolsVersion = 16.2; + TestTargetID = A52007312DC1170500C011A3; + }; + A520074A2DC1170600C011A3 = { + CreatedOnToolsVersion = 16.2; + TestTargetID = A52007312DC1170500C011A3; + }; A5EAB7232D2B6D2900FE064E = { CreatedOnToolsVersion = 16.1; }; @@ -140,11 +294,35 @@ projectRoot = ""; targets = ( A5EAB7232D2B6D2900FE064E /* HalfFifty_FE */, + A52007312DC1170500C011A3 /* HalfFifty_Watch Watch App */, + A52007402DC1170600C011A3 /* HalfFifty_Watch Watch AppTests */, + A520074A2DC1170600C011A3 /* HalfFifty_Watch Watch AppUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + A52007302DC1170500C011A3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A520073F2DC1170600C011A3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A52007492DC1170600C011A3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5EAB7222D2B6D2900FE064E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -155,6 +333,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 9D82DB479A424B574A0312FD /* [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-HalfFifty_Watch Watch App-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; + }; A6523ADDCD7C0B7E268A8AD4 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -180,6 +380,27 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + A520072E2DC1170500C011A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A520073D2DC1170600C011A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A52007472DC1170600C011A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; A5EAB7202D2B6D2900FE064E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -189,7 +410,168 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + A52007432DC1170600C011A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A52007312DC1170500C011A3 /* HalfFifty_Watch Watch App */; + targetProxy = A52007422DC1170600C011A3 /* PBXContainerItemProxy */; + }; + A520074D2DC1170600C011A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A52007312DC1170500C011A3 /* HalfFifty_Watch Watch App */; + targetProxy = A520074C2DC1170600C011A3 /* PBXContainerItemProxy */; + }; + A52007542DC1170600C011A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A52007312DC1170500C011A3 /* HalfFifty_Watch Watch App */; + targetProxy = A52007532DC1170600C011A3 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + A52007562DC1170600C011A3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8FA234054B70C62A1E46B5CC /* Pods-HalfFifty_Watch Watch App.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"HalfFifty_Watch Watch App/Preview Content\""; + DEVELOPMENT_TEAM = 78678N7NGX; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = HalfFifty_Watch; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "com.minji.HalfFifty-FE"; + INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.minji.HalfFifty-FE.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Debug; + }; + A52007572DC1170600C011A3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A6D7F3A9AB55E923F53F9CFA /* Pods-HalfFifty_Watch Watch App.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"HalfFifty_Watch Watch App/Preview Content\""; + DEVELOPMENT_TEAM = 78678N7NGX; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = HalfFifty_Watch; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "com.minji.HalfFifty-FE"; + INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.minji.HalfFifty-FE.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Release; + }; + A52007582DC1170600C011A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 78678N7NGX; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HalfFifty-Watch-Watch-AppTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HalfFifty_Watch Watch App.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/HalfFifty_Watch Watch App"; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Debug; + }; + A52007592DC1170600C011A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 78678N7NGX; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HalfFifty-Watch-Watch-AppTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HalfFifty_Watch Watch App.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/HalfFifty_Watch Watch App"; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Release; + }; + A520075A2DC1170600C011A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 78678N7NGX; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HalfFifty-Watch-Watch-AppUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_TARGET_NAME = "HalfFifty_Watch Watch App"; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Debug; + }; + A520075B2DC1170600C011A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 78678N7NGX; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HalfFifty-Watch-Watch-AppUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_TARGET_NAME = "HalfFifty_Watch Watch App"; + WATCHOS_DEPLOYMENT_TARGET = 11.2; + }; + name = Release; + }; A5EAB7302D2B6D2A00FE064E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -315,6 +697,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"HalfFifty_FE/Preview Content\""; @@ -326,6 +709,8 @@ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIStatusBarHidden = NO; + INFOPLIST_KEY_UIStatusBarStyle = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "halffifty.HalfFifty-FE"; @@ -348,6 +733,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -360,6 +746,8 @@ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIStatusBarHidden = NO; + INFOPLIST_KEY_UIStatusBarStyle = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "halffifty.HalfFifty-FE"; @@ -380,6 +768,33 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + A520075C2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A52007562DC1170600C011A3 /* Debug */, + A52007572DC1170600C011A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A520075D2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch AppTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A52007582DC1170600C011A3 /* Debug */, + A52007592DC1170600C011A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A520075E2DC1170600C011A3 /* Build configuration list for PBXNativeTarget "HalfFifty_Watch Watch AppUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A520075A2DC1170600C011A3 /* Debug */, + A520075B2DC1170600C011A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; A5EAB71F2D2B6D2900FE064E /* Build configuration list for PBXProject "HalfFifty_FE" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_FE.xcscheme b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_FE.xcscheme new file mode 100644 index 0000000..ac6d464 --- /dev/null +++ b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_FE.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_Watch Watch AppTests.xcscheme b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_Watch Watch AppTests.xcscheme new file mode 100644 index 0000000..23426be --- /dev/null +++ b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcshareddata/xcschemes/HalfFifty_Watch Watch AppTests.xcscheme @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcuserdata/minmin.xcuserdatad/xcschemes/xcschememanagement.plist b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcuserdata/minmin.xcuserdatad/xcschemes/xcschememanagement.plist index 53c1899..b178467 100644 --- a/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcuserdata/minmin.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/HalfFifty_FE/HalfFifty_FE.xcodeproj/xcuserdata/minmin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -3,9 +3,35 @@ SchemeUserState - + + HalfFifty_FE.xcscheme_^#shared#^_ + + orderHint + 4 + + HalfFifty_Watch Watch AppTests.xcscheme_^#shared#^_ + + orderHint + 6 + + SuppressBuildableAutocreation + A52007312DC1170500C011A3 + + primary + + + A52007402DC1170600C011A3 + + primary + + + A520074A2DC1170600C011A3 + + primary + + A5EAB7232D2B6D2900FE064E primary diff --git a/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-2.imageset/Contents.json b/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-2.imageset/Contents.json index f4a0de1..9ae369d 100644 --- a/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-2.imageset/Contents.json +++ b/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-2.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "tutorial-2.png", + "filename" : "tutorial-3.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-3.imageset/Contents.json b/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-3.imageset/Contents.json deleted file mode 100644 index 9ae369d..0000000 --- a/HalfFifty_FE/HalfFifty_FE/Assets.xcassets/tutorial-3.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "tutorial-3.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/HalfFifty_FE/HalfFifty_FE/View/Setting/CustomerCenterView.swift b/HalfFifty_FE/HalfFifty_FE/View/Setting/CustomerCenterView.swift index 99bb3bf..c39440c 100644 --- a/HalfFifty_FE/HalfFifty_FE/View/Setting/CustomerCenterView.swift +++ b/HalfFifty_FE/HalfFifty_FE/View/Setting/CustomerCenterView.swift @@ -8,15 +8,12 @@ import SwiftUI struct CustomerCenterView: View { - @State private var questions: [Question] = [ -// Question(id: 1, date: "2025.01.07", status: .answered, question: "카메라로 얼굴을 인식하면 도용 관련 문제는 없나요?", answer: "얼굴 인식 기술은 매우 편리하지만, 도용에 대한 걱정이 있을 수 있습니다.\n이를 방지하기 위해 저희는 사진이나 영상으로는 인증이 되지 않도록 3D 얼굴 인식이나 심도 카메라 같은 안전한 기술을 사용하고 있습니다."), -// Question(id: 2, date: "2025.01.07", status: .pending, question: "카메라로 얼굴을 인식하면 도용 관련 문제는 없나요?", answer: nil) - ] - @State private var selectedQuestionID: Int? = nil + @StateObject private var viewModel = AQViewModel() + @State private var selectedQuestionID: UUID? = nil var body: some View { VStack { - if questions.isEmpty { + if viewModel.aqs.isEmpty { Spacer() Text("질문이 존재하지 않습니다") .font(.system(size: 16)) @@ -25,14 +22,14 @@ struct CustomerCenterView: View { } else { ScrollView { VStack(spacing: 10) { - ForEach(questions) { question in + ForEach(viewModel.aqs) { aq in QuestionRow( - question: question, - isExpanded: selectedQuestionID == question.id + question: aq, + isExpanded: selectedQuestionID == aq.aqId ) .onTapGesture { withAnimation { - selectedQuestionID = selectedQuestionID == question.id ? nil : question.id + selectedQuestionID = selectedQuestionID == aq.aqId ? nil : aq.aqId } } } @@ -49,7 +46,7 @@ struct CustomerCenterView: View { .foregroundColor(.white) .frame(maxWidth: .infinity) .padding() - .background(Color(red: 0.2549019607843137, green: 0.4117647058823529, blue: 0.8823529411764706)) + .background(Color.blue) .cornerRadius(8) .padding(.horizontal, 16) } @@ -59,28 +56,33 @@ struct CustomerCenterView: View { .navigationTitle("고객센터") .navigationBarTitleDisplayMode(.inline) .background(Color(UIColor.systemGray6)) + .onAppear { + viewModel.fetchAQ(userId: "1f273112-8e93-4444-a403-a986f8bea4a2") + } } } struct QuestionRow: View { - let question: Question + let question: AQ let isExpanded: Bool var body: some View { VStack(alignment: .leading, spacing: 8) { HStack { - Text(question.status.rawValue) + Text(question.isAnswer ? "답변완료" : "답변예정") .font(.system(size: 12)) .foregroundColor(.gray) - Text(" | \(question.date)") + Text(" | \(formattedDate(question.questionCreatedAt))") .font(.system(size: 12)) .foregroundColor(.gray) Spacer() - Image(systemName: isExpanded ? "chevron.up" : "chevron.down") - .foregroundColor(.gray) + if question.isAnswer { + Image(systemName: isExpanded ? "chevron.up" : "chevron.down") + .foregroundColor(.gray) + } } Text("Q. \(question.question)") @@ -101,17 +103,70 @@ struct QuestionRow: View { } } -struct Question: Identifiable { - let id: Int - let date: String - let status: QuestionStatus +class AQViewModel: ObservableObject { + @Published var aqs: [AQ] = [] + @Published var isLoading = false + + func fetchAQ(userId: String) { + guard let url = URL(string: "http://54.180.92.32/AQ/user/\(userId)") else { return } + + isLoading = true + + URLSession.shared.dataTask(with: url) { data, response, error in + DispatchQueue.main.async { + self.isLoading = false + + if let error = error { + print("AQ 불러오기 오류: \(error.localizedDescription)") + return + } + + guard let data = data else { return } + + do { + let decodedResponse = try JSONDecoder().decode(AQResponse.self, from: data) + if decodedResponse.success { + self.aqs = decodedResponse.AQList + } else { + print("AQ 불러오기 실패: \(decodedResponse.message)") + } + } catch { + print("디코딩 오류: \(error.localizedDescription)") + } + } + }.resume() + } +} + +struct AQResponse: Codable { + let success: Bool + let message: String + let AQList: [AQ] +} + +struct AQ: Codable, Identifiable { + let aqId: UUID let question: String let answer: String? + let questionCreatedAt: String + let answerCreatedAt: String? + let isAnswer: Bool + + var id: UUID { aqId } } -enum QuestionStatus: String { - case answered = "답변완료" - case pending = "답변예정" +func formattedDate(_ dateString: String) -> String { + let inputFormatter = DateFormatter() + inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" + inputFormatter.locale = Locale(identifier: "ko_KR") + inputFormatter.timeZone = TimeZone(abbreviation: "KST") + + if let date = inputFormatter.date(from: dateString) { + let outputFormatter = DateFormatter() + outputFormatter.dateFormat = "yyyy.MM.dd" + return outputFormatter.string(from: date) + } + return "날짜 오류" } #Preview { diff --git a/HalfFifty_FE/HalfFifty_FE/View/Setting/InquiryView.swift b/HalfFifty_FE/HalfFifty_FE/View/Setting/InquiryView.swift index 1e17e2e..fb45841 100644 --- a/HalfFifty_FE/HalfFifty_FE/View/Setting/InquiryView.swift +++ b/HalfFifty_FE/HalfFifty_FE/View/Setting/InquiryView.swift @@ -9,7 +9,10 @@ import SwiftUI struct InquiryView: View { @State private var questionText: String = "" - + @StateObject private var viewModel = AQViewModel() + @Environment(\.presentationMode) var presentationMode // 화면 닫기용 + @State private var showErrorAlert = false + var body: some View { VStack(alignment: .leading) { // 질문 입력란 @@ -33,26 +36,28 @@ struct InquiryView: View { ) } .padding(.top, 16) - + // 안내 문구 Text("해당 서비스의 궁금한 점에 대해 질문해주세요. 친절하게 답변해드립니다.") .font(.system(size: 14)) .foregroundColor(.gray) .padding(.top, 10) .padding(.leading, 10) - + Spacer() - + // 질문하기 버튼 Button(action: { - // 질문 제출 기능 추가 가능 + viewModel.saveAQ(userId: "1f273112-8e93-4444-a403-a986f8bea4a2", question: questionText) {_ in + presentationMode.wrappedValue.dismiss() // 성공 시 화면 닫기 + } }) { Text("질문하기") .font(.system(size: 18, weight: .bold)) .foregroundColor(.white) .frame(maxWidth: .infinity) .padding() - .background(questionText.isEmpty ? Color.gray.opacity(0.5) : Color(red: 0.2549019607843137, green: 0.4117647058823529, blue: 0.8823529411764706)) + .background(questionText.isEmpty ? Color.gray.opacity(0.5) : Color.blue) .cornerRadius(8) } .disabled(questionText.isEmpty) @@ -66,6 +71,60 @@ struct InquiryView: View { } } +extension AQViewModel { + func saveAQ(userId: String, question: String, completion: @escaping (Bool) -> Void) { + guard let url = URL(string: "http://54.180.92.32/AQ") else { + completion(false) + return + } + + let requestData: [String: Any] = [ + "userId": userId, + "question": question + ] + + guard let jsonData = try? JSONSerialization.data(withJSONObject: requestData) else { + completion(false) + return + } + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = jsonData + + URLSession.shared.dataTask(with: request) { data, response, error in + DispatchQueue.main.async { + if let error = error { + print("질문 등록 오류: \(error.localizedDescription)") + completion(false) + return + } + + guard let data = data else { + print("응답 데이터 없음") + completion(false) + return + } + + do { + let decodedResponse = try JSONDecoder().decode(AQResponse.self, from: data) + if decodedResponse.success { + print("질문 등록 성공: \(decodedResponse.message)") + completion(true) + } else { + print("질문 등록 실패: \(decodedResponse.message)") + completion(false) + } + } catch { + print("디코딩 오류: \(error.localizedDescription)") + completion(false) + } + } + }.resume() + } +} + #Preview { InquiryView() } diff --git a/HalfFifty_FE/HalfFifty_Watch Watch App/Assets.xcassets/AccentColor.colorset/Contents.json b/HalfFifty_FE/HalfFifty_Watch Watch App/Assets.xcassets/AccentColor.colorset/Contents.json index 17418e2..eb87897 100644 --- a/HalfFifty_FE/HalfFifty_Watch Watch App/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/HalfFifty_FE/HalfFifty_Watch Watch App/Assets.xcassets/AccentColor.colorset/Contents.json @@ -2,13 +2,6 @@ "colors" : [ { "idiom" : "universal" - }, - { - "color" : { - "platform" : "watchos", - "reference" : "systemBlueColor" - }, - "idiom" : "watch" } ], "info" : { diff --git a/HalfFifty_FE/Podfile b/HalfFifty_FE/Podfile index 978b82c..c323fad 100644 --- a/HalfFifty_FE/Podfile +++ b/HalfFifty_FE/Podfile @@ -3,4 +3,10 @@ use_frameworks! target 'HalfFifty_FE' do pod 'MediaPipeTasksVision' -end \ No newline at end of file +end + +target 'HalfFifty_Watch Watch App' do + platform :watchos, '9.0' + use_frameworks! + +end diff --git a/HalfFifty_FE/Podfile.lock b/HalfFifty_FE/Podfile.lock index f9aca20..f91e473 100644 --- a/HalfFifty_FE/Podfile.lock +++ b/HalfFifty_FE/Podfile.lock @@ -15,6 +15,6 @@ SPEC CHECKSUMS: MediaPipeTasksCommon: 04b56e3156fafc3d0be54fd3e5749ebdd2a28436 MediaPipeTasksVision: b1edea3da2f069b61d4f498de400ffc94cefea20 -PODFILE CHECKSUM: c13fca695bc1719d08a9fb8faffe85fe48a91390 +PODFILE CHECKSUM: 026c7f887af0c871e58ab0607cc293dbd67e5fe1 COCOAPODS: 1.16.2 diff --git "a/documents/S3-7 \352\271\200\353\257\274\354\247\200, \353\254\270\354\260\275\355\230\204, \354\234\240\354\210\230\355\230\204, \354\236\204\354\240\225\354\234\244 2\354\260\250 \354\204\244\352\263\204\354\204\234.pptx" "b/documents/S3-7 \352\271\200\353\257\274\354\247\200, \353\254\270\354\260\275\355\230\204, \354\234\240\354\210\230\355\230\204, \354\236\204\354\240\225\354\234\244 2\354\260\250 \354\204\244\352\263\204\354\204\234.pptx" new file mode 100644 index 0000000..23380b6 Binary files /dev/null and "b/documents/S3-7 \352\271\200\353\257\274\354\247\200, \353\254\270\354\260\275\355\230\204, \354\234\240\354\210\230\355\230\204, \354\236\204\354\240\225\354\234\244 2\354\260\250 \354\204\244\352\263\204\354\204\234.pptx" differ