diff --git a/.github/workflows/Xcode_build_test.yml b/.github/workflows/Xcode_build_test.yml
index d61884a..116eb3d 100644
--- a/.github/workflows/Xcode_build_test.yml
+++ b/.github/workflows/Xcode_build_test.yml
@@ -1,7 +1,7 @@
name: Xcode_build_test
env:
- PACKAGES_JSON: '["MSCoreKit", "MSFoundation", "MSUIKit"]'
+ WORKSPACE: iOS/MusicSpot.xcworkspace
on:
pull_request:
@@ -14,7 +14,7 @@ jobs:
prepare-matrix:
runs-on: macos-13
outputs:
- matrix: ${{ steps.set-matrix.outputs.matrix }}
+ matrix: ${{ steps.generate-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
@@ -24,45 +24,21 @@ jobs:
with:
xcode-version: '15.0.1'
- - name: Install jq
- run: brew install jq
-
- name: Generate matrix
- id: set-matrix
+ id: generate-matrix
run: |
- cd iOS
matrix="{\"include\":["
- packages=$(echo $PACKAGES_JSON | jq -r '.[]')
first_entry=true
- for package in $packages; do
- cd $package
- for scheme in $(xcodebuild -list | grep -E '^[[:space:]]*Schemes:' -A 10 | tail -n +2 | grep -v '^$'); do
- if [[ $scheme != *"-Package" ]] && [[ $scheme != *"Tests" ]]; then
- if [ "$first_entry" = true ]; then
- first_entry=false
- else
- matrix+=","
- fi
- matrix+="{\"package\":\"$package\", \"scheme\":\"$scheme\"}"
+ for scheme in $(xcodebuild -workspace ${{ env.WORKSPACE }} -list | grep -A 100 "Schemes:" | grep -v "Schemes:" | sed '/^$/d' | sed 's/^[ \t]*//'); do
+ if [[ $scheme != *"-Package" ]] && [[ $scheme != *"Tests" ]]; then
+ if [ "$first_entry" = true ]; then
+ first_entry=false
+ else
+ matrix+=","
fi
- done
- cd ..
+ matrix+="{\"scheme\":\"$scheme\"}"
+ fi
done
- # cd Features
- # for package in JourneyList SaveJourney; do
- # cd $package
- # for scheme in $(xcodebuild -list | grep -E '^[[:space:]]*Schemes:' -A 10 | tail -n +2 | grep -v '^$'); do
- # if [[ $scheme != *"-Package" ]]; then
- # if [ "$first_entry" = true ]; then
- # first_entry=false
- # else
- # matrix+=","
- # fi
- # matrix+="{\"package\":\"$package\", \"scheme\":\"$scheme\"}"
- # fi
- # done
- # cd ..
- # done
matrix+="]}"
echo "matrix=$matrix" >> $GITHUB_OUTPUT
@@ -82,11 +58,10 @@ jobs:
xcode-version: '15.0.1'
- name: 🛠️ Build ${{ matrix.scheme }}
- if: ${{ !contains(matrix.scheme, 'Tests') }}
run: |
- echo "🛠️ Building ${{ matrix.package }} - Scheme: ${{ matrix.scheme }}"
- cd iOS/${{ matrix.package }}
+ echo "🛠️ Building ${{ matrix.scheme }}"
xcodebuild \
+ -workspace ${{ env.WORKSPACE }} \
-scheme ${{ matrix.scheme }} \
-sdk 'iphonesimulator' \
-destination 'platform=iOS Simulator,OS=17.0.1,name=iPhone 15 Pro' \
@@ -95,12 +70,33 @@ jobs:
prepare-test-matrix:
runs-on: macos-13
outputs:
- matrix: ${{ steps.set-matrix.outputs.matrix }}
+ matrix: ${{ steps.generate-test-matrix.outputs.matrix }}
steps:
- - id: set-matrix
- run: |
- matrix="{\"package\": $PACKAGES_JSON}"
- echo "matrix=$matrix" >> $GITHUB_OUTPUT
+ - uses: actions/checkout@v4
+
+ - name: Setup Xcode
+ if: ${{ !env.ACT }}
+ uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: '15.0.1'
+
+ - name: Generate test matrix
+ id: generate-test-matrix
+ run: |
+ matrix="{\"include\":["
+ first_entry=true
+ for scheme in $(xcodebuild -workspace ${{ env.WORKSPACE }} -list | grep -A 100 "Schemes:" | grep -v "Schemes:" | sed '/^$/d' | sed 's/^[ \t]*//'); do
+ if [[ $scheme == *"Tests" ]]; then
+ if [ "$first_entry" = true ]; then
+ first_entry=false
+ else
+ matrix+=","
+ fi
+ matrix+="{\"scheme\":\"$scheme\"}"
+ fi
+ done
+ matrix+="]}"
+ echo "matrix=$matrix" >> $GITHUB_OUTPUT
xcode-test:
needs: prepare-test-matrix
@@ -117,12 +113,12 @@ jobs:
with:
xcode-version: '15.0.1'
- - name: 🧪 Test ${{ matrix.package }}
+ - name: 🧪 Test ${{ matrix.scheme }}
run: |
- echo "🧪 Testing ${{ matrix.package }}"
- cd iOS/${{ matrix.package }}
+ echo "🧪 Testing ${{ matrix.scheme }}"
xcodebuild \
- -scheme ${{ matrix.package }}-Package \
+ -workspace ${{ env.WORKSPACE }} \
+ -scheme ${{ matrix.scheme }} \
-sdk 'iphonesimulator' \
-destination 'platform=iOS Simulator,OS=17.0.1,name=iPhone 15 Pro' \
- clean test
+ test
diff --git a/iOS/Features/Home/.gitignore b/iOS/Features/Home/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/Features/Home/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/Features/Home/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/Home/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/Home/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/NavigateMap.xcscheme b/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/NavigateMap.xcscheme
new file mode 100644
index 0000000..f4a8537
--- /dev/null
+++ b/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/NavigateMap.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/RecordJourney.xcscheme b/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/RecordJourney.xcscheme
new file mode 100644
index 0000000..c01b3e3
--- /dev/null
+++ b/iOS/Features/Home/.swiftpm/xcode/xcshareddata/xcschemes/RecordJourney.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.pbxproj b/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..50ce04a
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,403 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4D5E2B17349A002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D5D2B17349A002F0748 /* AppDelegate.swift */; };
+ DDAA4D602B17349A002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D5F2B17349A002F0748 /* SceneDelegate.swift */; };
+ DDAA4D622B17349A002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D612B17349A002F0748 /* ViewController.swift */; };
+ DDAA4D652B17349A002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D632B17349A002F0748 /* Main.storyboard */; };
+ DDAA4D672B17349C002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D662B17349C002F0748 /* Assets.xcassets */; };
+ DDAA4D6A2B17349C002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D682B17349C002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4D732B1734C3002F0748 /* NavigateMap in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4D722B1734C3002F0748 /* NavigateMap */; };
+ DDAA4D752B1734C3002F0748 /* RecordJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4D742B1734C3002F0748 /* RecordJourney */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4D5A2B17349A002F0748 /* HomeDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HomeDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4D5D2B17349A002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4D5F2B17349A002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4D612B17349A002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4D642B17349A002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4D662B17349C002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4D692B17349C002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4D6B2B17349C002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4D572B17349A002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D752B1734C3002F0748 /* RecordJourney in Frameworks */,
+ DDAA4D732B1734C3002F0748 /* NavigateMap in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4D512B17349A002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D5C2B17349A002F0748 /* HomeDemo */,
+ DDAA4D5B2B17349A002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4D5B2B17349A002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D5A2B17349A002F0748 /* HomeDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4D5C2B17349A002F0748 /* HomeDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D5D2B17349A002F0748 /* AppDelegate.swift */,
+ DDAA4D5F2B17349A002F0748 /* SceneDelegate.swift */,
+ DDAA4D612B17349A002F0748 /* ViewController.swift */,
+ DDAA4D632B17349A002F0748 /* Main.storyboard */,
+ DDAA4D662B17349C002F0748 /* Assets.xcassets */,
+ DDAA4D682B17349C002F0748 /* LaunchScreen.storyboard */,
+ DDAA4D6B2B17349C002F0748 /* Info.plist */,
+ );
+ path = HomeDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4D592B17349A002F0748 /* HomeDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4D6E2B17349C002F0748 /* Build configuration list for PBXNativeTarget "HomeDemo" */;
+ buildPhases = (
+ DDAA4D562B17349A002F0748 /* Sources */,
+ DDAA4D572B17349A002F0748 /* Frameworks */,
+ DDAA4D582B17349A002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = HomeDemo;
+ packageProductDependencies = (
+ DDAA4D722B1734C3002F0748 /* NavigateMap */,
+ DDAA4D742B1734C3002F0748 /* RecordJourney */,
+ );
+ productName = HomeDemo;
+ productReference = DDAA4D5A2B17349A002F0748 /* HomeDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4D522B17349A002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4D592B17349A002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4D552B17349A002F0748 /* Build configuration list for PBXProject "HomeDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4D512B17349A002F0748;
+ packageReferences = (
+ DDAA4D712B1734C3002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4D5B2B17349A002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4D592B17349A002F0748 /* HomeDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4D582B17349A002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D6A2B17349C002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4D672B17349C002F0748 /* Assets.xcassets in Resources */,
+ DDAA4D652B17349A002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4D562B17349A002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D622B17349A002F0748 /* ViewController.swift in Sources */,
+ DDAA4D5E2B17349A002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4D602B17349A002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4D632B17349A002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4D642B17349A002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4D682B17349C002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4D692B17349C002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4D6C2B17349C002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4D6D2B17349C002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4D6F2B17349C002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = HomeDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.HomeDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4D702B17349C002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = HomeDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.HomeDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4D552B17349A002F0748 /* Build configuration list for PBXProject "HomeDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4D6C2B17349C002F0748 /* Debug */,
+ DDAA4D6D2B17349C002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4D6E2B17349C002F0748 /* Build configuration list for PBXNativeTarget "HomeDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4D6F2B17349C002F0748 /* Debug */,
+ DDAA4D702B17349C002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4D712B1734C3002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4D722B1734C3002F0748 /* NavigateMap */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = NavigateMap;
+ };
+ DDAA4D742B1734C3002F0748 /* RecordJourney */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = RecordJourney;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4D522B17349A002F0748 /* Project object */;
+}
diff --git a/iOS/Features/JourneyList/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from iOS/Features/JourneyList/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
rename to iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/AppDelegate.swift b/iOS/Features/Home/HomeDemo/HomeDemo/AppDelegate.swift
new file mode 100644
index 0000000..014d7a2
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// HomeDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/Contents.json b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/Main.storyboard b/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/Info.plist b/iOS/Features/Home/HomeDemo/HomeDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/SceneDelegate.swift b/iOS/Features/Home/HomeDemo/HomeDemo/SceneDelegate.swift
new file mode 100644
index 0000000..0144605
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// HomeDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/Home/HomeDemo/HomeDemo/ViewController.swift b/iOS/Features/Home/HomeDemo/HomeDemo/ViewController.swift
new file mode 100644
index 0000000..2ee0cf6
--- /dev/null
+++ b/iOS/Features/Home/HomeDemo/HomeDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// HomeDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/Features/Home/Package.swift b/iOS/Features/Home/Package.swift
new file mode 100644
index 0000000..237d1a7
--- /dev/null
+++ b/iOS/Features/Home/Package.swift
@@ -0,0 +1,38 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+// MARK: - Constants
+
+private extension String {
+
+ static let package = "FeatureHome"
+
+}
+
+private enum Target {
+
+ static let navigateMap = "NavigateMap"
+ static let recordJourney = "RecordJourney"
+
+}
+
+// MARK: - Package
+
+let package = Package(
+ name: .package,
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: Target.navigateMap,
+ targets: [Target.navigateMap]),
+ .library(name: Target.recordJourney,
+ targets: [Target.recordJourney])
+ ],
+ targets: [
+ .target(name: Target.navigateMap),
+ .target(name: Target.recordJourney)
+ ]
+)
diff --git a/iOS/Features/Home/Sources/NavigateMap/NavigateMap.swift b/iOS/Features/Home/Sources/NavigateMap/NavigateMap.swift
new file mode 100644
index 0000000..57f01ed
--- /dev/null
+++ b/iOS/Features/Home/Sources/NavigateMap/NavigateMap.swift
@@ -0,0 +1,8 @@
+//
+// NavigateMap.swift
+// Home
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import Foundation
diff --git a/iOS/Features/Home/Sources/RecordJourney/RecordJourney.swift b/iOS/Features/Home/Sources/RecordJourney/RecordJourney.swift
new file mode 100644
index 0000000..17512ba
--- /dev/null
+++ b/iOS/Features/Home/Sources/RecordJourney/RecordJourney.swift
@@ -0,0 +1,8 @@
+//
+// RecordJourney.swift
+// Home
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import Foundation
diff --git a/iOS/Features/JourneyList/.gitignore b/iOS/Features/JourneyList/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/Features/JourneyList/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/Features/JourneyList/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/JourneyList/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/JourneyList/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/JourneyList/.swiftpm/xcode/xcshareddata/xcschemes/JourneyList.xcscheme b/iOS/Features/JourneyList/.swiftpm/xcode/xcshareddata/xcschemes/JourneyList.xcscheme
new file mode 100644
index 0000000..e56683b
--- /dev/null
+++ b/iOS/Features/JourneyList/.swiftpm/xcode/xcshareddata/xcschemes/JourneyList.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.pbxproj b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..8c8f3ff
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4D832B1734F9002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D822B1734F9002F0748 /* AppDelegate.swift */; };
+ DDAA4D852B1734F9002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D842B1734F9002F0748 /* SceneDelegate.swift */; };
+ DDAA4D872B1734F9002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4D862B1734F9002F0748 /* ViewController.swift */; };
+ DDAA4D8A2B1734F9002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D882B1734F9002F0748 /* Main.storyboard */; };
+ DDAA4D8C2B1734FB002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D8B2B1734FB002F0748 /* Assets.xcassets */; };
+ DDAA4D8F2B1734FB002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4D8D2B1734FB002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4D982B173512002F0748 /* JourneyList in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4D972B173512002F0748 /* JourneyList */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4D7F2B1734F9002F0748 /* JourneyListDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JourneyListDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4D822B1734F9002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4D842B1734F9002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4D862B1734F9002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4D892B1734F9002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4D8B2B1734FB002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4D8E2B1734FB002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4D902B1734FB002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4D7C2B1734F9002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D982B173512002F0748 /* JourneyList in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4D762B1734F9002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D812B1734F9002F0748 /* JourneyListDemo */,
+ DDAA4D802B1734F9002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4D802B1734F9002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D7F2B1734F9002F0748 /* JourneyListDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4D812B1734F9002F0748 /* JourneyListDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4D822B1734F9002F0748 /* AppDelegate.swift */,
+ DDAA4D842B1734F9002F0748 /* SceneDelegate.swift */,
+ DDAA4D862B1734F9002F0748 /* ViewController.swift */,
+ DDAA4D882B1734F9002F0748 /* Main.storyboard */,
+ DDAA4D8B2B1734FB002F0748 /* Assets.xcassets */,
+ DDAA4D8D2B1734FB002F0748 /* LaunchScreen.storyboard */,
+ DDAA4D902B1734FB002F0748 /* Info.plist */,
+ );
+ path = JourneyListDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4D7E2B1734F9002F0748 /* JourneyListDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4D932B1734FB002F0748 /* Build configuration list for PBXNativeTarget "JourneyListDemo" */;
+ buildPhases = (
+ DDAA4D7B2B1734F9002F0748 /* Sources */,
+ DDAA4D7C2B1734F9002F0748 /* Frameworks */,
+ DDAA4D7D2B1734F9002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = JourneyListDemo;
+ packageProductDependencies = (
+ DDAA4D972B173512002F0748 /* JourneyList */,
+ );
+ productName = JourneyListDemo;
+ productReference = DDAA4D7F2B1734F9002F0748 /* JourneyListDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4D772B1734F9002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4D7E2B1734F9002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4D7A2B1734F9002F0748 /* Build configuration list for PBXProject "JourneyListDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4D762B1734F9002F0748;
+ packageReferences = (
+ DDAA4D962B173512002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4D802B1734F9002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4D7E2B1734F9002F0748 /* JourneyListDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4D7D2B1734F9002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D8F2B1734FB002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4D8C2B1734FB002F0748 /* Assets.xcassets in Resources */,
+ DDAA4D8A2B1734F9002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4D7B2B1734F9002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4D872B1734F9002F0748 /* ViewController.swift in Sources */,
+ DDAA4D832B1734F9002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4D852B1734F9002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4D882B1734F9002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4D892B1734F9002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4D8D2B1734FB002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4D8E2B1734FB002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4D912B1734FB002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4D922B1734FB002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4D942B1734FB002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = JourneyListDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.JourneyListDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4D952B1734FB002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = JourneyListDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.JourneyListDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4D7A2B1734F9002F0748 /* Build configuration list for PBXProject "JourneyListDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4D912B1734FB002F0748 /* Debug */,
+ DDAA4D922B1734FB002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4D932B1734FB002F0748 /* Build configuration list for PBXNativeTarget "JourneyListDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4D942B1734FB002F0748 /* Debug */,
+ DDAA4D952B1734FB002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4D962B173512002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4D972B173512002F0748 /* JourneyList */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = JourneyList;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4D772B1734F9002F0748 /* Project object */;
+}
diff --git a/iOS/Features/SaveJourney/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from iOS/Features/SaveJourney/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
rename to iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/AppDelegate.swift b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/AppDelegate.swift
new file mode 100644
index 0000000..a1148cd
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// JourneyListDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/Contents.json b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/Main.storyboard b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Info.plist b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/SceneDelegate.swift b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/SceneDelegate.swift
new file mode 100644
index 0000000..1a1942a
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// JourneyListDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/ViewController.swift b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/ViewController.swift
new file mode 100644
index 0000000..26aa375
--- /dev/null
+++ b/iOS/Features/JourneyList/JourneyListDemo/JourneyListDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// JourneyListDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/Features/JourneyList/Package.swift b/iOS/Features/JourneyList/Package.swift
new file mode 100644
index 0000000..0b44822
--- /dev/null
+++ b/iOS/Features/JourneyList/Package.swift
@@ -0,0 +1,34 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+// MARK: - Constants
+
+private extension String {
+
+ static let package = "FeatureJourneyList"
+
+}
+
+private enum Target {
+
+ static let journeyList = "JourneyList"
+
+}
+
+// MARK: - Package
+
+let package = Package(
+ name: .package,
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: Target.journeyList,
+ targets: [Target.journeyList])
+ ],
+ targets: [
+ .target(name: Target.journeyList)
+ ]
+)
diff --git a/iOS/Features/JourneyList/Sources/JourneyList/JourneyList.swift b/iOS/Features/JourneyList/Sources/JourneyList/JourneyList.swift
new file mode 100644
index 0000000..fa1180d
--- /dev/null
+++ b/iOS/Features/JourneyList/Sources/JourneyList/JourneyList.swift
@@ -0,0 +1,8 @@
+//
+// JourneyList.swift
+// JourneyList
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import Foundation
diff --git a/iOS/Features/RewindJourney/.swiftpm/xcode/xcshareddata/xcschemes/RewindJourney.xcscheme b/iOS/Features/RewindJourney/.swiftpm/xcode/xcshareddata/xcschemes/RewindJourney.xcscheme
new file mode 100644
index 0000000..b502766
--- /dev/null
+++ b/iOS/Features/RewindJourney/.swiftpm/xcode/xcshareddata/xcschemes/RewindJourney.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/RewindJourney/Package.swift b/iOS/Features/RewindJourney/Package.swift
index aeabaf3..6fb271e 100644
--- a/iOS/Features/RewindJourney/Package.swift
+++ b/iOS/Features/RewindJourney/Package.swift
@@ -5,25 +5,32 @@ import PackageDescription
// MARK: - Constants
-extension String {
- static let package = "RewindJourney"
- static let rewindJourneyView = "RewindJourneyView"
- static let msUIKit = "MSUIKit"
- static let msFoundation = "MSFoundation"
- static let msDesignsystem = "MSDesignSystem"
- static let msLogger = "MSLogger"
+private extension String {
+
+ static let package = "FeatureRewindJourney"
var testTarget: String {
return self + "Tests"
}
- var path: String {
+ var fromRootPath: String {
return "../../" + self
}
- var featurePath: String {
- return "../Features/" + self
- }
+}
+
+private enum Target {
+
+ static let rewindJourney = "RewindJourney"
+
+}
+
+private enum Dependency {
+
+ static let msUIKit = "MSUIKit"
+ static let msFoundation = "MSFoundation"
+ static let msDesignsystem = "MSDesignSystem"
+ static let msLogger = "MSLogger"
}
@@ -35,23 +42,24 @@ let package = Package(
.iOS(.v15)
],
products: [
- .library(
- name: .rewindJourneyView,
- targets: [.rewindJourneyView])
+ .library(name: Target.rewindJourney,
+ targets: [Target.rewindJourney])
],
dependencies: [
- .package(path: .msUIKit.path),
- .package(path: .msFoundation.path)
+ .package(name: Dependency.msUIKit,
+ path: Dependency.msUIKit.fromRootPath),
+ .package(name: Dependency.msFoundation,
+ path: Dependency.msFoundation.fromRootPath)
],
targets: [
- // Codes
- .target(
- name: .rewindJourneyView,
- dependencies: [
- .product(name: .msUIKit, package: .msUIKit),
- .product(name: .msDesignsystem, package: .msUIKit),
- .product(name: .msLogger, package: .msFoundation)])
-
- // Tests
+ .target(name: Target.rewindJourney,
+ dependencies: [
+ .product(name: Dependency.msUIKit,
+ package: Dependency.msUIKit),
+ .product(name: Dependency.msDesignsystem,
+ package: Dependency.msUIKit),
+ .product(name: Dependency.msLogger,
+ package: Dependency.msFoundation)
+ ])
]
)
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.pbxproj b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..fd6b2b8
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4DA62B173530002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DA52B173530002F0748 /* AppDelegate.swift */; };
+ DDAA4DA82B173530002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DA72B173530002F0748 /* SceneDelegate.swift */; };
+ DDAA4DAA2B173530002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DA92B173530002F0748 /* ViewController.swift */; };
+ DDAA4DAD2B173530002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DAB2B173530002F0748 /* Main.storyboard */; };
+ DDAA4DAF2B173532002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DAE2B173532002F0748 /* Assets.xcassets */; };
+ DDAA4DB22B173532002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DB02B173532002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4DBB2B173551002F0748 /* RewindJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4DBA2B173551002F0748 /* RewindJourney */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4DA22B173530002F0748 /* RewindJourneyDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RewindJourneyDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4DA52B173530002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4DA72B173530002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4DA92B173530002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4DAC2B173530002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4DAE2B173532002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4DB12B173532002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4DB32B173532002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4D9F2B173530002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DBB2B173551002F0748 /* RewindJourney in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4D992B173530002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DA42B173530002F0748 /* RewindJourneyDemo */,
+ DDAA4DA32B173530002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4DA32B173530002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DA22B173530002F0748 /* RewindJourneyDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4DA42B173530002F0748 /* RewindJourneyDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DA52B173530002F0748 /* AppDelegate.swift */,
+ DDAA4DA72B173530002F0748 /* SceneDelegate.swift */,
+ DDAA4DA92B173530002F0748 /* ViewController.swift */,
+ DDAA4DAB2B173530002F0748 /* Main.storyboard */,
+ DDAA4DAE2B173532002F0748 /* Assets.xcassets */,
+ DDAA4DB02B173532002F0748 /* LaunchScreen.storyboard */,
+ DDAA4DB32B173532002F0748 /* Info.plist */,
+ );
+ path = RewindJourneyDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4DA12B173530002F0748 /* RewindJourneyDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4DB62B173532002F0748 /* Build configuration list for PBXNativeTarget "RewindJourneyDemo" */;
+ buildPhases = (
+ DDAA4D9E2B173530002F0748 /* Sources */,
+ DDAA4D9F2B173530002F0748 /* Frameworks */,
+ DDAA4DA02B173530002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = RewindJourneyDemo;
+ packageProductDependencies = (
+ DDAA4DBA2B173551002F0748 /* RewindJourney */,
+ );
+ productName = RewindJourneyDemo;
+ productReference = DDAA4DA22B173530002F0748 /* RewindJourneyDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4D9A2B173530002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4DA12B173530002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4D9D2B173530002F0748 /* Build configuration list for PBXProject "RewindJourneyDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4D992B173530002F0748;
+ packageReferences = (
+ DDAA4DB92B173551002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4DA32B173530002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4DA12B173530002F0748 /* RewindJourneyDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4DA02B173530002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DB22B173532002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4DAF2B173532002F0748 /* Assets.xcassets in Resources */,
+ DDAA4DAD2B173530002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4D9E2B173530002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DAA2B173530002F0748 /* ViewController.swift in Sources */,
+ DDAA4DA62B173530002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4DA82B173530002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4DAB2B173530002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DAC2B173530002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4DB02B173532002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DB12B173532002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4DB42B173532002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DB52B173532002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DB72B173532002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = RewindJourneyDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.RewindJourneyDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4DB82B173532002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = RewindJourneyDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.RewindJourneyDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4D9D2B173530002F0748 /* Build configuration list for PBXProject "RewindJourneyDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DB42B173532002F0748 /* Debug */,
+ DDAA4DB52B173532002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4DB62B173532002F0748 /* Build configuration list for PBXNativeTarget "RewindJourneyDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DB72B173532002F0748 /* Debug */,
+ DDAA4DB82B173532002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4DB92B173551002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4DBA2B173551002F0748 /* RewindJourney */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = RewindJourney;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4D9A2B173530002F0748 /* Project object */;
+}
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/AppDelegate.swift b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/AppDelegate.swift
new file mode 100644
index 0000000..1248a15
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// RewindJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/Contents.json b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/Main.storyboard b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Info.plist b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/SceneDelegate.swift b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/SceneDelegate.swift
new file mode 100644
index 0000000..784866e
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// RewindJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/ViewController.swift b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/ViewController.swift
new file mode 100644
index 0000000..5626537
--- /dev/null
+++ b/iOS/Features/RewindJourney/RewindJourneyDemo/RewindJourneyDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// RewindJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/Features/RewindJourney/Sources/RewindJourney/RewindJourney.swift b/iOS/Features/RewindJourney/Sources/RewindJourney/RewindJourney.swift
new file mode 100644
index 0000000..08b22b8
--- /dev/null
+++ b/iOS/Features/RewindJourney/Sources/RewindJourney/RewindJourney.swift
@@ -0,0 +1,2 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
diff --git a/iOS/Features/SaveJourney/.gitignore b/iOS/Features/SaveJourney/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/Features/SaveJourney/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/Features/SaveJourney/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/SaveJourney/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/SaveJourney/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/SaveJourney/.swiftpm/xcode/xcshareddata/xcschemes/SaveJourney.xcscheme b/iOS/Features/SaveJourney/.swiftpm/xcode/xcshareddata/xcschemes/SaveJourney.xcscheme
new file mode 100644
index 0000000..3b465cc
--- /dev/null
+++ b/iOS/Features/SaveJourney/.swiftpm/xcode/xcshareddata/xcschemes/SaveJourney.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/SaveJourney/Package.swift b/iOS/Features/SaveJourney/Package.swift
new file mode 100644
index 0000000..f9dec09
--- /dev/null
+++ b/iOS/Features/SaveJourney/Package.swift
@@ -0,0 +1,59 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+// MARK: - Constants
+
+private extension String {
+
+ static let package = "FeatureSaveJourney"
+
+ var testTarget: String {
+ return self + "Tests"
+ }
+
+ var fromRootPath: String {
+ return "../../" + self
+ }
+
+}
+
+private enum Target {
+
+ static let saveJourney = "SaveJourney"
+
+}
+
+private enum Dependency {
+
+ static let msUIKit = "MSUIKit"
+ static let msFoundation = "MSFoundation"
+ static let msDesignsystem = "MSDesignSystem"
+ static let msLogger = "MSLogger"
+
+}
+
+// MARK: - Package
+
+let package = Package(
+ name: .package,
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: Target.saveJourney,
+ targets: [Target.saveJourney])
+ ],
+ dependencies: [
+ .package(name: Dependency.msUIKit,
+ path: Dependency.msUIKit.fromRootPath)
+ ],
+ targets: [
+ .target(name: Target.saveJourney,
+ dependencies: [
+ .product(name: Dependency.msUIKit,
+ package: Dependency.msUIKit)
+ ])
+ ]
+)
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.pbxproj b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..163320f
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4DC92B17356D002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DC82B17356D002F0748 /* AppDelegate.swift */; };
+ DDAA4DCB2B17356D002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DCA2B17356D002F0748 /* SceneDelegate.swift */; };
+ DDAA4DCD2B17356D002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DCC2B17356D002F0748 /* ViewController.swift */; };
+ DDAA4DD02B17356D002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DCE2B17356D002F0748 /* Main.storyboard */; };
+ DDAA4DD22B17356E002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DD12B17356E002F0748 /* Assets.xcassets */; };
+ DDAA4DD52B17356E002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DD32B17356E002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4DDE2B17357F002F0748 /* SaveJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4DDD2B17357F002F0748 /* SaveJourney */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4DC52B17356D002F0748 /* SaveJourneyDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SaveJourneyDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4DC82B17356D002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4DCA2B17356D002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4DCC2B17356D002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4DCF2B17356D002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4DD12B17356E002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4DD42B17356E002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4DD62B17356E002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4DC22B17356D002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DDE2B17357F002F0748 /* SaveJourney in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4DBC2B17356D002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DC72B17356D002F0748 /* SaveJourneyDemo */,
+ DDAA4DC62B17356D002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4DC62B17356D002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DC52B17356D002F0748 /* SaveJourneyDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4DC72B17356D002F0748 /* SaveJourneyDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DC82B17356D002F0748 /* AppDelegate.swift */,
+ DDAA4DCA2B17356D002F0748 /* SceneDelegate.swift */,
+ DDAA4DCC2B17356D002F0748 /* ViewController.swift */,
+ DDAA4DCE2B17356D002F0748 /* Main.storyboard */,
+ DDAA4DD12B17356E002F0748 /* Assets.xcassets */,
+ DDAA4DD32B17356E002F0748 /* LaunchScreen.storyboard */,
+ DDAA4DD62B17356E002F0748 /* Info.plist */,
+ );
+ path = SaveJourneyDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4DC42B17356D002F0748 /* SaveJourneyDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4DD92B17356E002F0748 /* Build configuration list for PBXNativeTarget "SaveJourneyDemo" */;
+ buildPhases = (
+ DDAA4DC12B17356D002F0748 /* Sources */,
+ DDAA4DC22B17356D002F0748 /* Frameworks */,
+ DDAA4DC32B17356D002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SaveJourneyDemo;
+ packageProductDependencies = (
+ DDAA4DDD2B17357F002F0748 /* SaveJourney */,
+ );
+ productName = SaveJourneyDemo;
+ productReference = DDAA4DC52B17356D002F0748 /* SaveJourneyDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4DBD2B17356D002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4DC42B17356D002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4DC02B17356D002F0748 /* Build configuration list for PBXProject "SaveJourneyDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4DBC2B17356D002F0748;
+ packageReferences = (
+ DDAA4DDC2B17357F002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4DC62B17356D002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4DC42B17356D002F0748 /* SaveJourneyDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4DC32B17356D002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DD52B17356E002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4DD22B17356E002F0748 /* Assets.xcassets in Resources */,
+ DDAA4DD02B17356D002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4DC12B17356D002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DCD2B17356D002F0748 /* ViewController.swift in Sources */,
+ DDAA4DC92B17356D002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4DCB2B17356D002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4DCE2B17356D002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DCF2B17356D002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4DD32B17356E002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DD42B17356E002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4DD72B17356E002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DD82B17356E002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DDA2B17356E002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SaveJourneyDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SaveJourneyDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4DDB2B17356E002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SaveJourneyDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SaveJourneyDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4DC02B17356D002F0748 /* Build configuration list for PBXProject "SaveJourneyDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DD72B17356E002F0748 /* Debug */,
+ DDAA4DD82B17356E002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4DD92B17356E002F0748 /* Build configuration list for PBXNativeTarget "SaveJourneyDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DDA2B17356E002F0748 /* Debug */,
+ DDAA4DDB2B17356E002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4DDC2B17357F002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4DDD2B17357F002F0748 /* SaveJourney */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = SaveJourney;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4DBD2B17356D002F0748 /* Project object */;
+}
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/AppDelegate.swift b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/AppDelegate.swift
new file mode 100644
index 0000000..3332466
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// SaveJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/Contents.json b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/Main.storyboard b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Info.plist b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/SceneDelegate.swift b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/SceneDelegate.swift
new file mode 100644
index 0000000..defe329
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// SaveJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/ViewController.swift b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/ViewController.swift
new file mode 100644
index 0000000..aa71b3c
--- /dev/null
+++ b/iOS/Features/SaveJourney/SaveJourneyDemo/SaveJourneyDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// SaveJourneyDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/Features/SaveJourney/Sources/SaveJourney/SaveJourney.swift b/iOS/Features/SaveJourney/Sources/SaveJourney/SaveJourney.swift
new file mode 100644
index 0000000..08b22b8
--- /dev/null
+++ b/iOS/Features/SaveJourney/Sources/SaveJourney/SaveJourney.swift
@@ -0,0 +1,2 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
diff --git a/iOS/Features/SelectSong/.gitignore b/iOS/Features/SelectSong/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/Features/SelectSong/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/Features/SelectSong/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/SelectSong/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/SelectSong/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/SelectSong/Package.swift b/iOS/Features/SelectSong/Package.swift
new file mode 100644
index 0000000..910e61f
--- /dev/null
+++ b/iOS/Features/SelectSong/Package.swift
@@ -0,0 +1,51 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+// MARK: - Constants
+
+private extension String {
+
+ static let package = "FeatureSelectSong"
+
+ var testTarget: String {
+ return self + "Tests"
+ }
+
+ var fromRootPath: String {
+ return "../../" + self
+ }
+
+}
+
+private enum Target {
+
+ static let selectSong = "SelectSong"
+
+}
+
+private enum Dependency {
+
+ static let msUIKit = "MSUIKit"
+ static let msFoundation = "MSFoundation"
+ static let msDesignsystem = "MSDesignSystem"
+ static let msLogger = "MSLogger"
+
+}
+
+// MARK: - Package
+
+let package = Package(
+ name: .package,
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: Target.selectSong,
+ targets: [Target.selectSong])
+ ],
+ targets: [
+ .target(name:Target.selectSong)
+ ]
+)
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.pbxproj b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..1c39d31
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4DEC2B17359E002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DEB2B17359E002F0748 /* AppDelegate.swift */; };
+ DDAA4DEE2B17359E002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DED2B17359E002F0748 /* SceneDelegate.swift */; };
+ DDAA4DF02B17359E002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4DEF2B17359E002F0748 /* ViewController.swift */; };
+ DDAA4DF32B17359E002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DF12B17359E002F0748 /* Main.storyboard */; };
+ DDAA4DF52B1735A0002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DF42B1735A0002F0748 /* Assets.xcassets */; };
+ DDAA4DF82B1735A0002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4DF62B1735A0002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4E012B1735B6002F0748 /* SelectSong in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4E002B1735B6002F0748 /* SelectSong */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4DE82B17359E002F0748 /* SelectSongDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SelectSongDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4DEB2B17359E002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4DED2B17359E002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4DEF2B17359E002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4DF22B17359E002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4DF42B1735A0002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4DF72B1735A0002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4DF92B1735A0002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4DE52B17359E002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4E012B1735B6002F0748 /* SelectSong in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4DDF2B17359E002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DEA2B17359E002F0748 /* SelectSongDemo */,
+ DDAA4DE92B17359E002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4DE92B17359E002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DE82B17359E002F0748 /* SelectSongDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4DEA2B17359E002F0748 /* SelectSongDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4DEB2B17359E002F0748 /* AppDelegate.swift */,
+ DDAA4DED2B17359E002F0748 /* SceneDelegate.swift */,
+ DDAA4DEF2B17359E002F0748 /* ViewController.swift */,
+ DDAA4DF12B17359E002F0748 /* Main.storyboard */,
+ DDAA4DF42B1735A0002F0748 /* Assets.xcassets */,
+ DDAA4DF62B1735A0002F0748 /* LaunchScreen.storyboard */,
+ DDAA4DF92B1735A0002F0748 /* Info.plist */,
+ );
+ path = SelectSongDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4DE72B17359E002F0748 /* SelectSongDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4DFC2B1735A0002F0748 /* Build configuration list for PBXNativeTarget "SelectSongDemo" */;
+ buildPhases = (
+ DDAA4DE42B17359E002F0748 /* Sources */,
+ DDAA4DE52B17359E002F0748 /* Frameworks */,
+ DDAA4DE62B17359E002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SelectSongDemo;
+ packageProductDependencies = (
+ DDAA4E002B1735B6002F0748 /* SelectSong */,
+ );
+ productName = SelectSongDemo;
+ productReference = DDAA4DE82B17359E002F0748 /* SelectSongDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4DE02B17359E002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4DE72B17359E002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4DE32B17359E002F0748 /* Build configuration list for PBXProject "SelectSongDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4DDF2B17359E002F0748;
+ packageReferences = (
+ DDAA4DFF2B1735B6002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4DE92B17359E002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4DE72B17359E002F0748 /* SelectSongDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4DE62B17359E002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DF82B1735A0002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4DF52B1735A0002F0748 /* Assets.xcassets in Resources */,
+ DDAA4DF32B17359E002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4DE42B17359E002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4DF02B17359E002F0748 /* ViewController.swift in Sources */,
+ DDAA4DEC2B17359E002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4DEE2B17359E002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4DF12B17359E002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DF22B17359E002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4DF62B1735A0002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4DF72B1735A0002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4DFA2B1735A0002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DFB2B1735A0002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4DFD2B1735A0002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SelectSongDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SelectSongDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4DFE2B1735A0002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SelectSongDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SelectSongDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4DE32B17359E002F0748 /* Build configuration list for PBXProject "SelectSongDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DFA2B1735A0002F0748 /* Debug */,
+ DDAA4DFB2B1735A0002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4DFC2B1735A0002F0748 /* Build configuration list for PBXNativeTarget "SelectSongDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4DFD2B1735A0002F0748 /* Debug */,
+ DDAA4DFE2B1735A0002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4DFF2B1735B6002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4E002B1735B6002F0748 /* SelectSong */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = SelectSong;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4DE02B17359E002F0748 /* Project object */;
+}
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/AppDelegate.swift b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/AppDelegate.swift
new file mode 100644
index 0000000..125bc24
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// SelectSongDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/Contents.json b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/Main.storyboard b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Info.plist b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/SceneDelegate.swift b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/SceneDelegate.swift
new file mode 100644
index 0000000..4ad36dd
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// SelectSongDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/ViewController.swift b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/ViewController.swift
new file mode 100644
index 0000000..7d1b05b
--- /dev/null
+++ b/iOS/Features/SelectSong/SelectSongDemo/SelectSongDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// SelectSongDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/Features/SelectSong/Sources/SelectSong/SelectSong.swift b/iOS/Features/SelectSong/Sources/SelectSong/SelectSong.swift
new file mode 100644
index 0000000..08b22b8
--- /dev/null
+++ b/iOS/Features/SelectSong/Sources/SelectSong/SelectSong.swift
@@ -0,0 +1,2 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
diff --git a/iOS/Features/Spot/.gitignore b/iOS/Features/Spot/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/Features/Spot/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/Features/Spot/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/Spot/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/Spot/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/Spot/.swiftpm/xcode/xcshareddata/xcschemes/Spot.xcscheme b/iOS/Features/Spot/.swiftpm/xcode/xcshareddata/xcschemes/Spot.xcscheme
new file mode 100644
index 0000000..bfdca86
--- /dev/null
+++ b/iOS/Features/Spot/.swiftpm/xcode/xcshareddata/xcschemes/Spot.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Spot/Package.swift b/iOS/Features/Spot/Package.swift
new file mode 100644
index 0000000..0bc07b7
--- /dev/null
+++ b/iOS/Features/Spot/Package.swift
@@ -0,0 +1,65 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+// MARK: - Constants
+
+private extension String {
+
+ static let package = "FeatureSpot"
+
+ var testTarget: String {
+ return self + "Tests"
+ }
+
+ var fromRootPath: String {
+ return "../../" + self
+ }
+
+}
+
+private enum Target {
+
+ static let spot = "Spot"
+
+}
+
+private enum Dependency {
+
+ static let msUIKit = "MSUIKit"
+ static let msFoundation = "MSFoundation"
+ static let msDesignsystem = "MSDesignSystem"
+ static let msLogger = "MSLogger"
+
+}
+
+// MARK: - Package
+
+let package = Package(
+ name: .package,
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: Target.spot,
+ targets: [Target.spot])
+ ],
+ dependencies: [
+ .package(name: Dependency.msUIKit,
+ path: Dependency.msUIKit.fromRootPath),
+ .package(name: Dependency.msFoundation,
+ path: Dependency.msFoundation.fromRootPath)
+ ],
+ targets: [
+ .target(name: Target.spot,
+ dependencies: [
+ .product(name: Dependency.msUIKit,
+ package: Dependency.msUIKit),
+ .product(name: Dependency.msDesignsystem,
+ package: Dependency.msUIKit),
+ .product(name: Dependency.msLogger,
+ package: Dependency.msFoundation)
+ ])
+ ]
+)
diff --git a/iOS/Features/Spot/Sources/Spot/Spot.swift b/iOS/Features/Spot/Sources/Spot/Spot.swift
new file mode 100644
index 0000000..08b22b8
--- /dev/null
+++ b/iOS/Features/Spot/Sources/Spot/Spot.swift
@@ -0,0 +1,2 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.pbxproj b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..d7a2250
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DDAA4E0F2B1735CF002F0748 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4E0E2B1735CF002F0748 /* AppDelegate.swift */; };
+ DDAA4E112B1735CF002F0748 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4E102B1735CF002F0748 /* SceneDelegate.swift */; };
+ DDAA4E132B1735CF002F0748 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA4E122B1735CF002F0748 /* ViewController.swift */; };
+ DDAA4E162B1735CF002F0748 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4E142B1735CF002F0748 /* Main.storyboard */; };
+ DDAA4E182B1735D0002F0748 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4E172B1735D0002F0748 /* Assets.xcassets */; };
+ DDAA4E1B2B1735D0002F0748 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAA4E192B1735D0002F0748 /* LaunchScreen.storyboard */; };
+ DDAA4E242B1735E4002F0748 /* Spot in Frameworks */ = {isa = PBXBuildFile; productRef = DDAA4E232B1735E4002F0748 /* Spot */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DDAA4E0B2B1735CF002F0748 /* SpotDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpotDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DDAA4E0E2B1735CF002F0748 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DDAA4E102B1735CF002F0748 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DDAA4E122B1735CF002F0748 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ DDAA4E152B1735CF002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ DDAA4E172B1735D0002F0748 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DDAA4E1A2B1735D0002F0748 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DDAA4E1C2B1735D0002F0748 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DDAA4E082B1735CF002F0748 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4E242B1735E4002F0748 /* Spot in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DDAA4E022B1735CF002F0748 = {
+ isa = PBXGroup;
+ children = (
+ DDAA4E0D2B1735CF002F0748 /* SpotDemo */,
+ DDAA4E0C2B1735CF002F0748 /* Products */,
+ );
+ sourceTree = "";
+ };
+ DDAA4E0C2B1735CF002F0748 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4E0B2B1735CF002F0748 /* SpotDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DDAA4E0D2B1735CF002F0748 /* SpotDemo */ = {
+ isa = PBXGroup;
+ children = (
+ DDAA4E0E2B1735CF002F0748 /* AppDelegate.swift */,
+ DDAA4E102B1735CF002F0748 /* SceneDelegate.swift */,
+ DDAA4E122B1735CF002F0748 /* ViewController.swift */,
+ DDAA4E142B1735CF002F0748 /* Main.storyboard */,
+ DDAA4E172B1735D0002F0748 /* Assets.xcassets */,
+ DDAA4E192B1735D0002F0748 /* LaunchScreen.storyboard */,
+ DDAA4E1C2B1735D0002F0748 /* Info.plist */,
+ );
+ path = SpotDemo;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DDAA4E0A2B1735CF002F0748 /* SpotDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DDAA4E1F2B1735D0002F0748 /* Build configuration list for PBXNativeTarget "SpotDemo" */;
+ buildPhases = (
+ DDAA4E072B1735CF002F0748 /* Sources */,
+ DDAA4E082B1735CF002F0748 /* Frameworks */,
+ DDAA4E092B1735CF002F0748 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SpotDemo;
+ packageProductDependencies = (
+ DDAA4E232B1735E4002F0748 /* Spot */,
+ );
+ productName = SpotDemo;
+ productReference = DDAA4E0B2B1735CF002F0748 /* SpotDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DDAA4E032B1735CF002F0748 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DDAA4E0A2B1735CF002F0748 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DDAA4E062B1735CF002F0748 /* Build configuration list for PBXProject "SpotDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = DDAA4E022B1735CF002F0748;
+ packageReferences = (
+ DDAA4E222B1735E4002F0748 /* XCLocalSwiftPackageReference ".." */,
+ );
+ productRefGroup = DDAA4E0C2B1735CF002F0748 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DDAA4E0A2B1735CF002F0748 /* SpotDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DDAA4E092B1735CF002F0748 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4E1B2B1735D0002F0748 /* LaunchScreen.storyboard in Resources */,
+ DDAA4E182B1735D0002F0748 /* Assets.xcassets in Resources */,
+ DDAA4E162B1735CF002F0748 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DDAA4E072B1735CF002F0748 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DDAA4E132B1735CF002F0748 /* ViewController.swift in Sources */,
+ DDAA4E0F2B1735CF002F0748 /* AppDelegate.swift in Sources */,
+ DDAA4E112B1735CF002F0748 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DDAA4E142B1735CF002F0748 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4E152B1735CF002F0748 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ DDAA4E192B1735D0002F0748 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DDAA4E1A2B1735D0002F0748 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DDAA4E1D2B1735D0002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4E1E2B1735D0002F0748 /* 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 = YES;
+ 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 = 15.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;
+ };
+ DDAA4E202B1735D0002F0748 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SpotDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SpotDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DDAA4E212B1735D0002F0748 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SpotDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.SpotDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DDAA4E062B1735CF002F0748 /* Build configuration list for PBXProject "SpotDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4E1D2B1735D0002F0748 /* Debug */,
+ DDAA4E1E2B1735D0002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DDAA4E1F2B1735D0002F0748 /* Build configuration list for PBXNativeTarget "SpotDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DDAA4E202B1735D0002F0748 /* Debug */,
+ DDAA4E212B1735D0002F0748 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ DDAA4E222B1735E4002F0748 /* XCLocalSwiftPackageReference ".." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ DDAA4E232B1735E4002F0748 /* Spot */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = Spot;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = DDAA4E032B1735CF002F0748 /* Project object */;
+}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift
new file mode 100644
index 0000000..b2afe12
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift
@@ -0,0 +1,36 @@
+//
+// AppDelegate.swift
+// SpotDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+
+
+}
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..25a7638
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist b/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift
new file mode 100644
index 0000000..0a7c806
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift
@@ -0,0 +1,52 @@
+//
+// SceneDelegate.swift
+// SpotDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ 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.
+ }
+
+
+}
+
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift
new file mode 100644
index 0000000..2edaf0c
--- /dev/null
+++ b/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift
@@ -0,0 +1,19 @@
+//
+// ViewController.swift
+// SpotDemo
+//
+// Created by 이창준 on 2023.11.29.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSCacheStorage.xcscheme b/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSCacheStorage.xcscheme
index 1113d29..a20692e 100644
--- a/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSCacheStorage.xcscheme
+++ b/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSCacheStorage.xcscheme
@@ -28,6 +28,18 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Value?
- func cleanDisk() throws
-}
-
-public final class MSCacheStorage: KeyValueStorage {
-
- public typealias Key = NSString
- public typealias Cache = NSCache
-
- // MARK: - Properties
-
- private let memory: Cache
- private let disk: FileManager
-
- // MARK: - Initializer
-
- public init(cache: Cache = Cache(),
- fileManager: FileManager = .default) {
- self.memory = cache
- self.disk = fileManager
- }
-
- // MARK: - Functions
-
- /// 캐싱된 데이터를 불러옵니다.
- public func data(forKey key: String, etag: String? = nil) async -> MSCacheableData? {
- // Memory Cache
- if let memoryData = memory.object(forKey: key as NSString) { // memory hit
- // TODO: 서버와 데이터 검증 필요 (etag 활용)
- return memoryData
- }
-
- // Disk Cache
- if let cacheURL = cacheURL(forCache: "\(key).cache"),
- let diskData = disk.contents(atPath: cacheURL.path) { // disk hit
- // TODO: 서버와 데이터 검증 필요 (etag 활용)
- let decoder = JSONDecoder()
- return try? decoder.decode(MSCacheableData.self, from: diskData)
- }
-
- // Request
- // TODO: 서버로부터 데이터 수신 및 캐싱 + return 값 변경
- return nil
- }
-
- public func cleanDisk() throws {
- if let path = cacheDirectoryURL?.path {
- try disk.removeItem(atPath: path)
- }
- }
-
-}
-
-// MARK: - URLs
-
-private extension MSCacheStorage {
-
- var cacheDirectoryURL: URL? {
- if #available(iOS 16.0, *) {
- return try? disk.url(for: .cachesDirectory,
- in: .userDomainMask,
- appropriateFor: .cachesDirectory,
- create: true)
- } else {
- return disk
- .urls(for: .cachesDirectory, in: .userDomainMask)
- .first
- }
- }
-
- func cacheURL(forCache cache: String) -> URL? {
- if #available(iOS 16.0, *) {
- return cacheDirectoryURL?
- .appending(path: "MusicSpot", directoryHint: .isDirectory)
- .appending(component: cache, directoryHint: .notDirectory)
- } else {
- return cacheDirectoryURL?
- .appendingPathExtension("MusicSpot")
- .appendingPathComponent(cache)
- }
- }
-
-}
diff --git a/iOS/MSCoreKit/Sources/MSCacheStorage/MSCacheableData.swift b/iOS/MSCoreKit/Sources/MSCacheStorage/MSCacheableData.swift
deleted file mode 100644
index 4bdf3c8..0000000
--- a/iOS/MSCoreKit/Sources/MSCacheStorage/MSCacheableData.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// MSCacheableData.swift
-// MSCoreKit
-//
-// Created by 이창준 on 11/15/23.
-//
-
-import Foundation
-
-public final class MSCacheableData: Codable {
-
- struct Metadata: Hashable, Codable {
- let etag: String
- let lastUsed: Date
- }
-
- // MARK: - Properties
-
- let data: Data
- let metadata: Metadata
-
- // MARK: - Initializer
-
- public init(data: Data, etag: String) {
- self.data = data
- self.metadata = Metadata(etag: etag, lastUsed: .now)
- }
-
-}
diff --git a/iOS/MSCoreKit/Sources/MSCacheStorage/MSImageCacheStorage.swift b/iOS/MSCoreKit/Sources/MSCacheStorage/MSImageCacheStorage.swift
new file mode 100644
index 0000000..af47f8e
--- /dev/null
+++ b/iOS/MSCoreKit/Sources/MSCacheStorage/MSImageCacheStorage.swift
@@ -0,0 +1,84 @@
+//
+// MSImageCacheStorage.swift
+// MSCoreKit
+//
+// Created by 이창준 on 11/14/23.
+//
+
+import Foundation
+
+public final class MSImageCacheStorage: CacheStorage {
+
+ public typealias Cache = NSCache
+
+ // MARK: - Properties
+
+ private let memory: Cache
+ private let disk: FileManager
+
+ private let decoder = JSONDecoder()
+
+ // MARK: - Initializer
+
+ public init(cache: Cache = Cache(),
+ fileManager: FileManager = .default) {
+ self.memory = cache
+ self.disk = fileManager
+ }
+
+ // MARK: - Functions
+
+ /// 캐싱된 데이터를 불러옵니다.
+ public func data(forKey key: NSString) async -> NSData? {
+ // Memory Cache
+ if let memoryData = self.memory.object(forKey: key as NSString) { // memory hit
+ return memoryData
+ }
+
+ // Disk Cache
+ if let cacheURL = self.cacheURL(forCache: "\(key).cache"),
+ let diskData = self.disk.contents(atPath: cacheURL.path) { // disk hit
+
+ }
+
+ return nil
+ }
+
+ public func cleanDisk() throws {
+ if let path = self.cacheDirectoryURL?.path {
+ try self.disk.removeItem(atPath: path)
+ }
+ }
+
+}
+
+// MARK: - URLs
+
+private extension MSImageCacheStorage {
+
+ var cacheDirectoryURL: URL? {
+ if #available(iOS 16.0, *) {
+ return try? self.disk.url(for: .cachesDirectory,
+ in: .userDomainMask,
+ appropriateFor: .cachesDirectory,
+ create: true)
+ } else {
+ return self.disk
+ .urls(for: .cachesDirectory, in: .userDomainMask)
+ .first
+ }
+ }
+
+ func cacheURL(forCache cache: String) -> URL? {
+ if #available(iOS 16.0, *) {
+ return self.cacheDirectoryURL?
+ .appending(path: "MusicSpot", directoryHint: .isDirectory)
+ .appending(component: cache, directoryHint: .notDirectory)
+ } else {
+ return self.cacheDirectoryURL?
+ .appendingPathExtension("MusicSpot")
+ .appendingPathComponent(cache)
+ }
+ }
+
+}
diff --git a/iOS/MSCoreKit/Sources/MSCacheStorage/Protocol/CacheStorage.swift b/iOS/MSCoreKit/Sources/MSCacheStorage/Protocol/CacheStorage.swift
new file mode 100644
index 0000000..0cf1970
--- /dev/null
+++ b/iOS/MSCoreKit/Sources/MSCacheStorage/Protocol/CacheStorage.swift
@@ -0,0 +1,22 @@
+//
+// CacheStorage.swift
+// MSCoreKit
+//
+// Created by 이창준 on 2023.11.28.
+//
+
+import Foundation
+
+public protocol CacheStorage {
+
+ associatedtype Key: AnyObject = NSString
+ associatedtype Value: AnyObject
+
+ typealias Cache = NSCache
+
+ // MARK: - Functions
+
+ func data(forKey key: Key) async -> Value?
+ func cleanDisk() throws
+
+}
diff --git a/iOS/MSData/.gitignore b/iOS/MSData/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/iOS/MSData/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/iOS/MSData/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/MSData/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/MSData/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSData.xcscheme b/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSData.xcscheme
new file mode 100644
index 0000000..fdac714
--- /dev/null
+++ b/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSData.xcscheme
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSDataTests.xcscheme b/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSDataTests.xcscheme
new file mode 100644
index 0000000..c0fb639
--- /dev/null
+++ b/iOS/MSData/.swiftpm/xcode/xcshareddata/xcschemes/MSDataTests.xcscheme
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/MSData/Package.swift b/iOS/MSData/Package.swift
new file mode 100644
index 0000000..bffa772
--- /dev/null
+++ b/iOS/MSData/Package.swift
@@ -0,0 +1,25 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+import PackageDescription
+
+let package = Package(
+ name: "MSData",
+ platforms: [
+ .iOS(.v15)
+ ],
+ products: [
+ .library(name: "MSData",
+ targets: ["MSData"])
+ ],
+ dependencies: [
+ .package(name: "MSNetworking",
+ path: "../MSCoreKit")
+ ],
+ targets: [
+ .target(name: "MSData",
+ dependencies: ["MSNetworking"],
+ resources: [.process("Resources")]),
+ .testTarget(name: "MSDataTests",
+ dependencies: ["MSData"])
+ ]
+)
diff --git a/iOS/MSData/Sources/MSData/MSData.swift b/iOS/MSData/Sources/MSData/MSData.swift
new file mode 100644
index 0000000..08b22b8
--- /dev/null
+++ b/iOS/MSData/Sources/MSData/MSData.swift
@@ -0,0 +1,2 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
diff --git a/iOS/MSData/Tests/MSDataTests/MSDataTests.swift b/iOS/MSData/Tests/MSDataTests/MSDataTests.swift
new file mode 100644
index 0000000..18cf9e1
--- /dev/null
+++ b/iOS/MSData/Tests/MSDataTests/MSDataTests.swift
@@ -0,0 +1,12 @@
+import XCTest
+@testable import MSData
+
+final class MSDataTests: XCTestCase {
+ func testExample() throws {
+ // XCTest Documentation
+ // https://developer.apple.com/documentation/xctest
+
+ // Defining Test Cases and Test Methods
+ // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
+ }
+}
diff --git a/iOS/MSFoundation/.swiftpm/xcode/xcshareddata/xcschemes/MSLogger.xcscheme b/iOS/MSFoundation/.swiftpm/xcode/xcshareddata/xcschemes/MSLogger.xcscheme
index c44d62d..04b9652 100644
--- a/iOS/MSFoundation/.swiftpm/xcode/xcshareddata/xcschemes/MSLogger.xcscheme
+++ b/iOS/MSFoundation/.swiftpm/xcode/xcshareddata/xcschemes/MSLogger.xcscheme
@@ -28,6 +28,18 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/MSUIKit/.swiftpm/xcode/xcshareddata/xcschemes/MSDesignSystem.xcscheme b/iOS/MSUIKit/.swiftpm/xcode/xcshareddata/xcschemes/MSDesignSystem.xcscheme
new file mode 100644
index 0000000..e15b2aa
--- /dev/null
+++ b/iOS/MSUIKit/.swiftpm/xcode/xcshareddata/xcschemes/MSDesignSystem.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/MSUIKit/Package.swift b/iOS/MSUIKit/Package.swift
index 0e5acca..f100a0e 100644
--- a/iOS/MSUIKit/Package.swift
+++ b/iOS/MSUIKit/Package.swift
@@ -36,11 +36,7 @@ let package = Package(
.process("../MSDesignSystem/Resources")
]),
.target(name: .uiKit,
- dependencies: ["MSDesignSystem"]),
-
- // Tests
- .testTarget(name: .designSystem.testTarget,
- dependencies: ["MSDesignSystem"])
+ dependencies: ["MSDesignSystem"])
],
swiftLanguageVersions: [.v5]
)
diff --git a/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Calender.pdf b/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calendar.imageset/Calender.pdf
similarity index 100%
rename from iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Calender.pdf
rename to iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calendar.imageset/Calender.pdf
diff --git a/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Contents.json b/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calendar.imageset/Contents.json
similarity index 100%
rename from iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Contents.json
rename to iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calendar.imageset/Contents.json
diff --git a/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Calender 1.pdf b/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Calender 1.pdf
deleted file mode 100644
index 8830486..0000000
Binary files a/iOS/MSUIKit/Sources/MSDesignSystem/Resources/MSIcon.xcassets/Calender.imageset/Calender 1.pdf and /dev/null differ
diff --git a/iOS/MSUIKit/Tests/MSDesignSystemTests/MSDesignSystemTests.swift b/iOS/MSUIKit/Tests/MSDesignSystemTests/MSDesignSystemTests.swift
deleted file mode 100644
index 7eebb79..0000000
--- a/iOS/MSUIKit/Tests/MSDesignSystemTests/MSDesignSystemTests.swift
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// MSDesignSystemTests.swift
-// MSUIKit
-//
-// Created by 이창준 on 11/26/23.
-//
-
-import XCTest
-
-final class MSDesignSystemTests: XCTestCase { }
diff --git a/iOS/MusicSpot.xcworkspace/contents.xcworkspacedata b/iOS/MusicSpot.xcworkspace/contents.xcworkspacedata
index 8cad135..17b1b2b 100644
--- a/iOS/MusicSpot.xcworkspace/contents.xcworkspacedata
+++ b/iOS/MusicSpot.xcworkspace/contents.xcworkspacedata
@@ -2,21 +2,40 @@
+ location = "group:MusicSpot/MusicSpot.xcodeproj">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ location = "group:MSData">
+ location = "group:MSUIKit">
-
-
+ location = "group:MusicSpot/../MSFoundation">
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
index 2a1c470..650685c 100644
--- a/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
@@ -7,10 +7,13 @@
objects = {
/* Begin PBXBuildFile section */
- 21B1B63D2B04C7CF00A63287 /* FoundationExt in Frameworks */ = {isa = PBXBuildFile; productRef = 21B1B63C2B04C7CF00A63287 /* FoundationExt */; };
- 21B1B63F2B04C7CF00A63287 /* MSLogger in Frameworks */ = {isa = PBXBuildFile; productRef = 21B1B63E2B04C7CF00A63287 /* MSLogger */; };
- 21B1B6412B04C7CF00A63287 /* MSUserDefaults in Frameworks */ = {isa = PBXBuildFile; productRef = 21B1B6402B04C7CF00A63287 /* MSUserDefaults */; };
- 21B1B6442B04D64A00A63287 /* MSNetwork in Frameworks */ = {isa = PBXBuildFile; productRef = 21B1B6432B04D64A00A63287 /* MSNetwork */; };
+ DD5EA2552B16EC920080AEC1 /* JourneyList in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA2542B16EC920080AEC1 /* JourneyList */; };
+ DD5EA2572B16EC960080AEC1 /* NavigateMap in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA2562B16EC960080AEC1 /* NavigateMap */; };
+ DD5EA2592B16EC9B0080AEC1 /* RecordJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA2582B16EC9B0080AEC1 /* RecordJourney */; };
+ DD5EA25B2B16ECA10080AEC1 /* SaveJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA25A2B16ECA10080AEC1 /* SaveJourney */; };
+ DD5EA25D2B16ECA60080AEC1 /* SelectSong in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA25C2B16ECA60080AEC1 /* SelectSong */; };
+ DD5EA25F2B16ECAB0080AEC1 /* Spot in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA25E2B16ECAB0080AEC1 /* Spot */; };
+ DD5EA2612B16ECAF0080AEC1 /* RewindJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD5EA2602B16ECAF0080AEC1 /* RewindJourney */; };
DD73F8592B024C4900EE9BF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F8582B024C4900EE9BF2 /* AppDelegate.swift */; };
DD73F85B2B024C4900EE9BF2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F85A2B024C4900EE9BF2 /* SceneDelegate.swift */; };
DD73F8622B024C4B00EE9BF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DD73F8612B024C4B00EE9BF2 /* Assets.xcassets */; };
@@ -32,17 +35,20 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 21B1B63F2B04C7CF00A63287 /* MSLogger in Frameworks */,
- 21B1B6412B04C7CF00A63287 /* MSUserDefaults in Frameworks */,
- 21B1B63D2B04C7CF00A63287 /* FoundationExt in Frameworks */,
- 21B1B6442B04D64A00A63287 /* MSNetwork in Frameworks */,
+ DD5EA2572B16EC960080AEC1 /* NavigateMap in Frameworks */,
+ DD5EA25D2B16ECA60080AEC1 /* SelectSong in Frameworks */,
+ DD5EA2552B16EC920080AEC1 /* JourneyList in Frameworks */,
+ DD5EA2612B16ECAF0080AEC1 /* RewindJourney in Frameworks */,
+ DD5EA25B2B16ECA10080AEC1 /* SaveJourney in Frameworks */,
+ DD5EA25F2B16ECAB0080AEC1 /* Spot in Frameworks */,
+ DD5EA2592B16EC9B0080AEC1 /* RecordJourney in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 2137DBFD2B063A1500395C06 /* Frameworks */ = {
+ DD5EA23F2B16EC690080AEC1 /* Frameworks */ = {
isa = PBXGroup;
children = (
);
@@ -54,6 +60,7 @@
children = (
DD73F8572B024C4900EE9BF2 /* MusicSpot */,
DD73F8562B024C4900EE9BF2 /* Products */,
+ DD5EA23F2B16EC690080AEC1 /* Frameworks */,
);
sourceTree = "";
};
@@ -94,10 +101,13 @@
);
name = MusicSpot;
packageProductDependencies = (
- 21B1B63C2B04C7CF00A63287 /* FoundationExt */,
- 21B1B63E2B04C7CF00A63287 /* MSLogger */,
- 21B1B6402B04C7CF00A63287 /* MSUserDefaults */,
- 21B1B6432B04D64A00A63287 /* MSNetwork */,
+ DD5EA2542B16EC920080AEC1 /* JourneyList */,
+ DD5EA2562B16EC960080AEC1 /* NavigateMap */,
+ DD5EA2582B16EC9B0080AEC1 /* RecordJourney */,
+ DD5EA25A2B16ECA10080AEC1 /* SaveJourney */,
+ DD5EA25C2B16ECA60080AEC1 /* SelectSong */,
+ DD5EA25E2B16ECAB0080AEC1 /* Spot */,
+ DD5EA2602B16ECAF0080AEC1 /* RewindJourney */,
);
productName = MusicSpot;
productReference = DD73F8552B024C4900EE9BF2 /* MusicSpot.app */;
@@ -128,8 +138,12 @@
);
mainGroup = DD73F84C2B024C4900EE9BF2;
packageReferences = (
- 21B1B63B2B04C7CF00A63287 /* XCLocalSwiftPackageReference "../MSFoundation" */,
- 21B1B6422B04D64A00A63287 /* XCLocalSwiftPackageReference "../MSNetwork" */,
+ DD734C432B16EAFC00944E71 /* XCLocalSwiftPackageReference "../Features/JourneyList" */,
+ DD734C462B16EB0700944E71 /* XCLocalSwiftPackageReference "../Features/Home" */,
+ DD734C4E2B16EB2D00944E71 /* XCLocalSwiftPackageReference "../Features/SaveJourney" */,
+ DD734C512B16EB3400944E71 /* XCLocalSwiftPackageReference "../Features/SelectSong" */,
+ DD734C572B16EB5500944E71 /* XCLocalSwiftPackageReference "../Features/Spot" */,
+ DD734C5A2B16EBB800944E71 /* XCLocalSwiftPackageReference "../Features/RewindJourney" */,
);
productRefGroup = DD73F8562B024C4900EE9BF2 /* Products */;
projectDirPath = "";
@@ -388,32 +402,67 @@
/* End XCConfigurationList section */
/* Begin XCLocalSwiftPackageReference section */
- 21B1B63B2B04C7CF00A63287 /* XCLocalSwiftPackageReference "../MSFoundation" */ = {
+ DD734C432B16EAFC00944E71 /* XCLocalSwiftPackageReference "../Features/JourneyList" */ = {
isa = XCLocalSwiftPackageReference;
- relativePath = ../MSFoundation;
+ relativePath = ../Features/JourneyList;
};
- 21B1B6422B04D64A00A63287 /* XCLocalSwiftPackageReference "../MSNetwork" */ = {
+ DD734C462B16EB0700944E71 /* XCLocalSwiftPackageReference "../Features/Home" */ = {
isa = XCLocalSwiftPackageReference;
- relativePath = ../MSNetwork;
+ relativePath = ../Features/Home;
+ };
+ DD734C4E2B16EB2D00944E71 /* XCLocalSwiftPackageReference "../Features/SaveJourney" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../Features/SaveJourney;
+ };
+ DD734C512B16EB3400944E71 /* XCLocalSwiftPackageReference "../Features/SelectSong" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../Features/SelectSong;
+ };
+ DD734C572B16EB5500944E71 /* XCLocalSwiftPackageReference "../Features/Spot" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../Features/Spot;
+ };
+ DD734C5A2B16EBB800944E71 /* XCLocalSwiftPackageReference "../Features/RewindJourney" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../Features/RewindJourney;
};
/* End XCLocalSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
- 21B1B63C2B04C7CF00A63287 /* FoundationExt */ = {
+ DD5EA2542B16EC920080AEC1 /* JourneyList */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = DD734C432B16EAFC00944E71 /* XCLocalSwiftPackageReference "../Features/JourneyList" */;
+ productName = JourneyList;
+ };
+ DD5EA2562B16EC960080AEC1 /* NavigateMap */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = DD734C462B16EB0700944E71 /* XCLocalSwiftPackageReference "../Features/Home" */;
+ productName = NavigateMap;
+ };
+ DD5EA2582B16EC9B0080AEC1 /* RecordJourney */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = DD734C462B16EB0700944E71 /* XCLocalSwiftPackageReference "../Features/Home" */;
+ productName = RecordJourney;
+ };
+ DD5EA25A2B16ECA10080AEC1 /* SaveJourney */ = {
isa = XCSwiftPackageProductDependency;
- productName = FoundationExt;
+ package = DD734C4E2B16EB2D00944E71 /* XCLocalSwiftPackageReference "../Features/SaveJourney" */;
+ productName = SaveJourney;
};
- 21B1B63E2B04C7CF00A63287 /* MSLogger */ = {
+ DD5EA25C2B16ECA60080AEC1 /* SelectSong */ = {
isa = XCSwiftPackageProductDependency;
- productName = MSLogger;
+ package = DD734C512B16EB3400944E71 /* XCLocalSwiftPackageReference "../Features/SelectSong" */;
+ productName = SelectSong;
};
- 21B1B6402B04C7CF00A63287 /* MSUserDefaults */ = {
+ DD5EA25E2B16ECAB0080AEC1 /* Spot */ = {
isa = XCSwiftPackageProductDependency;
- productName = MSUserDefaults;
+ package = DD734C572B16EB5500944E71 /* XCLocalSwiftPackageReference "../Features/Spot" */;
+ productName = Spot;
};
- 21B1B6432B04D64A00A63287 /* MSNetwork */ = {
+ DD5EA2602B16ECAF0080AEC1 /* RewindJourney */ = {
isa = XCSwiftPackageProductDependency;
- productName = MSNetwork;
+ package = DD734C5A2B16EBB800944E71 /* XCLocalSwiftPackageReference "../Features/RewindJourney" */;
+ productName = RewindJourney;
};
/* End XCSwiftPackageProductDependency section */
};
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/xcshareddata/xcschemes/MusicSpot.xcscheme b/iOS/MusicSpot/MusicSpot.xcodeproj/xcshareddata/xcschemes/MusicSpot.xcscheme
new file mode 100644
index 0000000..7eb04dc
--- /dev/null
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/xcshareddata/xcschemes/MusicSpot.xcscheme
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iOS/MusicSpot/MusicSpot/SceneDelegate.swift b/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
index b01638c..0f347bb 100644
--- a/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
+++ b/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
@@ -9,7 +9,11 @@ import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+ // MARK: - Properties
+
var window: UIWindow?
+
+ // MARK: - Functions
func scene(_ scene: UIScene,
willConnectTo _: UISceneSession,
@@ -22,4 +26,5 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
window.rootViewController = testViewController
window.makeKeyAndVisible()
}
+
}
diff --git a/iOS/commit b/iOS/commit
index a18ba9a..8eac4c3 100755
--- a/iOS/commit
+++ b/iOS/commit
@@ -1,7 +1,7 @@
#!/bin/sh
LINTPATH='.swiftlint.yml'
-declare -a PATHS=("MSCoreKit" "MSFoundation" "MSUIKit" "MusicSpot" "Features")
+declare -a PATHS=("MSCoreKit" "MSFoundation" "MSUIKit" "MSData" "MusicSpot" "Features")
failures=""
for path in "${PATHS[@]}"; do