diff --git a/.gitignore b/.gitignore index bc5c7ae8..aae36085 100644 --- a/.gitignore +++ b/.gitignore @@ -112,10 +112,16 @@ Dependencies/ # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/#source-control -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output +Spark-iOS/fastlane/report.xml +Spark-iOS/fastlane/Preview.html +Spark-iOS/fastlane/test_output + +Spark-iOS/fastlane/metadata/ +Spark-iOS/fastlane/screenshots/ + +Spark-iOS/fastlane/key.json +*.cer +*.mobileprovision # Code Injection # After new code Injection tools there's a generated folder /iOSInjectionProject @@ -128,7 +134,7 @@ iOSInjectionProject/ # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - +*.xcconfig ## Gcc Patch /*.gcno diff --git a/Spark-iOS/Gemfile b/Spark-iOS/Gemfile new file mode 100644 index 00000000..7a118b49 --- /dev/null +++ b/Spark-iOS/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/Spark-iOS/Gemfile.lock b/Spark-iOS/Gemfile.lock new file mode 100644 index 00000000..16f43b96 --- /dev/null +++ b/Spark-iOS/Gemfile.lock @@ -0,0 +1,218 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.5) + rexml + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.2.0) + aws-partitions (1.642.0) + aws-sdk-core (3.158.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.525.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.58.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.114.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.5.2) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.4) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.93.0) + faraday (1.10.2) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.6) + fastlane (2.210.1) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (~> 2.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.29.0) + google-apis-core (>= 0.9.0, < 2.a) + google-apis-core (0.9.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.15.0) + google-apis-core (>= 0.9.0, < 2.a) + google-apis-playcustomapp_v1 (0.11.0) + google-apis-core (>= 0.9.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.0) + google-cloud-storage (1.43.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.19.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) + mini_mime (~> 1.0) + googleauth (1.2.0) + faraday (>= 0.17.3, < 3.a) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.1) + json (2.6.2) + jwt (2.5.0) + memoist (0.16.2) + mini_magick (4.11.0) + mini_mime (1.1.2) + multi_json (1.15.0) + multipart-post (2.0.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.6.0) + public_suffix (5.0.0) + rake (13.0.6) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.5) + rouge (2.0.7) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + security (0.1.3) + signet (0.17.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.7.0) + word_wrap (1.0.0) + xcodeproj (1.22.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + x86_64-darwin-21 + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.3.11 diff --git a/Spark-iOS/Podfile.lock b/Spark-iOS/Podfile.lock index 2cff3e66..ffa0e6eb 100644 --- a/Spark-iOS/Podfile.lock +++ b/Spark-iOS/Podfile.lock @@ -1,78 +1,72 @@ PODS: - Alamofire (5.6.2) - - Firebase/Analytics (9.6.0): + - Firebase/Analytics (10.0.0): - Firebase/Core - - Firebase/Core (9.6.0): + - Firebase/Core (10.0.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 9.6.0) - - Firebase/CoreOnly (9.6.0): - - FirebaseCore (= 9.6.0) - - Firebase/Messaging (9.6.0): + - FirebaseAnalytics (~> 10.0.0) + - Firebase/CoreOnly (10.0.0): + - FirebaseCore (= 10.0.0) + - Firebase/Messaging (10.0.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 9.6.0) - - FirebaseAnalytics (9.6.0): - - FirebaseAnalytics/AdIdSupport (= 9.6.0) - - FirebaseCore (~> 9.0) - - FirebaseInstallations (~> 9.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" + - FirebaseMessaging (~> 10.0.0) + - FirebaseAnalytics (10.0.0): + - FirebaseAnalytics/AdIdSupport (= 10.0.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (9.6.0): - - FirebaseCore (~> 9.0) - - FirebaseInstallations (~> 9.0) - - GoogleAppMeasurement (= 9.6.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" + - FirebaseAnalytics/AdIdSupport (10.0.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseCore (9.6.0): - - FirebaseCoreDiagnostics (~> 9.0) - - FirebaseCoreInternal (~> 9.0) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Logger (~> 7.7) - - FirebaseCoreDiagnostics (9.6.0): - - GoogleDataTransport (< 10.0.0, >= 9.1.4) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Logger (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseCoreInternal (9.6.0): - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - FirebaseInstallations (9.6.0): - - FirebaseCore (~> 9.0) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/UserDefaults (~> 7.7) + - FirebaseCore (10.0.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.0.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.0.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) - PromisesObjC (~> 2.1) - - FirebaseMessaging (9.6.0): - - FirebaseCore (~> 9.0) - - FirebaseInstallations (~> 9.0) - - GoogleDataTransport (< 10.0.0, >= 9.1.4) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Reachability (~> 7.7) - - GoogleUtilities/UserDefaults (~> 7.7) + - FirebaseMessaging (10.0.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement (9.6.0): - - GoogleAppMeasurement/AdIdSupport (= 9.6.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" + - GoogleAppMeasurement (10.0.0): + - GoogleAppMeasurement/AdIdSupport (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (9.6.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 9.6.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" + - GoogleAppMeasurement/AdIdSupport (10.0.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (9.6.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" + - GoogleAppMeasurement/WithoutAdIdSupport (10.0.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" - nanopb (< 2.30910.0, >= 2.30908.0) - GoogleDataTransport (9.2.0): - GoogleUtilities/Environment (~> 7.7) @@ -98,19 +92,19 @@ PODS: - GoogleUtilities/UserDefaults (7.8.0): - GoogleUtilities/Logger - JJFloatingActionButton (2.5.0) - - KakaoSDKAuth (2.11.1): - - KakaoSDKCommon (= 2.11.1) - - KakaoSDKCommon (2.11.1): - - KakaoSDKCommon/Common (= 2.11.1) - - KakaoSDKCommon/Network (= 2.11.1) - - KakaoSDKCommon/Common (2.11.1) - - KakaoSDKCommon/Network (2.11.1): + - KakaoSDKAuth (2.11.3): + - KakaoSDKCommon (= 2.11.3) + - KakaoSDKCommon (2.11.3): + - KakaoSDKCommon/Common (= 2.11.3) + - KakaoSDKCommon/Network (= 2.11.3) + - KakaoSDKCommon/Common (2.11.3) + - KakaoSDKCommon/Network (2.11.3): - Alamofire (~> 5.1) - - KakaoSDKCommon/Common (= 2.11.1) - - KakaoSDKUser (2.11.1): - - KakaoSDKAuth (= 2.11.1) - - Kingfisher (7.3.2) - - lottie-ios (3.4.3) + - KakaoSDKCommon/Common (= 2.11.3) + - KakaoSDKUser (2.11.3): + - KakaoSDKAuth (= 2.11.3) + - Kingfisher (7.4.0) + - lottie-ios (3.5.0) - Moya (15.0.0): - Moya/Core (= 15.0.0) - Moya/Core (15.0.0): @@ -151,7 +145,6 @@ SPEC REPOS: - Firebase - FirebaseAnalytics - FirebaseCore - - FirebaseCoreDiagnostics - FirebaseCoreInternal - FirebaseInstallations - FirebaseMessaging @@ -184,22 +177,21 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Alamofire: d368e1ff8a298e6dde360e35a3e68e6c610e7204 - Firebase: 5ae8b7cf8efce559a653aef0ad95bab3f427c351 - FirebaseAnalytics: 89ad762c6c3852a685794174757e2c60a36b6a82 - FirebaseCore: 2082fffcd855f95f883c0a1641133eb9bbe76d40 - FirebaseCoreDiagnostics: 99a495094b10a57eeb3ae8efa1665700ad0bdaa6 - FirebaseCoreInternal: bca76517fe1ed381e989f5e7d8abb0da8d85bed3 - FirebaseInstallations: 0a115432c4e223c5ab20b0dbbe4cbefa793a0e8e - FirebaseMessaging: a4d7910e4af663c9cbfc1071c5bef34651690949 - GoogleAppMeasurement: 6de2b1a69e4326eb82ee05d138f6a5cb7311bcb1 + Firebase: 1b810f3d0c0532e27a48f1961f8c0400a668a2cf + FirebaseAnalytics: 9921a52739f4ab66099da31b6e0243db78a3ac0a + FirebaseCore: 97f48a3a567a72b8d4daa0f03c3aadb78df4e995 + FirebaseCoreInternal: 5eb3960335da5ea30115d57d39db6988c4ad06f3 + FirebaseInstallations: 7f1c9ae6bd9df6abe9c74124b38fa8740aba5df4 + FirebaseMessaging: 8916bf5edb1dbfac74665a181e4d1ab3a78a08a2 + GoogleAppMeasurement: 7e48a3249792ac35d6f18f107f63f199a7e9d0ce GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7 JJFloatingActionButton: fdc3aefb0f28f04d0f988fa25d5fac97028a9ea7 - KakaoSDKAuth: bb2dfa7be30daa8403c9cfc8001aa6fde7a5b779 - KakaoSDKCommon: 555e1bb46595b842ded01cf7888cc17bbae4e113 - KakaoSDKUser: 08c0a4f40bebdebdf948a9e3d0e44ed5c2754f99 - Kingfisher: 0086ad83719761ba9b2cdaf6ef4d5b4878cbae23 - lottie-ios: 9ae750cdc7820fecbd3c2f0cfc493038208fcdc4 + KakaoSDKAuth: a64dde90516e18fdfc35b83bbad2677c3675c329 + KakaoSDKCommon: b4235203f67a5b6ee2df75eaf9bbc863c6d92e09 + KakaoSDKUser: 9a42e9b74855ce876b071c841418aa6726534010 + Kingfisher: 596b207973051aae5e4c54a1c1cb39837ea10d36 + lottie-ios: c55158d67d0629a260625cc2ded2052b829e3c3e Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb @@ -211,4 +203,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: c6f26cb086a4c592812d547f9f53a7e99b2107d4 -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/Spark-iOS/Spark-iOS.xcodeproj/project.pbxproj b/Spark-iOS/Spark-iOS.xcodeproj/project.pbxproj index 986c24ab..116c6aab 100644 --- a/Spark-iOS/Spark-iOS.xcodeproj/project.pbxproj +++ b/Spark-iOS/Spark-iOS.xcodeproj/project.pbxproj @@ -14,6 +14,14 @@ 2B13FB252798B705004CCE46 /* CompleteAuthVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB9C50892792A86D00588155 /* CompleteAuthVC.swift */; }; 2B13FB262798B70A004CCE46 /* MyRoomCerti.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE90FCD2795C23A00157075 /* MyRoomCerti.swift */; }; 2B2D31B827DA68EE000EDD28 /* ServiceNotice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B2D31B727DA68EE000EDD28 /* ServiceNotice.swift */; }; + 2B3EB43228EB1F31004D644F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2B3EB42E28EB1F31004D644F /* Shared.xcconfig */; }; + 2B3EB43328EB1F31004D644F /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2B3EB42F28EB1F31004D644F /* Debug.xcconfig */; }; + 2B3EB43428EB1F31004D644F /* Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2B3EB43028EB1F31004D644F /* Release.xcconfig */; }; + 2B3EB43528EB1F31004D644F /* Beta.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2B3EB43128EB1F31004D644F /* Beta.xcconfig */; }; + 2B3EB43828EB2F9A004D644F /* LifeTimeLineVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3EB43728EB2F9A004D644F /* LifeTimeLineVC.swift */; }; + 2B3EB43A28EB30D8004D644F /* LifeTimeLine.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2B3EB43928EB30D8004D644F /* LifeTimeLine.storyboard */; }; + 2B3EB43D28EB3551004D644F /* LifeTimeLineCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3EB43C28EB3551004D644F /* LifeTimeLineCVC.swift */; }; + 2B3EB43F28EB38F8004D644F /* LifeTimeLineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3EB43E28EB38F8004D644F /* LifeTimeLineHeaderView.swift */; }; 2B50C1A227D7752C004BED9C /* NoticeActiveCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B50C1A127D7752C004BED9C /* NoticeActiveCVC.swift */; }; 2B50C1A427D77CA9004BED9C /* NoticeServiceCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B50C1A327D77CA9004BED9C /* NoticeServiceCVC.swift */; }; 2B54D01627D3B2810060DA06 /* FeedReportVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B54D01527D3B2810060DA06 /* FeedReportVC.swift */; }; @@ -24,6 +32,7 @@ 2B57F38427971F7A002A677D /* ProfileSetting.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2B57F38327971F7A002A677D /* ProfileSetting.storyboard */; }; 2B69E7E5278E22F4000F927F /* FeedHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B69E7E4278E22F4000F927F /* FeedHeaderView.swift */; }; 2B69E7E7278E28B2000F927F /* FeedCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B69E7E6278E28B2000F927F /* FeedCVC.swift */; }; + 2B916A3D28EFF8600016C7E6 /* TimeLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B916A3C28EFF8600016C7E6 /* TimeLine.swift */; }; 2B9471F9278BE922005484C5 /* NotoSansKR-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2B9471F6278BE922005484C5 /* NotoSansKR-Bold.otf */; }; 2B9471FA278BE922005484C5 /* NotoSansKR-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2B9471F7278BE922005484C5 /* NotoSansKR-Medium.otf */; }; 2B9471FB278BE922005484C5 /* NotoSansKR-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2B9471F8278BE922005484C5 /* NotoSansKR-Regular.otf */; }; @@ -78,6 +87,7 @@ 76CFA86ADD8A78B244A43E61 /* Pods_Spark_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41C0A73912FEE9D1B2F72ED /* Pods_Spark_iOS.framework */; }; EB01BC1027C8DFBA00041A35 /* SparkActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB01BC0F27C8DFBA00041A35 /* SparkActionSheet.swift */; }; EB26D93827CF74D700C88DCA /* SendSparkCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB26D93727CF74D700C88DCA /* SendSparkCVC.swift */; }; + EB62422528EDA50C001432A8 /* RequestContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB62422428EDA50C001432A8 /* RequestContainer.swift */; }; EB625E7B278F271400C43DE9 /* DoingStorageCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E79278F271400C43DE9 /* DoingStorageCVC.swift */; }; EB625E7C278F271400C43DE9 /* DoingStorageCVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB625E7A278F271400C43DE9 /* DoingStorageCVC.xib */; }; EB625E7F278F272300C43DE9 /* DoneStorageCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E7D278F272300C43DE9 /* DoneStorageCVC.swift */; }; @@ -86,7 +96,6 @@ EB625E84278F273200C43DE9 /* FailStorageCVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB625E82278F273200C43DE9 /* FailStorageCVC.xib */; }; EB625E87278F27F000C43DE9 /* StorageListDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E86278F27F000C43DE9 /* StorageListDataModel.swift */; }; EB625E8A278F29D300C43DE9 /* CarouselLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E89278F29D300C43DE9 /* CarouselLayout.swift */; }; - EB625E8F278F8E1900C43DE9 /* StorageMoreListDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E8E278F8E1900C43DE9 /* StorageMoreListDataModel.swift */; }; EB625E91278F8E3700C43DE9 /* StorageMoreVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E90278F8E3700C43DE9 /* StorageMoreVC.swift */; }; EB625E95278F8E7200C43DE9 /* MoreStorageCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB625E93278F8E7200C43DE9 /* MoreStorageCVC.swift */; }; EB625E96278F8E7200C43DE9 /* MoreStorageCVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB625E94278F8E7200C43DE9 /* MoreStorageCVC.xib */; }; @@ -175,6 +184,7 @@ F82F580E27930FD4003E4174 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F82F580D27930FD4003E4174 /* GoogleService-Info.plist */; }; F82F58112793B3FF003E4174 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = F82F58102793B3FF003E4174 /* .swiftlint.yml */; }; F8404E8B27AB835F004AEDC3 /* SendSparkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8404E8A27AB835F004AEDC3 /* SendSparkButton.swift */; }; + F84492B328F573B500A298B9 /* UpgradeFlakeCarouselLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F84492B228F573B500A298B9 /* UpgradeFlakeCarouselLayout.swift */; }; F849521427FFDB8B00D91B6B /* NewNotice.swift in Sources */ = {isa = PBXBuildFile; fileRef = F849521327FFDB8B00D91B6B /* NewNotice.swift */; }; F85036CC27E2567C00F02751 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85036CB27E2567C00F02751 /* NotificationService.swift */; }; F85036D027E2567C00F02751 /* SparkNotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = F85036C927E2567C00F02751 /* SparkNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -183,6 +193,10 @@ F86C68B927958AA9009A5296 /* UIImageView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86C68B827958AA9009A5296 /* UIImageView+.swift */; }; F86FC47A27F1B835004478F3 /* NoticeSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86FC47927F1B835004478F3 /* NoticeSetting.swift */; }; F86FC47C27F1C8B3004478F3 /* NotificationCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86FC47B27F1C8B3004478F3 /* NotificationCellDelegate.swift */; }; + F88BA13B28F08D8900F48BD0 /* UpgradeFlake.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88BA13A28F08D8900F48BD0 /* UpgradeFlake.swift */; }; + F88BA13E28F0957000F48BD0 /* UpgradeFlakeDialogueVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88BA13D28F0957000F48BD0 /* UpgradeFlakeDialogueVC.swift */; }; + F88BA14028F0970900F48BD0 /* UpgradeFlakeDialogue.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F88BA13F28F0970900F48BD0 /* UpgradeFlakeDialogue.storyboard */; }; + F88BA14228F16FA800F48BD0 /* UpgradeFlakeCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88BA14128F16FA800F48BD0 /* UpgradeFlakeCVC.swift */; }; F8902FB927ED84060034E8F9 /* Withdrawal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F8902FB827ED84060034E8F9 /* Withdrawal.storyboard */; }; F8902FBD27ED844E0034E8F9 /* WithdrawalVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8902FBC27ED844E0034E8F9 /* WithdrawalVC.swift */; }; F8917E5A2836A14500F96347 /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8917E592836A14500F96347 /* UserDefaultsManager.swift */; }; @@ -250,6 +264,14 @@ 2B12728B28167766002DA1DA /* Tracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tracking.swift; sourceTree = ""; }; 2B13FB22279899C6004CCE46 /* UIScreen+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScreen+.swift"; sourceTree = ""; }; 2B2D31B727DA68EE000EDD28 /* ServiceNotice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceNotice.swift; sourceTree = ""; }; + 2B3EB42E28EB1F31004D644F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = ""; }; + 2B3EB42F28EB1F31004D644F /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 2B3EB43028EB1F31004D644F /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 2B3EB43128EB1F31004D644F /* Beta.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Beta.xcconfig; sourceTree = ""; }; + 2B3EB43728EB2F9A004D644F /* LifeTimeLineVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LifeTimeLineVC.swift; sourceTree = ""; }; + 2B3EB43928EB30D8004D644F /* LifeTimeLine.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LifeTimeLine.storyboard; sourceTree = ""; }; + 2B3EB43C28EB3551004D644F /* LifeTimeLineCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LifeTimeLineCVC.swift; sourceTree = ""; }; + 2B3EB43E28EB38F8004D644F /* LifeTimeLineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LifeTimeLineHeaderView.swift; sourceTree = ""; }; 2B50C1A127D7752C004BED9C /* NoticeActiveCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeActiveCVC.swift; sourceTree = ""; }; 2B50C1A327D77CA9004BED9C /* NoticeServiceCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeServiceCVC.swift; sourceTree = ""; }; 2B54D01527D3B2810060DA06 /* FeedReportVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedReportVC.swift; sourceTree = ""; }; @@ -260,6 +282,7 @@ 2B57F38327971F7A002A677D /* ProfileSetting.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = ProfileSetting.storyboard; sourceTree = ""; }; 2B69E7E4278E22F4000F927F /* FeedHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedHeaderView.swift; sourceTree = ""; }; 2B69E7E6278E28B2000F927F /* FeedCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedCVC.swift; sourceTree = ""; }; + 2B916A3C28EFF8600016C7E6 /* TimeLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeLine.swift; sourceTree = ""; }; 2B9471F6278BE922005484C5 /* NotoSansKR-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansKR-Bold.otf"; sourceTree = ""; }; 2B9471F7278BE922005484C5 /* NotoSansKR-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansKR-Medium.otf"; sourceTree = ""; }; 2B9471F8278BE922005484C5 /* NotoSansKR-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansKR-Regular.otf"; sourceTree = ""; }; @@ -313,10 +336,12 @@ 2BF3AB48279479B8001A9042 /* RoomAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomAPI.swift; sourceTree = ""; }; 2BF3AB4B27947C50001A9042 /* WaitingRoom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitingRoom.swift; sourceTree = ""; }; 3F3E6E986D8C9F3A27A30253 /* Pods-Spark-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Spark-iOS.release.xcconfig"; path = "Target Support Files/Pods-Spark-iOS/Pods-Spark-iOS.release.xcconfig"; sourceTree = ""; }; + 9CDB2BC50C4921D4EE5A9701 /* Pods-Spark-iOS.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Spark-iOS.beta.xcconfig"; path = "Target Support Files/Pods-Spark-iOS/Pods-Spark-iOS.beta.xcconfig"; sourceTree = ""; }; C35EB7FFC7E2CF05E63983A7 /* Pods-Spark-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Spark-iOS.debug.xcconfig"; path = "Target Support Files/Pods-Spark-iOS/Pods-Spark-iOS.debug.xcconfig"; sourceTree = ""; }; E41C0A73912FEE9D1B2F72ED /* Pods_Spark_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Spark_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EB01BC0F27C8DFBA00041A35 /* SparkActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SparkActionSheet.swift; sourceTree = ""; }; EB26D93727CF74D700C88DCA /* SendSparkCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendSparkCVC.swift; sourceTree = ""; }; + EB62422428EDA50C001432A8 /* RequestContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestContainer.swift; sourceTree = ""; }; EB625E79278F271400C43DE9 /* DoingStorageCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoingStorageCVC.swift; sourceTree = ""; }; EB625E7A278F271400C43DE9 /* DoingStorageCVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DoingStorageCVC.xib; sourceTree = ""; }; EB625E7D278F272300C43DE9 /* DoneStorageCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoneStorageCVC.swift; sourceTree = ""; }; @@ -325,7 +350,6 @@ EB625E82278F273200C43DE9 /* FailStorageCVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FailStorageCVC.xib; sourceTree = ""; }; EB625E86278F27F000C43DE9 /* StorageListDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageListDataModel.swift; sourceTree = ""; }; EB625E89278F29D300C43DE9 /* CarouselLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselLayout.swift; sourceTree = ""; }; - EB625E8E278F8E1900C43DE9 /* StorageMoreListDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageMoreListDataModel.swift; sourceTree = ""; }; EB625E90278F8E3700C43DE9 /* StorageMoreVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageMoreVC.swift; sourceTree = ""; }; EB625E93278F8E7200C43DE9 /* MoreStorageCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStorageCVC.swift; sourceTree = ""; }; EB625E94278F8E7200C43DE9 /* MoreStorageCVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MoreStorageCVC.xib; sourceTree = ""; }; @@ -418,6 +442,7 @@ F82F58102793B3FF003E4174 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; F8368FAA278F5DFF00110B74 /* Spark-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Spark-iOS.entitlements"; sourceTree = ""; }; F8404E8A27AB835F004AEDC3 /* SendSparkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendSparkButton.swift; sourceTree = ""; }; + F84492B228F573B500A298B9 /* UpgradeFlakeCarouselLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradeFlakeCarouselLayout.swift; sourceTree = ""; }; F849521327FFDB8B00D91B6B /* NewNotice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNotice.swift; sourceTree = ""; }; F85036C927E2567C00F02751 /* SparkNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SparkNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; F85036CB27E2567C00F02751 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -427,6 +452,10 @@ F86C68B827958AA9009A5296 /* UIImageView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+.swift"; sourceTree = ""; }; F86FC47927F1B835004478F3 /* NoticeSetting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeSetting.swift; sourceTree = ""; }; F86FC47B27F1C8B3004478F3 /* NotificationCellDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationCellDelegate.swift; sourceTree = ""; }; + F88BA13A28F08D8900F48BD0 /* UpgradeFlake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradeFlake.swift; sourceTree = ""; }; + F88BA13D28F0957000F48BD0 /* UpgradeFlakeDialogueVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradeFlakeDialogueVC.swift; sourceTree = ""; }; + F88BA13F28F0970900F48BD0 /* UpgradeFlakeDialogue.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = UpgradeFlakeDialogue.storyboard; sourceTree = ""; }; + F88BA14128F16FA800F48BD0 /* UpgradeFlakeCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradeFlakeCVC.swift; sourceTree = ""; }; F8902FB827ED84060034E8F9 /* Withdrawal.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Withdrawal.storyboard; sourceTree = ""; }; F8902FBC27ED844E0034E8F9 /* WithdrawalVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawalVC.swift; sourceTree = ""; }; F8917E592836A14500F96347 /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = ""; }; @@ -483,6 +512,34 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 2B3EB42D28EB1F31004D644F /* XCConfig */ = { + isa = PBXGroup; + children = ( + 2B3EB42E28EB1F31004D644F /* Shared.xcconfig */, + 2B3EB42F28EB1F31004D644F /* Debug.xcconfig */, + 2B3EB43028EB1F31004D644F /* Release.xcconfig */, + 2B3EB43128EB1F31004D644F /* Beta.xcconfig */, + ); + path = XCConfig; + sourceTree = ""; + }; + 2B3EB43628EB2F6D004D644F /* LifeTimeLine */ = { + isa = PBXGroup; + children = ( + 2B3EB43728EB2F9A004D644F /* LifeTimeLineVC.swift */, + ); + path = LifeTimeLine; + sourceTree = ""; + }; + 2B3EB43B28EB352F004D644F /* LifeTimeLine */ = { + isa = PBXGroup; + children = ( + 2B3EB43C28EB3551004D644F /* LifeTimeLineCVC.swift */, + 2B3EB43E28EB38F8004D644F /* LifeTimeLineHeaderView.swift */, + ); + path = LifeTimeLine; + sourceTree = ""; + }; 2B54D01427D3B22E0060DA06 /* Feed */ = { isa = PBXGroup; children = ( @@ -731,6 +788,7 @@ 2B57F37B27968A28002A677D /* CreateRoom.swift */, 2B57F37D27969791002A677D /* RoomId.swift */, F8F6D6FD2797D8BD00725537 /* HabitRoomDetail.swift */, + 2B916A3C28EFF8600016C7E6 /* TimeLine.swift */, ); path = Room; sourceTree = ""; @@ -748,6 +806,7 @@ children = ( C35EB7FFC7E2CF05E63983A7 /* Pods-Spark-iOS.debug.xcconfig */, 3F3E6E986D8C9F3A27A30253 /* Pods-Spark-iOS.release.xcconfig */, + 9CDB2BC50C4921D4EE5A9701 /* Pods-Spark-iOS.beta.xcconfig */, ); path = Pods; sourceTree = ""; @@ -769,7 +828,6 @@ isa = PBXGroup; children = ( EB625E86278F27F000C43DE9 /* StorageListDataModel.swift */, - EB625E8E278F8E1900C43DE9 /* StorageMoreListDataModel.swift */, ); path = StorageList; sourceTree = ""; @@ -786,6 +844,7 @@ 2B0CF77327BFEDAC003C2E21 /* BottomButton.swift */, F821812B27DE21FE00DDFBF8 /* SparkNavigationBar */, F821812C27DE223100DDFBF8 /* SparkTabBar */, + F84492B228F573B500A298B9 /* UpgradeFlakeCarouselLayout.swift */, ); path = Classes; sourceTree = ""; @@ -831,6 +890,7 @@ F8C3659427DBB82A000AA9BD /* CompleteFailDialogueVC.swift */, EBE01B1127E31BFE00085AB7 /* LifeDiminishDialogueVC.swift */, F8281821281316BA00D3E26C /* SingleResponseDialogueVC.swift */, + F88BA13D28F0957000F48BD0 /* UpgradeFlakeDialogueVC.swift */, ); path = Dialogue; sourceTree = ""; @@ -842,6 +902,7 @@ F8C3659627DBB834000AA9BD /* CompleteFailDialogue.storyboard */, EBE01B1327E334D200085AB7 /* LifeDiminishDialogue.storyboard */, F828181D2813169200D3E26C /* SingleResponseDialogue.storyboard */, + F88BA13F28F0970900F48BD0 /* UpgradeFlakeDialogue.storyboard */, ); path = Dialogue; sourceTree = ""; @@ -868,6 +929,7 @@ F8F6D6F42797359600725537 /* HabitRoom.storyboard */, 2BA98FB327CB451000C53820 /* HabitRoomLeave.storyboard */, 2BD71BF127E0A5CD00771DCB /* HabitRoomGuide.storyboard */, + 2B3EB43928EB30D8004D644F /* LifeTimeLine.storyboard */, ); path = HabitRoom; sourceTree = ""; @@ -960,6 +1022,7 @@ isa = PBXGroup; children = ( F82F58102793B3FF003E4174 /* .swiftlint.yml */, + 2B3EB42D28EB1F31004D644F /* XCConfig */, F8096F022784107D00B71D38 /* Spark-iOS */, F85036CA27E2567C00F02751 /* SparkNotificationService */, F8096F012784107D00B71D38 /* Products */, @@ -1078,6 +1141,7 @@ F8096F1C27841DAE00B71D38 /* AppModels */ = { isa = PBXGroup; children = ( + F88BA13928F08D6800F48BD0 /* UpgradeFlake */, EB625E85278F27C300C43DE9 /* StorageList */, ); path = AppModels; @@ -1095,6 +1159,7 @@ F8096F1E27841DC100B71D38 /* ViewControllers */ = { isa = PBXGroup; children = ( + 2B3EB43628EB2F6D004D644F /* LifeTimeLine */, F82B2E10278F54C200219628 /* Splash */, EBD0D09527DC36730007E5AF /* Onboarding */, 2BAF155E27D492B500DE4190 /* Notice */, @@ -1179,6 +1244,7 @@ F8096F2327841DF800B71D38 /* Cells */ = { isa = PBXGroup; children = ( + 2B3EB43B28EB352F004D644F /* LifeTimeLine */, EBD0D09A27DC3A110007E5AF /* Onboarding */, 2BAF156127D49D4B00DE4190 /* Notice */, F8F6D6F82797525700725537 /* HabitRoom */, @@ -1304,6 +1370,7 @@ F82F58052792897B003E4174 /* Plugin */ = { isa = PBXGroup; children = ( + EB62422428EDA50C001432A8 /* RequestContainer.swift */, F82F580327928975003E4174 /* MoyaLoggerPlugin.swift */, ); path = Plugin; @@ -1327,6 +1394,14 @@ path = SparkNotificationService; sourceTree = ""; }; + F88BA13928F08D6800F48BD0 /* UpgradeFlake */ = { + isa = PBXGroup; + children = ( + F88BA13A28F08D8900F48BD0 /* UpgradeFlake.swift */, + ); + path = UpgradeFlake; + sourceTree = ""; + }; F8E3496627969B4F001B67E7 /* Auth */ = { isa = PBXGroup; children = ( @@ -1386,6 +1461,7 @@ F8F6D6FA2797527A00725537 /* HabitRoomMemberCVC.xib */, EB26D93727CF74D700C88DCA /* SendSparkCVC.swift */, 2BD71BF327E0E53500771DCB /* HabitRoomGuideCVC.swift */, + F88BA14128F16FA800F48BD0 /* UpgradeFlakeCVC.swift */, ); path = HabitRoom; sourceTree = ""; @@ -1489,11 +1565,15 @@ buildActionMask = 2147483647; files = ( EB625E84278F273200C43DE9 /* FailStorageCVC.xib in Resources */, + 2B3EB43228EB1F31004D644F /* Shared.xcconfig in Resources */, + 2B3EB43328EB1F31004D644F /* Debug.xcconfig in Resources */, EB874AEE2797071C000DD20B /* Dialogue.storyboard in Resources */, F8B18E0727EFA1AA001A1A7D /* Notification.storyboard in Resources */, F8C14A9C2795094800498687 /* HomeEmptyCVC.xib in Resources */, F8C3659727DBB834000AA9BD /* CompleteFailDialogue.storyboard in Resources */, + 2B3EB43528EB1F31004D644F /* Beta.xcconfig in Resources */, 2B9852092790ACF000CE40A7 /* CreateAuth.storyboard in Resources */, + 2B3EB43A28EB30D8004D644F /* LifeTimeLine.storyboard in Resources */, 2BBFEFBF279B214300C085E4 /* loading3.json in Resources */, F80A3E4D278C182100728E07 /* MainTabBar.storyboard in Resources */, 2BE65F5127C3E34B005D370D /* RoomStart.storyboard in Resources */, @@ -1531,12 +1611,14 @@ EBEA383527948C2D00B5736A /* ticket_welcome.json in Resources */, F8FAA9772790346000C4190F /* HomeWaitingCVC.xib in Resources */, 2B57F38427971F7A002A677D /* ProfileSetting.storyboard in Resources */, + F88BA14028F0970900F48BD0 /* UpgradeFlakeDialogue.storyboard in Resources */, EBA93A84279082B0009AE771 /* JoinCheck.storyboard in Resources */, 2B947203278CB00E005484C5 /* Futura Medium.otf in Resources */, F80B02CF27EC1BD800D63B45 /* homeCardFail.json in Resources */, F8F6D6FC2797527A00725537 /* HabitRoomMemberCVC.xib in Resources */, 2B9852032790310800CE40A7 /* CreateRoom.storyboard in Resources */, F80B02D127EC1BDC00D63B45 /* homeCardSuccess.json in Resources */, + 2B3EB43428EB1F31004D644F /* Release.xcconfig in Resources */, F80A3E53278C1C0C00728E07 /* Storage.storyboard in Resources */, F82F58112793B3FF003E4174 /* .swiftlint.yml in Resources */, EB625E7C278F271400C43DE9 /* DoingStorageCVC.xib in Resources */, @@ -1662,6 +1744,7 @@ F8E3496827969B61001B67E7 /* AuthAPI.swift in Sources */, F8096F3C2784211D00B71D38 /* UIColor+.swift in Sources */, F8E4DFD027D0858500128B1F /* MypageVC.swift in Sources */, + 2B916A3D28EFF8600016C7E6 /* TimeLine.swift in Sources */, 2BE5D818279330A6007A544D /* TimerAuthView.swift in Sources */, 2BBED12D279539B90052CA5C /* WaitingMember.swift in Sources */, F8D4496E27BE25610091F297 /* LeftButtonNavigaitonBar.swift in Sources */, @@ -1670,14 +1753,17 @@ 2B98520E2790AE0000CE40A7 /* PhotoAuthView.swift in Sources */, EBD0D09E27DC3A890007E5AF /* OnboardingCVCViewModel.swift in Sources */, F8250CFE27D4A55C0073FFCA /* ProfileImageDelegate.swift in Sources */, + EB62422528EDA50C001432A8 /* RequestContainer.swift in Sources */, EB625E7F278F272300C43DE9 /* DoneStorageCVC.swift in Sources */, 2BA98FB627CB620E00C53820 /* CreateSuccessVC.swift in Sources */, EBEA382D27947C9100B5736A /* MyRoomAPI.swift in Sources */, 2B69E7E7278E28B2000F927F /* FeedCVC.swift in Sources */, + 2B3EB43D28EB3551004D644F /* LifeTimeLineCVC.swift in Sources */, 2B0CF77427BFEDAC003C2E21 /* BottomButton.swift in Sources */, 2BE5D80827930A06007A544D /* AuthTimerVC.swift in Sources */, EBEA38372794B34300B5736A /* CodeJoinCheck.swift in Sources */, F8096F2B27841F4100B71D38 /* Storyboard.swift in Sources */, + 2B3EB43828EB2F9A004D644F /* LifeTimeLineVC.swift in Sources */, 2B57F38127971D1D002A677D /* ProfileSettingVC.swift in Sources */, 2B2D31B827DA68EE000EDD28 /* ServiceNotice.swift in Sources */, F8250CFC27D483E70073FFCA /* Profile.swift in Sources */, @@ -1687,12 +1773,15 @@ 2B014FAF27AAA90E004B4559 /* FeedFooterView.swift in Sources */, 2BD71BF427E0E53500771DCB /* HabitRoomGuideCVC.swift in Sources */, EBE01B1227E31BFE00085AB7 /* LifeDiminishDialogueVC.swift in Sources */, + 2B3EB43F28EB38F8004D644F /* LifeTimeLineHeaderView.swift in Sources */, 2B12728C28167766002DA1DA /* Tracking.swift in Sources */, F8F6D6FE2797D8BD00725537 /* HabitRoomDetail.swift in Sources */, EBD0D09427DBBC270007E5AF /* SendSparkCellDelegate.swift in Sources */, F8096F442784221900B71D38 /* Cell.swift in Sources */, + F84492B328F573B500A298B9 /* UpgradeFlakeCarouselLayout.swift in Sources */, F86C68B727955ABA009A5296 /* SparkFlake.swift in Sources */, EB625E8A278F29D300C43DE9 /* CarouselLayout.swift in Sources */, + F88BA14228F16FA800F48BD0 /* UpgradeFlakeCVC.swift in Sources */, F82F57FF27928588003E4174 /* URL.swift in Sources */, EB9C509827931E4600588155 /* AuthUploadVC.swift in Sources */, 2BBED1372795CDFE0052CA5C /* FeedEmptyCVC.swift in Sources */, @@ -1703,6 +1792,7 @@ EBE90FDA2796128800157075 /* SendSparkVC.swift in Sources */, EBEA383927953BC700B5736A /* Lottie.swift in Sources */, F82F57FD2792847D003E4174 /* GenericResponse.swift in Sources */, + F88BA13E28F0957000F48BD0 /* UpgradeFlakeDialogueVC.swift in Sources */, F8E4DFD627D0918C00128B1F /* MypageProfileTVC.swift in Sources */, F821813527DE659E00DDFBF8 /* SparkTabBarController.swift in Sources */, F8B18E0527EFA19E001A1A7D /* NotificationVC.swift in Sources */, @@ -1748,6 +1838,7 @@ F8250CF827D25F240073FFCA /* UserAPI.swift in Sources */, F8E3496D2796B7F6001B67E7 /* Signup.swift in Sources */, F8E3496A27969B67001B67E7 /* AuthService.swift in Sources */, + F88BA13B28F08D8900F48BD0 /* UpgradeFlake.swift in Sources */, 2BA98FB227CB44E800C53820 /* HabitRoomLeaveVC.swift in Sources */, 2BE907E127D9EE9700B36002 /* NoticeService.swift in Sources */, F86FC47C27F1C8B3004478F3 /* NotificationCellDelegate.swift in Sources */, @@ -1758,7 +1849,6 @@ F8250CFA27D25F2B0073FFCA /* UserService.swift in Sources */, F82F5808279289B2003E4174 /* HomeAPI.swift in Sources */, EBA93A7F279080E2009AE771 /* JoinCheckVC.swift in Sources */, - EB625E8F278F8E1900C43DE9 /* StorageMoreListDataModel.swift in Sources */, 2BAF156027D492C500DE4190 /* NoticeVC.swift in Sources */, F8096F462784247100B71D38 /* Notification.swift in Sources */, 2B57F37E27969791002A677D /* RoomId.swift in Sources */, @@ -1931,7 +2021,7 @@ }; F8096F152784107E00B71D38 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C35EB7FFC7E2CF05E63983A7 /* Pods-Spark-iOS.debug.xcconfig */; + baseConfigurationReference = 2B3EB42F28EB1F31004D644F /* Debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -1939,7 +2029,7 @@ CODE_SIGN_ENTITLEMENTS = "Spark-iOS/Spark-iOS.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = T8C9SSEX5G; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Spark-iOS/Resource/Info.plist"; @@ -1957,7 +2047,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.3; + MARKETING_VERSION = 1.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1969,7 +2059,7 @@ }; F8096F162784107E00B71D38 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F3E6E986D8C9F3A27A30253 /* Pods-Spark-iOS.release.xcconfig */; + baseConfigurationReference = 2B3EB43028EB1F31004D644F /* Release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -1977,7 +2067,7 @@ CODE_SIGN_ENTITLEMENTS = "Spark-iOS/Spark-iOS.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = T8C9SSEX5G; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Spark-iOS/Resource/Info.plist"; @@ -1995,7 +2085,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.3; + MARKETING_VERSION = 1.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2005,12 +2095,138 @@ }; name = Release; }; + F8371A3528E7E21700868718 /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LIBRARY = "libc++"; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Beta; + }; + F8371A3628E7E21700868718 /* Beta */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2B3EB43128EB1F31004D644F /* Beta.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Spark-iOS/Spark-iOS.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_TEAM = T8C9SSEX5G; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Spark-iOS/Resource/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Spark; + INFOPLIST_KEY_NSCameraUsageDescription = "프로필 사진 설정 및 변경, 습관 인증을 위해 카메라 권한을 허락해 주세요."; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "프로필 사진 설정 및 변경, 습관 인증을 위해 앨범 권한을 허락해 주세요."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Beta; + }; + F8371A3728E7E21700868718 /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_TEAM = T8C9SSEX5G; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = SparkNotificationService/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = SparkNotificationService; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark.SparkNotificationService; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Beta; + }; F85036D227E2567C00F02751 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = T8C9SSEX5G; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SparkNotificationService/Info.plist; @@ -2022,7 +2238,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 1.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark.SparkNotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2037,7 +2253,7 @@ buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = T8C9SSEX5G; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SparkNotificationService/Info.plist; @@ -2049,7 +2265,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 1.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.TeamSparker.Spark.SparkNotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2066,6 +2282,7 @@ isa = XCConfigurationList; buildConfigurations = ( F8096F122784107E00B71D38 /* Debug */, + F8371A3528E7E21700868718 /* Beta */, F8096F132784107E00B71D38 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -2075,6 +2292,7 @@ isa = XCConfigurationList; buildConfigurations = ( F8096F152784107E00B71D38 /* Debug */, + F8371A3628E7E21700868718 /* Beta */, F8096F162784107E00B71D38 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -2084,6 +2302,7 @@ isa = XCConfigurationList; buildConfigurations = ( F85036D227E2567C00F02751 /* Debug */, + F8371A3728E7E21700868718 /* Beta */, F85036D327E2567C00F02751 /* Release */, ); defaultConfigurationIsVisible = 0; diff --git a/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-beta.xcscheme b/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-beta.xcscheme new file mode 100644 index 00000000..2877b26e --- /dev/null +++ b/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-beta.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-iOS.xcscheme b/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-debug.xcscheme similarity index 100% rename from Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-iOS.xcscheme rename to Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-debug.xcscheme diff --git a/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-release.xcscheme b/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-release.xcscheme new file mode 100644 index 00000000..78a32e74 --- /dev/null +++ b/Spark-iOS/Spark-iOS.xcodeproj/xcshareddata/xcschemes/Spark-release.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/Contents.json new file mode 100644 index 00000000..deb502d4 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "scale" : "1x", + "idiom" : "universal", + "filename" : "icBadgeNew.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "icBadgeNew@2x.png" + }, + { + "scale" : "3x", + "idiom" : "universal", + "filename" : "icBadgeNew@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew.png new file mode 100644 index 00000000..b7167756 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@2x.png new file mode 100644 index 00000000..1318f9a9 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@3x.png new file mode 100644 index 00000000..5243fe7d Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/icBadgeNew.imageset/icBadgeNew@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/Contents.json new file mode 100644 index 00000000..4c865d30 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "property1DashSparkFlake1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "property1DashSparkFlake1@2x.png", + "scale" : "2x", + "idiom" : "universal" + }, + { + "scale" : "3x", + "filename" : "property1DashSparkFlake1@3x.png", + "idiom" : "universal" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1.png new file mode 100644 index 00000000..c4bf8ee8 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@2x.png new file mode 100644 index 00000000..92a8597f Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@3x.png new file mode 100644 index 00000000..694a1e24 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake1.imageset/property1DashSparkFlake1@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/Contents.json new file mode 100644 index 00000000..db521fd3 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "property1DashSparkFlake2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "property1DashSparkFlake2@2x.png" + }, + { + "filename" : "property1DashSparkFlake2@3x.png", + "scale" : "3x", + "idiom" : "universal" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2.png new file mode 100644 index 00000000..31465818 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@2x.png new file mode 100644 index 00000000..4deca116 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@3x.png new file mode 100644 index 00000000..2abb238d Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake2.imageset/property1DashSparkFlake2@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/Contents.json new file mode 100644 index 00000000..ecee9384 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "property1DashSparkFlake3.png", + "scale" : "1x", + "idiom" : "universal" + }, + { + "filename" : "property1DashSparkFlake3@2x.png", + "scale" : "2x", + "idiom" : "universal" + }, + { + "filename" : "property1DashSparkFlake3@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3.png new file mode 100644 index 00000000..ffe79f2c Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@2x.png new file mode 100644 index 00000000..fa56394e Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@3x.png new file mode 100644 index 00000000..16a49d2c Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake3.imageset/property1DashSparkFlake3@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/Contents.json new file mode 100644 index 00000000..7a0d18da --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "property1DashSparkFlake4.png", + "scale" : "1x", + "idiom" : "universal" + }, + { + "scale" : "2x", + "filename" : "property1DashSparkFlake4@2x.png", + "idiom" : "universal" + }, + { + "filename" : "property1DashSparkFlake4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4.png new file mode 100644 index 00000000..5e827d49 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@2x.png new file mode 100644 index 00000000..ee2c4424 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@3x.png new file mode 100644 index 00000000..03649d17 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake4.imageset/property1DashSparkFlake4@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/Contents.json new file mode 100644 index 00000000..44e625ff --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "property1DashSparkFlake5.png", + "scale" : "1x" + }, + { + "filename" : "property1DashSparkFlake5@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "property1DashSparkFlake5@3x.png", + "scale" : "3x", + "idiom" : "universal" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5.png new file mode 100644 index 00000000..760c2be2 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@2x.png new file mode 100644 index 00000000..635aa416 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@3x.png new file mode 100644 index 00000000..c3c0bee1 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake5.imageset/property1DashSparkFlake5@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/Contents.json new file mode 100644 index 00000000..0bbbe4c7 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "property1DashSparkFlake6.png", + "scale" : "1x" + }, + { + "scale" : "2x", + "filename" : "property1DashSparkFlake6@2x.png", + "idiom" : "universal" + }, + { + "filename" : "property1DashSparkFlake6@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6.png new file mode 100644 index 00000000..06e929a4 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@2x.png new file mode 100644 index 00000000..4df3f068 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@3x.png new file mode 100644 index 00000000..63a11ec4 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/property1DashSparkFlake6.imageset/property1DashSparkFlake6@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/Contents.json new file mode 100644 index 00000000..02709ba8 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "sparkFlakeSparkflake1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sparkFlakeSparkflake1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sparkFlakeSparkflake1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1.png new file mode 100644 index 00000000..fa7d5906 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@2x.png new file mode 100644 index 00000000..e1fc5fa6 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@3x.png new file mode 100644 index 00000000..713bde38 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake1.imageset/sparkFlakeSparkflake1@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/Contents.json new file mode 100644 index 00000000..0bf5c8d0 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "sparkFlakeSparkflake2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sparkFlakeSparkflake2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sparkFlakeSparkflake2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2.png new file mode 100644 index 00000000..a71dc349 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@2x.png new file mode 100644 index 00000000..0c099a52 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@3x.png new file mode 100644 index 00000000..ff9412cb Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake2.imageset/sparkFlakeSparkflake2@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/Contents.json new file mode 100644 index 00000000..9d321cfd --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "sparkFlakeSparkflake3.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake3@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake3@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3.png new file mode 100644 index 00000000..0b80fc97 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@2x.png new file mode 100644 index 00000000..27656739 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@3x.png new file mode 100644 index 00000000..bb1b3fb5 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake3.imageset/sparkFlakeSparkflake3@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/Contents.json new file mode 100644 index 00000000..43ce972b --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake4.png", + "scale" : "1x" + }, + { + "filename" : "sparkFlakeSparkflake4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sparkFlakeSparkflake4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4.png new file mode 100644 index 00000000..aaebf862 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@2x.png new file mode 100644 index 00000000..f33b6cc7 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@3x.png new file mode 100644 index 00000000..1c6d5159 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake4.imageset/sparkFlakeSparkflake4@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/Contents.json new file mode 100644 index 00000000..07668d3c --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake5.png", + "scale" : "1x" + }, + { + "filename" : "sparkFlakeSparkflake5@2x.png", + "scale" : "2x", + "idiom" : "universal" + }, + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake5@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5.png new file mode 100644 index 00000000..27e51feb Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@2x.png new file mode 100644 index 00000000..59331285 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@3x.png new file mode 100644 index 00000000..e21ba1a5 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake5.imageset/sparkFlakeSparkflake5@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/Contents.json b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/Contents.json new file mode 100644 index 00000000..e1b5b13d --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "sparkFlakeSparkflake6.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sparkFlakeSparkflake6@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "sparkFlakeSparkflake6@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6.png new file mode 100644 index 00000000..c4ca1110 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@2x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@2x.png new file mode 100644 index 00000000..77a32dbb Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@2x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@3x.png b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@3x.png new file mode 100644 index 00000000..138149b1 Binary files /dev/null and b/Spark-iOS/Spark-iOS/Resource/Assets.xcassets/sparkFlakeSparkflake6.imageset/sparkFlakeSparkflake6@3x.png differ diff --git a/Spark-iOS/Spark-iOS/Resource/Constants/Cell.swift b/Spark-iOS/Spark-iOS/Resource/Constants/Cell.swift index fdb6298f..6753274a 100644 --- a/Spark-iOS/Spark-iOS/Resource/Constants/Cell.swift +++ b/Spark-iOS/Spark-iOS/Resource/Constants/Cell.swift @@ -34,6 +34,9 @@ extension Const { static let habitRoomGuideCVC = "HabitRoomGuideCVC" static let notificationTableHeaderView = "NotificationTableHeaderView" static let notificationTVC = "NotificationTVC" + static let lifeTimeLineCVC = "LifeTimeLineCVC" + static let lifeTimeLineHeaderView = "LifeTimeLineHeaderView" + static let upgradeFlakeCVC = "UpgradeFlakeCVC" } } } diff --git a/Spark-iOS/Spark-iOS/Resource/Constants/Storyboard.swift b/Spark-iOS/Spark-iOS/Resource/Constants/Storyboard.swift index 14e48285..00231405 100644 --- a/Spark-iOS/Spark-iOS/Resource/Constants/Storyboard.swift +++ b/Spark-iOS/Spark-iOS/Resource/Constants/Storyboard.swift @@ -47,6 +47,8 @@ extension Const { static let lifeDiminishDialogue = "LifeDiminishDialogue" static let notification = "Notification" static let singleResponseDialogue = "SingleResponseDialogue" + static let lifeTimeLine = "LifeTimeLine" + static let UpgradeFlakeDialogue = "UpgradeFlakeDialogue" } } } diff --git a/Spark-iOS/Spark-iOS/Resource/Constants/Tracking.swift b/Spark-iOS/Spark-iOS/Resource/Constants/Tracking.swift index fb0ce495..31e4ac73 100644 --- a/Spark-iOS/Spark-iOS/Resource/Constants/Tracking.swift +++ b/Spark-iOS/Spark-iOS/Resource/Constants/Tracking.swift @@ -33,6 +33,8 @@ struct Tracking { static let clickFeed = "click_FEED" static let clickShare = "click_SHARE_INSTAGRAM" static let clickCard = "click_CARD_my_room" + static let clickTimelineWithNew = "click_TIMELINE_NEW_habit_room" + static let clickTimeline = "click_TIMELINE_NONE_habit_room" } struct Notification { diff --git a/Spark-iOS/Spark-iOS/Resource/Constants/URL.swift b/Spark-iOS/Spark-iOS/Resource/Constants/URL.swift index bcfafbd8..7ee7fa95 100644 --- a/Spark-iOS/Spark-iOS/Resource/Constants/URL.swift +++ b/Spark-iOS/Spark-iOS/Resource/Constants/URL.swift @@ -9,7 +9,7 @@ import Foundation extension Const { struct URL { - static let baseURL = "https://asia-northeast3-we-sopt-spark.cloudfunctions.net/api" + static let baseURL = Bundle.main.object(forInfoDictionaryKey: "BaseURL") as? String ?? "" /// 약관 및 정책 static let tosURL = "https://jealous-supernova-274.notion.site/433c8d2f5fdd4826a836293e522f1d51" /// 오픈소스 라이브러리 diff --git a/Spark-iOS/Spark-iOS/Resource/Constants/ViewController.swift b/Spark-iOS/Spark-iOS/Resource/Constants/ViewController.swift index deefe552..d862f0cf 100644 --- a/Spark-iOS/Spark-iOS/Resource/Constants/ViewController.swift +++ b/Spark-iOS/Spark-iOS/Resource/Constants/ViewController.swift @@ -47,6 +47,8 @@ extension Const { static let lifeDiminishDialogue = "LifeDiminishDialogueVC" static let notification = "NotificationVC" static let singleResponseDialogue = "SingleResponseDialogueVC" + static let lifeTimeLine = "LifeTimeLineVC" + static let UpgradeFlakeDialogue = "UpgradeFlakeDialogueVC" } } } diff --git a/Spark-iOS/Spark-iOS/Resource/Info.plist b/Spark-iOS/Spark-iOS/Resource/Info.plist index c4428c16..524b8b75 100644 --- a/Spark-iOS/Spark-iOS/Resource/Info.plist +++ b/Spark-iOS/Spark-iOS/Resource/Info.plist @@ -2,6 +2,8 @@ + BaseURL + $(BASE_URL) CFBundleURLTypes @@ -9,7 +11,7 @@ Editor CFBundleURLSchemes - kakaod51e83bca123750446afc70ab65225b9 + kakao$(KAKAO_NATIVE_APP_KEY) @@ -25,6 +27,10 @@ FirebaseMessagingAutoInitEnabled No + ITSAppUsesNonExemptEncryption + + KakaoNativeAppKey + $(KAKAO_NATIVE_APP_KEY) LSApplicationQueriesSchemes kakaokompassauth diff --git a/Spark-iOS/Spark-iOS/Resource/Storyboards/Dialogue/UpgradeFlakeDialogue.storyboard b/Spark-iOS/Spark-iOS/Resource/Storyboards/Dialogue/UpgradeFlakeDialogue.storyboard new file mode 100644 index 00000000..1ffd33c5 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Storyboards/Dialogue/UpgradeFlakeDialogue.storyboard @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/HabitRoom.storyboard b/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/HabitRoom.storyboard index c639a538..d592e8d3 100644 --- a/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/HabitRoom.storyboard +++ b/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/HabitRoom.storyboard @@ -1,9 +1,9 @@ - + - + @@ -51,13 +51,13 @@ - + @@ -75,22 +75,22 @@ - + - + @@ -178,11 +185,13 @@ + + @@ -200,7 +209,9 @@ + + diff --git a/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/LifeTimeLine.storyboard b/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/LifeTimeLine.storyboard new file mode 100644 index 00000000..0b481165 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Resource/Storyboards/HabitRoom/LifeTimeLine.storyboard @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spark-iOS/Spark-iOS/Source/AppDelegate.swift b/Spark-iOS/Spark-iOS/Source/AppDelegate.swift index d3ffe1c6..8d61d046 100644 --- a/Spark-iOS/Spark-iOS/Source/AppDelegate.swift +++ b/Spark-iOS/Spark-iOS/Source/AppDelegate.swift @@ -30,7 +30,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var isLogin = false func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - KakaoSDK.initSDK(appKey: "d51e83bca123750446afc70ab65225b9") + let kakaoNativeAppKey = Bundle.main.object(forInfoDictionaryKey: "KakaoNativeAppKey") as? String ?? "" + KakaoSDK.initSDK(appKey: kakaoNativeAppKey) let accessToken = UserDefaultsManager.accessToken diff --git a/Spark-iOS/Spark-iOS/Source/AppModels/UpgradeFlake/UpgradeFlake.swift b/Spark-iOS/Spark-iOS/Source/AppModels/UpgradeFlake/UpgradeFlake.swift new file mode 100644 index 00000000..b8b538cf --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/AppModels/UpgradeFlake/UpgradeFlake.swift @@ -0,0 +1,20 @@ +// +// UpgradeFlake.swift +// Spark-iOS +// +// Created by kimhyungyu on 2022/10/08. +// + +import UIKit + +public struct UpgradeFlake { + let flakeImage: UIImage + let upgradeText: String + let levelText: String + + init(_ flakeImage: UIImage, _ upgradeText: String, _ levelText: String) { + self.flakeImage = flakeImage + self.upgradeText = upgradeText + self.levelText = levelText + } +} diff --git a/Spark-iOS/Spark-iOS/Source/Cells/HabitRoom/UpgradeFlakeCVC.swift b/Spark-iOS/Spark-iOS/Source/Cells/HabitRoom/UpgradeFlakeCVC.swift new file mode 100644 index 00000000..430cf79b --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/Cells/HabitRoom/UpgradeFlakeCVC.swift @@ -0,0 +1,56 @@ +// +// UpgradeFlakeCVC.swift +// Spark-iOS +// +// Created by kimhyungyu on 2022/10/08. +// + +import UIKit + +import SnapKit + +class UpgradeFlakeCVC: UICollectionViewCell { + + // MARK: - Properties + + private let upgradeFlakeImageView = UIImageView() + + // MARK: - View Life Cycle + + override init(frame: CGRect) { + super.init(frame: frame) + + setUI() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + + upgradeFlakeImageView.image = UIImage() + } + + // MARK: - Methods + + public func initCell(_ image: UIImage) { + upgradeFlakeImageView.image = image + } + + private func setUI() { + upgradeFlakeImageView.contentMode = .scaleAspectFill + } + + private func setLayout() { + contentView.addSubview(upgradeFlakeImageView) + + upgradeFlakeImageView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.centerY.equalTo(contentView.snp.centerY) + $0.height.equalTo(upgradeFlakeImageView.snp.width) + } + } +} diff --git a/Spark-iOS/Spark-iOS/Source/Cells/LifeTimeLine/LifeTimeLineCVC.swift b/Spark-iOS/Spark-iOS/Source/Cells/LifeTimeLine/LifeTimeLineCVC.swift new file mode 100644 index 00000000..fc480018 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/Cells/LifeTimeLine/LifeTimeLineCVC.swift @@ -0,0 +1,142 @@ +// +// LifeTimeLineCVC.swift +// Spark-iOS +// +// Created by 양수빈 on 2022/10/04. +// + +import UIKit + +import SnapKit + +class LifeTimeLineCVC: UICollectionViewCell { + + // MARK: - Properties + + private let titleLabel = UILabel() + private let subTitleLabel = UILabel() + private let firstProfileImageView = UIImageView() + private let secondProfileImageView = UIImageView() + private let dayLabel = UILabel() + private let divideLine = UIView() + + // MARK: - View Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + titleLabel.text = "" + subTitleLabel.text = "" + dayLabel.text = "" + firstProfileImageView.image = UIImage() + secondProfileImageView.image = UIImage() + firstProfileImageView.isHidden = true + secondProfileImageView.isHidden = true + } + + // MARK: - Custom Methods + + func initCell(title: String, + subTitle: String, + profilImg: [String], + day: String) { + titleLabel.text = title + subTitleLabel.text = subTitle + dayLabel.text = day + + if !profilImg.isEmpty { + updateProfileLayout() + let profileImageList = [firstProfileImageView, secondProfileImageView] + for index in 0.. String { switch state { case .day65: @@ -226,4 +227,117 @@ public class SparkFlake { return "" } } + + public func upgrade(_ leftDay: Int) -> UpgradeFlake { + switch state { + case .day65: + return 65 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .day62: + return 62 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .day58: + return 58 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .day32: + return 32 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .day6: + return 6 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .dDay: + return 0 >= leftDay ? afterUpgrade() : beforeUpgrade() + case .error: + return 0 > leftDay ? afterUpgrade() : beforeUpgrade() + } + } + + /// 업그레이드 전 팝업문구. + private func beforeUpgrade() -> UpgradeFlake { + switch state { + case .day65: + return UpgradeFlake(UIImage(), "", "") + case .day62: + return UpgradeFlake(UIImage(named: "property1DashSparkFlake2") ?? UIImage(), + """ + 3일을 달성하면 얻을 수 있어요! + """, + "Level 2") + case .day58: + return UpgradeFlake(UIImage(named: "property1DashSparkFlake3") ?? UIImage(), + """ + 7일을 달성하면 얻을 수 있어요! + """, + "Level 3") + case .day32: + return UpgradeFlake(UIImage(named: "property1DashSparkFlake4") ?? UIImage(), + """ + 33일을 달성하면 얻을 수 있어요! + """, + "Level 4") + case .day6: + return UpgradeFlake(UIImage(named: "property1DashSparkFlake5") ?? UIImage(), + """ + 마지막 7일 남았을 때 얻을 수 있어요! + """, + "Level 5") + case .dDay: + return UpgradeFlake(UIImage(named: "property1DashSparkFlake6") ?? UIImage(), + """ + 마지막 날에 얻을 수 있어요! + """, + "Level 6") + case .error: + return UpgradeFlake(UIImage(), + "", + "") + } + } + + /// 업그레이드 후 팝업문구. + private func afterUpgrade() -> UpgradeFlake { + switch state { + case .day65: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake1") ?? UIImage(), + """ + 새로운 습관 시작! + 첫 번째 불꽃 결정을 얻었어요. + """, + "Level 1") + case .day62: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake2") ?? UIImage(), + """ + 3일 동안 열심히 달렸네요! + 두 번째 불꽃 결정을 얻었어요. + """, + "Level 2") + case .day58: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake3") ?? UIImage(), + """ + 7일 동안 열심히 달렸네요! + 세 번째 불꽃 결정을 얻었어요. + """, + "Level 3") + case .day32: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake4") ?? UIImage(), + """ + 33일 동안 열심히 달렸네요! + 네 번째 불꽃 결정을 얻었어요. + """, + "Level 4") + case .day6: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake5") ?? UIImage(), + """ + 마지막 7일 남았네요! + 다섯 번째 불꽃 결정을 얻었어요. + """, + "Level 5") + case .dDay: + return UpgradeFlake(UIImage(named: "sparkFlakeSparkflake6") ?? UIImage(), + """ + 드디어 마지막 날이네요! + 여섯 번째 불꽃 결정을 얻었어요. + """, + "Level 6") + case .error: + return UpgradeFlake(UIImage(), + "", + "") + } + } } diff --git a/Spark-iOS/Spark-iOS/Source/Classes/UpgradeFlakeCarouselLayout.swift b/Spark-iOS/Spark-iOS/Source/Classes/UpgradeFlakeCarouselLayout.swift new file mode 100644 index 00000000..a35b010d --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/Classes/UpgradeFlakeCarouselLayout.swift @@ -0,0 +1,115 @@ +// +// UpgradeFlakeCarouselLayout.swift +// Spark-iOS +// +// Created by kimhyungyu on 2022/10/11. +// + +import UIKit + +class UpgradeFlakeCarouselLayout: UICollectionViewFlowLayout { + + public var sideItemScale: CGFloat = 80 / 120 + public var spacing: CGFloat = 30 + public var leftDay: Int? + + private var isSetup: Bool = false + + private let flakeSize: CGFloat = 120 + private let itemPadding: CGFloat = 53 + + override public func prepare() { + super.prepare() + if isSetup == false { + setupLayout() + isSetup = true + } + } + + private func setupLayout() { + guard let collectionView = self.collectionView else {return} + let collectionViewSize = collectionView.bounds.size + + self.itemSize = CGSize(width: flakeSize, height: itemPadding + flakeSize + itemPadding) + + let insets: CGFloat = (collectionViewSize.width - flakeSize) / 2 + self.sectionInset = UIEdgeInsets(top: 0, left: insets, bottom: collectionViewSize.height - (itemPadding + flakeSize + itemPadding), right: insets) + + self.minimumLineSpacing = collectionViewSize.width / 10 + self.scrollDirection = .horizontal + self.collectionView?.isPagingEnabled = false + + let index: CGFloat + guard let leftDay else { return } + + if 65 >= leftDay && leftDay > 62 { + index = 0 + } else if 62 >= leftDay && leftDay > 58 { + index = 1 + } else if 58 >= leftDay && leftDay > 32 { + index = 2 + } else if 32 >= leftDay && leftDay > 6 { + index = 3 + } else if 6 >= leftDay && leftDay > 0 { + index = 4 + } else { + index = 5 + } + + let contentOffset: CGPoint = CGPoint(x: index * (120 + collectionViewSize.width / 10), y: collectionView.frame.minY) + + DispatchQueue.main.async { + self.collectionView?.setContentOffset(contentOffset, animated: false) + } + } + + public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { + return true + } + + public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + guard let superAttributes = super.layoutAttributesForElements(in: rect), + let attributes = NSArray(array: superAttributes, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil } + + return attributes.map { self.transformLayoutAttributes(attributes: $0) } + } + + private func transformLayoutAttributes(attributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { + guard let collectionView = self.collectionView else { return attributes } + let collectionCenter = collectionView.frame.size.width / 2 + let contentOffset = collectionView.contentOffset.x + let center = attributes.center.x - contentOffset + + let maxDistance = self.itemSize.width + self.minimumLineSpacing + let distance = min(abs(collectionCenter - center), maxDistance) + let ratio = (maxDistance - distance) / maxDistance + let scale = ratio * (1 - sideItemScale) + sideItemScale + let transform = CATransform3DScale(CATransform3DIdentity, scale, scale, 1) + attributes.transform3D = transform + + return attributes + } + + // MARK: paging + + override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { + guard let collectionView = self.collectionView else { + let latestOffset = super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity) + return latestOffset + } + + let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: collectionView.frame.width, height: collectionView.frame.height) + let horizontalCenter = proposedContentOffset.x + collectionView.frame.width / 2 + guard let rectAttributes = super.layoutAttributesForElements(in: targetRect) else { return .zero } + var offsetAdjustment = CGFloat.greatestFiniteMagnitude + + for layoutAttributes in rectAttributes { + let itemHorizontalCenter = layoutAttributes.center.x + if (itemHorizontalCenter - horizontalCenter).magnitude < offsetAdjustment.magnitude { + offsetAdjustment = itemHorizontalCenter - horizontalCenter + } + } + + return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y) + } +} diff --git a/Spark-iOS/Spark-iOS/Source/Extensions/UIView+.swift b/Spark-iOS/Spark-iOS/Source/Extensions/UIView+.swift index 90354227..36d2ee25 100644 --- a/Spark-iOS/Spark-iOS/Source/Extensions/UIView+.swift +++ b/Spark-iOS/Spark-iOS/Source/Extensions/UIView+.swift @@ -14,12 +14,12 @@ extension UIView { } extension UIView { - func setGradient(color1: UIColor, color2: UIColor) { + func setGradient(color1: UIColor, color2: UIColor, startPoint: CGPoint = CGPoint(x: 1.0, y: 0.8), endPoint: CGPoint = CGPoint(x: 1.0, y: 0.0)) { let gradient: CAGradientLayer = CAGradientLayer() gradient.colors = [color1.cgColor, color2.cgColor] gradient.locations = [0.0, 1.0] - gradient.startPoint = CGPoint(x: 1.0, y: 0.8) - gradient.endPoint = CGPoint(x: 1.0, y: 0.0) + gradient.startPoint = startPoint + gradient.endPoint = endPoint gradient.frame = bounds layer.addSublayer(gradient) } diff --git a/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/HabitRoomDetail.swift b/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/HabitRoomDetail.swift index f5dcc85b..4ee4b0f6 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/HabitRoomDetail.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/HabitRoomDetail.swift @@ -15,13 +15,13 @@ struct HabitRoomDetail: Codable { let moment, purpose: String? let leftDay, life: Int let fromStart: Bool - let lifeDeductionCount: Int let myRecord: MyRecord let otherRecords: [OtherRecord?] + let isTermNew, isTimelineNew: Bool enum CodingKeys: String, CodingKey { case roomID = "roomId" - case roomName, startDate, endDate, moment, purpose, leftDay, life, fromStart, myRecord, otherRecords, lifeDeductionCount + case roomName, startDate, endDate, moment, purpose, leftDay, life, fromStart, myRecord, otherRecords, isTermNew, isTimelineNew } } diff --git a/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/TimeLine.swift b/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/TimeLine.swift new file mode 100644 index 00000000..596b7f65 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/NetworkModels/Room/TimeLine.swift @@ -0,0 +1,21 @@ +// +// TimeLine.swift +// Spark-iOS +// +// Created by 양수빈 on 2022/10/07. +// + +import Foundation + +// MARK: - Timelines +struct Timelines: Codable { + let timelines: [Timeline] +} + +// MARK: - Timeline +struct Timeline: Codable { + let title, content: String + let profiles: [String]? + let day: String + let isNew: Bool +} diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Feed/FeedAPI.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Feed/FeedAPI.swift index a7614f80..79420e6f 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Feed/FeedAPI.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Feed/FeedAPI.swift @@ -29,7 +29,7 @@ public class FeedAPI { case .failure(let err): print(err) } - } + }.doCleanRequest(from: .feed) } private func judgeFeedFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Home/HomeAPI.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Home/HomeAPI.swift index bb02f43b..f080a759 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Home/HomeAPI.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Home/HomeAPI.swift @@ -28,7 +28,7 @@ public class HomeAPI { case .failure(let err): print(err) } - } + }.doCleanRequest(from: .home) } private func judgeHabitRoomFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/MyRoom/MyRoomAPI.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/MyRoom/MyRoomAPI.swift index b7ac84ab..7b784eab 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/MyRoom/MyRoomAPI.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/MyRoom/MyRoomAPI.swift @@ -16,8 +16,8 @@ public class MyRoomAPI { self.userProvider = MoyaProvider(plugins: [MoyaLoggerPlugin(viewController: viewController)]) } - func myRoomFetch(roomType: String, lastID: Int, size: Int, completion: @escaping (NetworkResult) -> Void) { - userProvider.request(.myRoomFetch(roomType: roomType, lastID: lastID, size: size)) { (result) in + func myRoomFetch(roomType: String, lastID: Int, size: Int, needClean: Bool = false, completion: @escaping (NetworkResult) -> Void) { + let cancellable = userProvider.request(.myRoomFetch(roomType: roomType, lastID: lastID, size: size)) { (result) in switch result { case .success(let response): let statusCode = response.statusCode @@ -30,6 +30,11 @@ public class MyRoomAPI { print(err) } } + if needClean { + cancellable.doCleanRequest(from: .storage) + } else { + cancellable.store(from: .storage) + } } private func judgeMyRoomFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Notice/NoticeAPI.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Notice/NoticeAPI.swift index 76ba7fea..fc1e24f3 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Notice/NoticeAPI.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Notice/NoticeAPI.swift @@ -29,7 +29,7 @@ public class NoticeAPI { case . failure(let err): print(err) } - } + }.doCleanRequest(from: .notice) } private func judgeActiveFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { @@ -65,7 +65,7 @@ public class NoticeAPI { case . failure(let err): print(err) } - } + }.doCleanRequest(from: .notice) } private func judgeServiceFetchStatus(by statusCode: Int, _ data: Data) -> NetworkResult { @@ -99,7 +99,7 @@ public class NoticeAPI { case .failure(let err): print(err) } - } + }.doCleanRequest(from: .notice) } func serviceRead(completion: @escaping(NetworkResult) -> Void) { @@ -113,7 +113,7 @@ public class NoticeAPI { case .failure(let err): print(err) } - } + }.doCleanRequest(from: .notice) } private func judgeStatus(by statusCode: Int, _ data: Data) -> NetworkResult { diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/MoyaLoggerPlugin.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/MoyaLoggerPlugin.swift index b7a041ca..5a763c62 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/MoyaLoggerPlugin.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/MoyaLoggerPlugin.swift @@ -63,6 +63,8 @@ final class MoyaLoggerPlugin: PluginType { } func onFail(_ error: MoyaError) { + guard let isExplicitlyCancelled = error.asAFError?.isExplicitlyCancelledError, + !isExplicitlyCancelled else { return } var log = "------------------- 네트워크 오류" log.append("(에러코드: \(error.errorCode)) -------------------\n") log.append("3️⃣ \(error.failureReason ?? error.errorDescription ?? "unknown error")\n") diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/RequestContainer.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/RequestContainer.swift new file mode 100644 index 00000000..e40b7775 --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Plugin/RequestContainer.swift @@ -0,0 +1,52 @@ +// +// RequestContainer.swift +// Spark-iOS +// +// Created by Junho Lee on 2022/10/05. +// + +import Foundation + +import Moya + +typealias APIType = RequestContainer.CancellableAPIType + +class RequestContainer { + + static let shared = RequestContainer() + + enum CancellableAPIType: CaseIterable { + case notice + case home + case storage + case feed + } + + private var requestDictionary: [CancellableAPIType: [Cancellable]] = [:] + + private init() { + CancellableAPIType.allCases.forEach { + requestDictionary[$0] = [] as [Cancellable] + } + } + + public func doCleanRequest(request: Cancellable, key: APIType) { + requestDictionary[key]?.forEach { $0.cancel() } + requestDictionary[key]?.removeAll() + requestDictionary[key]?.append(request) + } + + public func store(request: Cancellable, key: APIType) { + requestDictionary[key]?.append(request) + } +} + +extension Cancellable { + func doCleanRequest(from apiType: APIType) { + RequestContainer.shared.doCleanRequest(request: self, key: apiType) + } + + func store(from apiType: APIType) { + RequestContainer.shared.store(request: self, key: apiType) + } +} diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomAPI.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomAPI.swift index 147dfe13..4527f7c5 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomAPI.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomAPI.swift @@ -344,4 +344,35 @@ public class RoomAPI { } } } + + func fetchTimeline(roomID: Int, completion: @escaping(NetworkResult) -> Void) { + roomProvider.request(.timeLineFetch(roomID: roomID)) { result in + switch result { + case .success(let response): + let statusCode = response.statusCode + let data = response.data + let networkResult = self.judgeFetchTimelineStatus(by: statusCode, data) + completion(networkResult) + case .failure(let err): + print(err) + } + } + } + + private func judgeFetchTimelineStatus(by statusCode: Int, _ data: Data) -> NetworkResult { + let decoder = JSONDecoder() + guard let decodedData = try? decoder.decode(GenericResponse.self, from: data) + else { return .pathErr } + + switch statusCode { + case 200: + return .success(decodedData.data ?? "None-Data") + case 400..<500: + return .requestErr(decodedData.message) + case 500: + return .serverErr + default: + return .networkFail + } + } } diff --git a/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomService.swift b/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomService.swift index 556accf5..60b92f51 100644 --- a/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomService.swift +++ b/Spark-iOS/Spark-iOS/Source/NetworkServices/Room/RoomService.swift @@ -24,6 +24,7 @@ enum RoomService { case deleteWaitingRoom(roomID: Int) case leaveRoom(roomID: Int) case readRoom(roomID: Int) + case timeLineFetch(roomID: Int) } extension RoomService: TargetType { @@ -61,6 +62,8 @@ extension RoomService: TargetType { return "/room/\(roomID)/out" case .readRoom(let roomID): return "/room/\(roomID)/read" + case .timeLineFetch(let roomID): + return "/room/\(roomID)/timeline" } } @@ -94,6 +97,8 @@ extension RoomService: TargetType { return .delete case .readRoom: return .patch + case .timeLineFetch: + return .get } } @@ -135,7 +140,7 @@ extension RoomService: TargetType { return .requestParameters(parameters: ["roomId": roomID], encoding: JSONEncoding.default) case .leaveRoom(let roomID): return .requestParameters(parameters: ["roomId": roomID], encoding: JSONEncoding.default) - case .readRoom: + case .readRoom, .timeLineFetch: return .requestPlain } } @@ -168,7 +173,7 @@ extension RoomService: TargetType { return Const.Header.authorizationHeader() case .leaveRoom: return Const.Header.authorizationHeader() - case .readRoom: + case .readRoom, .timeLineFetch: return Const.Header.authorizationHeader() } } diff --git a/Spark-iOS/Spark-iOS/Source/ViewControllers/Dialogue/UpgradeFlakeDialogueVC.swift b/Spark-iOS/Spark-iOS/Source/ViewControllers/Dialogue/UpgradeFlakeDialogueVC.swift new file mode 100644 index 00000000..35695ebe --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/ViewControllers/Dialogue/UpgradeFlakeDialogueVC.swift @@ -0,0 +1,161 @@ +// +// UpgradeFlakeDialogueVC.swift +// Spark-iOS +// +// Created by kimhyungyu on 2022/10/08. +// + +import UIKit + +class UpgradeFlakeDialogueVC: UIViewController { + + // MARK: - Properties + + private let sparkFlakes: [SparkFlake] = [ + SparkFlake(leftDay: 65), + SparkFlake(leftDay: 62), + SparkFlake(leftDay: 58), + SparkFlake(leftDay: 32), + SparkFlake(leftDay: 6), + SparkFlake(leftDay: 0) + ] + private var sparkUpgradeFlakes: [UpgradeFlake] = [] + private var impactFeedbackGenerator: UIImpactFeedbackGenerator? + + public var leftDay: Int? + + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var levelTitleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + @IBOutlet weak var backgroundView: UIView! + @IBOutlet weak var checkButton: UIButton! + @IBOutlet weak var leftGradientView: UIView! + @IBOutlet weak var rightGradientView: UIView! + + private let collectionViewFlowlayout = UICollectionViewFlowLayout() + + // MARK: - View Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + + setSparkFlakes() + setUI() + addTargets() + setDelegate() + setCollectionView() + setImpactFeedbackGenerator() + setGradientLayer() + } +} + +// MARK: - Extensions + +extension UpgradeFlakeDialogueVC { + private func setUI() { + view.backgroundColor = .sparkBlack.withAlphaComponent(0.8) + + collectionView.backgroundColor = .clear + + backgroundView.backgroundColor = .sparkWhite + + levelTitleLabel.textColor = .sparkPinkred + levelTitleLabel.font = .enMediumItatlicFont(ofSize: 24) + + subtitleLabel.tintColor = .sparkDeepGray + subtitleLabel.font = .p1TitleLight + subtitleLabel.textAlignment = .center + subtitleLabel.numberOfLines = 2 + + checkButton.setTitle("확인했어요", for: .normal) + checkButton.setTitleColor(.sparkWhite, for: .normal) + checkButton.backgroundColor = .sparkBlack + checkButton.titleLabel?.font = .btn1Default + + levelTitleLabel.text = sparkUpgradeFlakes[0].levelText + subtitleLabel.text = sparkUpgradeFlakes[0].upgradeText + + leftGradientView.backgroundColor = .clear + rightGradientView.backgroundColor = .clear + + leftGradientView.isUserInteractionEnabled = false + rightGradientView.isUserInteractionEnabled = false + } + + private func setGradientLayer() { + leftGradientView.setGradient(color1: .init(white: 1, alpha: 1), color2: .init(white: 1, alpha: 0), startPoint: CGPoint(x: 0.0, y: 0.5), endPoint: CGPoint(x: 1.0, y: 0.5)) + rightGradientView.setGradient(color1: .init(white: 1, alpha: 1), color2: .init(white: 1, alpha: 0), startPoint: CGPoint(x: 1.0, y: 0.5), endPoint: CGPoint(x: 0.0, y: 0.5)) + } + + private func addTargets() { + checkButton.addTarget(self, action: #selector(touchCheckButton), for: .touchUpInside) + } + + private func setDelegate() { + collectionView.delegate = self + collectionView.dataSource = self + } + + private func setCollectionView() { + collectionView.register(UpgradeFlakeCVC.self, forCellWithReuseIdentifier: Const.Cell.Identifier.upgradeFlakeCVC) + + collectionView.showsHorizontalScrollIndicator = false + collectionView.backgroundColor = .clear + + let collectionViewLayout = UpgradeFlakeCarouselLayout() + collectionViewLayout.leftDay = self.leftDay + + collectionView.collectionViewLayout = collectionViewLayout + } + + private func setSparkFlakes() { + sparkFlakes.forEach { sparkFlake in + sparkUpgradeFlakes.append(sparkFlake.upgrade(leftDay ?? -1)) + } + } + + private func setImpactFeedbackGenerator() { + impactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light) + impactFeedbackGenerator?.prepare() + } + + // MARK: - @objc Methods + + @objc + private func touchCheckButton() { + dismiss(animated: true) + } +} + +// MARK: - UICollectionViewDelegate + +extension UpgradeFlakeDialogueVC: UICollectionViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let contentOffsetX: CGFloat = scrollView.contentOffset.x + let index: Int = Int(round(contentOffsetX / (120 + scrollView.frame.width / 10))) + + if sparkUpgradeFlakes.count > index && index >= 0 { + if levelTitleLabel.text != sparkUpgradeFlakes[index].levelText { + impactFeedbackGenerator?.impactOccurred() + } + levelTitleLabel.text = sparkUpgradeFlakes[index].levelText + subtitleLabel.text = sparkUpgradeFlakes[index].upgradeText + } + } +} + +// MARK: - UICollectionViewDataSource + +extension UpgradeFlakeDialogueVC: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return sparkUpgradeFlakes.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Const.Cell.Identifier.upgradeFlakeCVC, for: indexPath) as? UpgradeFlakeCVC else { return UICollectionViewCell() } + + cell.initCell(sparkUpgradeFlakes[indexPath.item].flakeImage) + + return cell + } +} diff --git a/Spark-iOS/Spark-iOS/Source/ViewControllers/HabitRoom/HabitRoomVC.swift b/Spark-iOS/Spark-iOS/Source/ViewControllers/HabitRoom/HabitRoomVC.swift index 20828acb..ba111c66 100644 --- a/Spark-iOS/Spark-iOS/Source/ViewControllers/HabitRoom/HabitRoomVC.swift +++ b/Spark-iOS/Spark-iOS/Source/ViewControllers/HabitRoom/HabitRoomVC.swift @@ -20,6 +20,7 @@ class HabitRoomVC: UIViewController { private let picker = UIImagePickerController() private var imageContainer = UIImage() + private lazy var tapGesture = UITapGestureRecognizer(target: self, action: #selector(presentLifeTimeLineVC)) private lazy var loadingBgView = UIView() private lazy var loadingView = AnimationView(name: Const.Lottie.Name.loading) @@ -40,12 +41,14 @@ class HabitRoomVC: UIViewController { @IBOutlet weak var bgView: UIView! @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var goalLabel: UILabel! + @IBOutlet weak var lifeStackView: UIStackView! @IBOutlet weak var firstLifeImage: UIImageView! @IBOutlet weak var secondLifeImage: UIImageView! @IBOutlet weak var thirdLifeImage: UIImageView! @IBOutlet weak var mainCollectionView: UICollectionView! @IBOutlet weak var authButton: UIButton! @IBOutlet weak var gradationView: UIView! + @IBOutlet weak var newTimeLine: UIImageView! // MARK: - View Life Cycle @@ -154,6 +157,9 @@ extension HabitRoomVC { authButton.isEnabled = false gradationView.setHabitGradient() + newTimeLine.image = UIImage(named: "icBadgeNew") + + self.lifeStackView.addGestureRecognizer(tapGesture) } private func setTabBar() { @@ -219,6 +225,8 @@ extension HabitRoomVC { } } + newTimeLine.isHidden = habitRoomDetail.isTimelineNew ? false : true + // 오늘의 인증 버튼 세팅 if leftDay == 66 { authButton.isEnabled = false @@ -270,25 +278,30 @@ extension HabitRoomVC { UserDefaultsManager.checkHabitRoomGuide = true guard let guideVC = UIStoryboard(name: Const.Storyboard.Name.habitRoomGuide, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.habitRoomGuide) as? HabitRoomGuideVC else { return } guideVC.dismissClousure = { - self.setLifeDiminishDialogue() + self.presentToUpgradeFlakeDialogueVC() } guideVC.modalPresentationStyle = .overFullScreen guideVC.modalTransitionStyle = .crossDissolve self.present(guideVC, animated: true, completion: nil) } else { - setLifeDiminishDialogue() + self.presentToUpgradeFlakeDialogueVC() } } - private func setLifeDiminishDialogue() { - if let lifeCount = habitRoomDetail?.lifeDeductionCount, lifeCount != 0 { - guard let lifeVC = UIStoryboard(name: Const.Storyboard.Name.lifeDiminishDialogue, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.lifeDiminishDialogue) as? LifeDiminishDialogueVC else { return } - lifeVC.diminishedLifeCount = lifeCount - lifeVC.modalPresentationStyle = .overFullScreen - lifeVC.modalTransitionStyle = .crossDissolve - - self.present(lifeVC, animated: true, completion: nil) + private func presentToUpgradeFlakeDialogueVC() { + if let leftDay = habitRoomDetail?.leftDay, + let isTermNew = habitRoomDetail?.isTermNew { + if (leftDay == 65 || leftDay == 62 || leftDay == 58 || leftDay == 32 || leftDay == 6 || leftDay == 0) && isTermNew { + guard let upgradeFlakeDialogueVC = UIStoryboard(name: Const.Storyboard.Name.UpgradeFlakeDialogue, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.UpgradeFlakeDialogue) as? UpgradeFlakeDialogueVC else { return } + + upgradeFlakeDialogueVC.leftDay = habitRoomDetail?.leftDay + upgradeFlakeDialogueVC.modalPresentationStyle = .overFullScreen + upgradeFlakeDialogueVC + .modalTransitionStyle = .crossDissolve + + present(upgradeFlakeDialogueVC, animated: true) + } } } @@ -370,6 +383,19 @@ extension HabitRoomVC { private func presentToMoreAlert() { let alert = SparkActionSheet() + + alert.addAction(SparkAction("불꽃 결정 레벨") { + self.dismiss(animated: true) { + guard let nextVC = UIStoryboard(name: Const.Storyboard.Name.UpgradeFlakeDialogue, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.UpgradeFlakeDialogue) as? UpgradeFlakeDialogueVC else { return } + + nextVC.modalPresentationStyle = .overFullScreen + nextVC.modalTransitionStyle = .crossDissolve + nextVC.leftDay = self.habitRoomDetail?.leftDay + + self.present(nextVC, animated: true) + } + }) + alert.addAction(SparkAction("나의 목표 관리", titleType: .blackMediumTitle, handler: { self.dismiss(animated: true) { guard let nextVC = UIStoryboard(name: Const.Storyboard.Name.goalWriting, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.goalWriting) as? GoalWritingVC else { return } @@ -426,6 +452,14 @@ extension HabitRoomVC { ]) } + private func timelineTracking() { + if newTimeLine.isHidden { + Analytics.logEvent(Tracking.Select.clickTimeline, parameters: nil) + } else { + Analytics.logEvent(Tracking.Select.clickTimelineWithNew, parameters: nil) + } + } + // MARK: - Screen Change private func popToHomeVC() { @@ -449,6 +483,20 @@ extension HabitRoomVC { self.refreshControl.endRefreshing() } } + + @objc + private func presentLifeTimeLineVC() { + guard let timelineVC = UIStoryboard(name: Const.Storyboard.Name.lifeTimeLine, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.lifeTimeLine) as? LifeTimeLineVC else { return } + + timelineVC.roomID = self.roomID + timelineVC.modalPresentationStyle = .overFullScreen + timelineVC.modalTransitionStyle = .crossDissolve + + self.present(timelineVC, animated: true) { + self.timelineTracking() + self.newTimeLine.isHidden = true + } + } } // MARK: - UIImagePickerDelegate diff --git a/Spark-iOS/Spark-iOS/Source/ViewControllers/LifeTimeLine/LifeTimeLineVC.swift b/Spark-iOS/Spark-iOS/Source/ViewControllers/LifeTimeLine/LifeTimeLineVC.swift new file mode 100644 index 00000000..85d7a2ce --- /dev/null +++ b/Spark-iOS/Spark-iOS/Source/ViewControllers/LifeTimeLine/LifeTimeLineVC.swift @@ -0,0 +1,169 @@ +// +// LifeTimeLineVC.swift +// Spark-iOS +// +// Created by 양수빈 on 2022/10/03. +// + +import UIKit + +import SnapKit + +class LifeTimeLineVC: UIViewController { + + // MARK: - Properties + + private let titleLabel = UILabel() + private let collectionViewFlowlayout = UICollectionViewFlowLayout() + private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewFlowlayout) + private let tapGestureRecognizer = UITapGestureRecognizer() + private var timelineList: [Timeline] = [] + var roomID: Int? + + // MARK: - Life Cycles + + override func viewDidLoad() { + super.viewDidLoad() + + setUI() + setLayout() + setDelegate() + setCollectionView() + setAddTarget() + setGestureRecognizer() + getTimelineFetchWithAPI(roomID: self.roomID ?? 0) + } + + // MARK: - Custom Methods + + private func setUI() { + view.backgroundColor = .sparkBlack.withAlphaComponent(0.8) + + collectionView.backgroundColor = .white + } + + private func setLayout() { + view.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.leading.trailing.bottom.equalToSuperview() + make.height.equalTo(UIScreen.main.bounds.width * 1.3) + } + } + + private func setCollectionView() { + collectionView.showsVerticalScrollIndicator = false + collectionView.backgroundColor = .white + + collectionView.register(LifeTimeLineCVC.self, forCellWithReuseIdentifier: Const.Cell.Identifier.lifeTimeLineCVC) + collectionView.register(LifeTimeLineHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: Const.Cell.Identifier.lifeTimeLineHeaderView) + + collectionViewFlowlayout.sectionHeadersPinToVisibleBounds = true + } + + private func setDelegate() { + collectionView.delegate = self + collectionView.dataSource = self + tapGestureRecognizer.delegate = self + } + + private func setAddTarget() { + tapGestureRecognizer.addTarget(self, action: #selector(dismissToHabitRoom)) + } + + private func setGestureRecognizer() { + view.addGestureRecognizer(tapGestureRecognizer) + } + + // MARK: - @objc + + @objc + private func dismissToHabitRoom() { + self.dismiss(animated: true) + } +} + +// MARK: - UICollectionViewDelegate + +extension LifeTimeLineVC: UICollectionViewDelegate { + +} + +// MARK: - UICollectionViewDelegateFlowLayout + +extension LifeTimeLineVC: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let width: CGFloat = UIScreen.main.bounds.width + let estimatedHeight: CGFloat = width*107/375 + + let dummyCell = LifeTimeLineCVC(frame: CGRect(x: 0, y: 0, width: width, height: estimatedHeight)) + let data = timelineList[indexPath.row] + dummyCell.initCell(title: data.title, subTitle: data.content, profilImg: data.profiles ?? [], day: data.day) + dummyCell.layoutIfNeeded() + let estimatedSize = dummyCell.systemLayoutSizeFitting(CGSize(width: width, height: estimatedHeight)) + + return CGSize(width: width, height: estimatedSize.height) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return 0 + } +} + +// MARK: - UICollectionViewDataSource + +extension LifeTimeLineVC: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return timelineList.count + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: Const.Cell.Identifier.lifeTimeLineHeaderView, for: indexPath) as? LifeTimeLineHeaderView else { return UICollectionReusableView() } + return header + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { + let width = UIScreen.main.bounds.width + let height = width*80/375 + return CGSize(width: width, height: height) + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Const.Cell.Identifier.lifeTimeLineCVC, for: indexPath) as? LifeTimeLineCVC else { return UICollectionViewCell() } + let data = timelineList[indexPath.row] + cell.initCell(title: data.title, subTitle: data.content, profilImg: data.profiles ?? [], day: data.day) + return cell + } +} + +// MARK: - UIGestureRecognizerDelegate + +extension LifeTimeLineVC: UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { + return (touch.view is UICollectionViewCell) || (touch.view is UICollectionReusableView) ? false : true + } +} + +// MARK: - Network + +extension LifeTimeLineVC { + private func getTimelineFetchWithAPI(roomID: Int) { + RoomAPI(viewController: self).fetchTimeline(roomID: roomID) { response in + switch response { + case .success(let data): + if let timelines = data as? Timelines { + self.timelineList = timelines.timelines + self.collectionView.reloadData() + } + case .requestErr(let message): + print("getTimelineFetchWithAPI - requestErr: \(message)") + case .pathErr: + print("getTimelineFetchWithAPI - pathErr") + case .serverErr: + print("getTimelineFetchWithAPI - serverErr") + case .networkFail: + print("getTimelineFetchWithAPI - networkFail") + } + } + } +} diff --git a/Spark-iOS/Spark-iOS/Source/ViewControllers/Notice/NoticeVC.swift b/Spark-iOS/Spark-iOS/Source/ViewControllers/Notice/NoticeVC.swift index 8032fe31..0ecb047e 100644 --- a/Spark-iOS/Spark-iOS/Source/ViewControllers/Notice/NoticeVC.swift +++ b/Spark-iOS/Spark-iOS/Source/ViewControllers/Notice/NoticeVC.swift @@ -150,14 +150,12 @@ class NoticeVC: UIViewController { private func bindButton() { activeButton.rx.tap - .throttle(.seconds(3), latest: false, scheduler: MainScheduler.instance) .subscribe(onNext: { self.touchActiveButton() }) .disposed(by: disposeBag) serviceButton.rx.tap - .throttle(.seconds(3), latest: false, scheduler: MainScheduler.instance) .subscribe(onNext: { self.touchServiceButton() }) @@ -202,7 +200,6 @@ class NoticeVC: UIViewController { makeDrawAboveButton(button: activeButton) activeLastID = -1 - activeList.removeAll() let group = DispatchGroup() @@ -234,7 +231,6 @@ class NoticeVC: UIViewController { makeDrawAboveButton(button: serviceButton) serviceLastID = -1 - serviceList.removeAll() let group = DispatchGroup() @@ -361,6 +357,7 @@ extension NoticeVC { case .success(let data): if let active = data as? ActiveNotice { self.newService = active.newService + self.activeList.removeAll() self.activeList.append(contentsOf: active.notices) if self.activeList.isEmpty { self.setEmptyView() @@ -387,6 +384,7 @@ extension NoticeVC { case .success(let data): if let service = data as? ServiceNotice { self.newActive = service.newActive + self.serviceList.removeAll() self.serviceList.append(contentsOf: service.notices) if self.serviceList.isEmpty { self.setEmptyView() diff --git a/Spark-iOS/Spark-iOS/Source/ViewControllers/TabBar/StorageVC.swift b/Spark-iOS/Spark-iOS/Source/ViewControllers/TabBar/StorageVC.swift index 947624f2..40d04333 100644 --- a/Spark-iOS/Spark-iOS/Source/ViewControllers/TabBar/StorageVC.swift +++ b/Spark-iOS/Spark-iOS/Source/ViewControllers/TabBar/StorageVC.swift @@ -103,14 +103,15 @@ class StorageVC: UIViewController { let group = DispatchGroup.init() group.enter() getOnGoingRoomWithAPI(lastID: self.onGoingRoomLastID, size: self.myRoomCountSize) { - group.leave() - } - group.enter() - getFailRoomWithAPI(lastID: self.failRoomLastID, size: self.myRoomCountSize) { - group.leave() - } - group.enter() - getCompleteRoomWithAPI(lastID: self.completeRoomLastID, size: self.myRoomCountSize) { + group.enter() + self.getFailRoomWithAPI(lastID: self.failRoomLastID, size: self.myRoomCountSize) { + group.leave() + } + group.enter() + self.getCompleteRoomWithAPI(lastID: self.completeRoomLastID, size: self.myRoomCountSize) { + group.leave() + } + group.leave() } group.notify(queue: .main) { @@ -594,7 +595,7 @@ extension StorageVC: UICollectionViewDelegate, UICollectionViewDataSource { extension StorageVC { func getOnGoingRoomWithAPI(lastID: Int, size: Int, completion: @escaping () -> Void) { - MyRoomAPI(viewController: self).myRoomFetch(roomType: "ONGOING", lastID: lastID, size: size) { response in + MyRoomAPI(viewController: self).myRoomFetch(roomType: "ONGOING", lastID: lastID, size: size, needClean: true) { response in switch response { case .success(let data): if let myRoom = data as? MyRoom { diff --git a/Spark-iOS/fastlane/Appfile b/Spark-iOS/fastlane/Appfile new file mode 100644 index 00000000..81869dc8 --- /dev/null +++ b/Spark-iOS/fastlane/Appfile @@ -0,0 +1,8 @@ +app_identifier("com.TeamSparker.Spark") # The bundle identifier of your app +apple_id("ypsophila97@icloud.com") # Your Apple Developer Portal username + +itc_team_id("119044239") # App Store Connect Team ID +team_id("T8C9SSEX5G") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/Spark-iOS/fastlane/Deliverfile b/Spark-iOS/fastlane/Deliverfile new file mode 100644 index 00000000..74739f74 --- /dev/null +++ b/Spark-iOS/fastlane/Deliverfile @@ -0,0 +1,3 @@ +# The Deliverfile allows you to store various App Store Connect metadata +# For more information, check out the docs +# https://docs.fastlane.tools/actions/deliver/ diff --git a/Spark-iOS/fastlane/Fastfile b/Spark-iOS/fastlane/Fastfile new file mode 100644 index 00000000..d42ed094 --- /dev/null +++ b/Spark-iOS/fastlane/Fastfile @@ -0,0 +1,122 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + get_certificates + get_provisioning_profile + increment_build_number(xcodeproj: "Spark-iOS.xcodeproj") + build_app( + workspace: "Spark-iOS.xcworkspace", + scheme: "Spark-beta", + export_method: "app-store", + export_options: { + provisioningProfiles: { + "com.TeamSparker.Spark" => "Spark AppStore", + "com.TeamSparker.Spark.SparkNotificationService" => "SparkNotificationService AppStore" + } + } + ) + upload_to_testflight( + api_key_path: "fastlane/key.json", + distribute_external: true, + groups: ["SparkBetaTestGroup"], + changelog: "- 개발자 QA 중 Level 1 의 spark flake 이미지가 보이지 않아서 수정하였습니다." + ) + version = get_version_number( + xcodeproj: "Spark-iOS.xcodeproj", + target: "Spark-iOS" + ) + build = get_build_number + slack( + username: "항상건강해야한다콩이", + icon_url: "https://user-images.githubusercontent.com/69136340/194049016-4b1f747f-99ed-4a14-a28d-2ed9a26fe0e3.png", + message: "성공적으로 TestFlight 에 등록되었습니다!🔥", + slack_url: "https://hooks.slack.com/services/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", + payload: { + "Version": version + "(" + build + ")" + } + ) + end + + desc "Push a new release build to the App Store" + lane :release do |options| + if options[:version] + get_certificates + get_provisioning_profile + increment_build_number(xcodeproj: "Spark-iOS.xcodeproj") + increment_version_number( + version_number: options[:version], + xcodeproj: "Spark-iOS.xcodeproj" + ) + build_app( + workspace: "Spark-iOS.xcworkspace", + scheme: "Spark-beta", + export_method: "app-store", + export_options: { + provisioningProfiles: { + "com.TeamSparker.Spark" => "Spark AppStore", + "com.TeamSparker.Spark.SparkNotificationService" => "SparkNotificationService AppStore" + } + } + ) + upload_to_app_store( + api_key_path: "fastlane/key.json", + skip_metadata: false, + skip_screenshots: true, + submit_for_review: true, + automatic_release: false, + force: true, + precheck_include_in_app_purchases: false, + submission_information: { add_id_info_uses_idfa: false } + ) + version = get_version_number( + xcodeproj: "Spark-iOS.xcodeproj", + target: "Spark-iOS" + ) + build = get_build_number + slack( + username: "항상건강해야한다콩이", + icon_url: "https://user-images.githubusercontent.com/69136340/194049016-4b1f747f-99ed-4a14-a28d-2ed9a26fe0e3.png", + message: "성공적으로 앱을 등록했습니다!💫", + slack_url: "https://hooks.slack.com/services/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", + payload: { + "Version": version + "(" + build + ")" + } + ) + end + end + + error do |lane, exception, options| + version = get_version_number( + xcodeproj: "Spark-iOS.xcodeproj", + target: "Spark-iOS" + ) + build = get_build_number + slack( + username: "항상건강해야한다콩이", + icon_url: "https://user-images.githubusercontent.com/69136340/194049016-4b1f747f-99ed-4a14-a28d-2ed9a26fe0e3.png", + message: "에러 발생!!! 발생!!🚨 : #{exception}", + success: false, + slack_url: "https://hooks.slack.com/services/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", + payload: { + "Version": version + "(" + build + ")" + } + ) + end +end diff --git a/Spark-iOS/fastlane/README.md b/Spark-iOS/fastlane/README.md new file mode 100644 index 00000000..72db873e --- /dev/null +++ b/Spark-iOS/fastlane/README.md @@ -0,0 +1,40 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios beta + +```sh +[bundle exec] fastlane ios beta +``` + +Push a new beta build to TestFlight + +### ios release + +```sh +[bundle exec] fastlane ios release +``` + +Push a new release build to the App Store + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).