diff --git a/Modules/App/App.entitlements b/Modules/App/App.entitlements new file mode 100644 index 00000000..a812db50 --- /dev/null +++ b/Modules/App/App.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.applesignin + + Default + + + diff --git a/Modules/App/App.xcodeproj/project.pbxproj b/Modules/App/App.xcodeproj/project.pbxproj index ef1b0dbb..4b62f2b8 100644 --- a/Modules/App/App.xcodeproj/project.pbxproj +++ b/Modules/App/App.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 55; + objectVersion = 60; objects = { /* Begin PBXBuildFile section */ + 00907C0C40B6C87BF82F1310 /* Promises_Promises.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F260309AD89688149AD615B2 /* Promises_Promises.bundle */; }; 00DB7DDCAF9469B0E81AC51B /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF021344F16945968371F691 /* NetworkKit.framework */; }; 0263D464A0060067F7C699E4 /* Firebase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F44EDE91A79696F3FBBFE16 /* Firebase.framework */; }; 03C31E734B72B29FEA1E066D /* SubscribeDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6403E5FCF0FC81B2922FA5E5 /* SubscribeDomain.framework */; }; @@ -16,58 +17,62 @@ 0F8046F0C49F3F5E27E44E16 /* MyPageRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = F29FA5D3B936B1F16BFF75CD /* MyPageRoute.swift */; }; 100701B9BFA1DFBDD27D1BF0 /* GoogleAppMeasurementTarget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FBAB840F54EFA40D6A143F7F /* GoogleAppMeasurementTarget.framework */; }; 151CD1C7340B25AF05B5F1F3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4459AC440B063044813E979E /* Security.framework */; }; + 16B06C4306001183D71A4F9B /* GoogleUtilities_GoogleUtilities_Environment.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 54C16966143C68BB125F5D74 /* GoogleUtilities_GoogleUtilities_Environment.bundle */; }; 19AA6DB30A90955617F9B7FD /* BookmarkInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E72FF74C328526DB94E50010 /* BookmarkInterface.framework */; }; 1ADFB6F0C0F33AE51F6793BD /* FirebaseInstallations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EDD3D57F65917DB1A07B052 /* FirebaseInstallations.framework */; }; 1BC5B98AD386E5E8F84A45D6 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB40F3B3D8E2DCB2AC3C9605 /* Shared.framework */; }; 1C97140162D8A52649A79034 /* DatabaseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20472DE96208EAF694E16719 /* DatabaseKit.framework */; }; 1DAF338EC3091F9B6BB61A11 /* Detail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FB9E693CAE8686756749690 /* Detail.framework */; }; 1DBB02B22B48ED08B3B93563 /* HomeStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED1B83ED44A88938979E608 /* HomeStack.swift */; }; - 232800970AFA0DEF4018B1FB /* GoogleUtilities_Environment.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 49A8F44173AE773538037143 /* GoogleUtilities_Environment.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 2050CD74997BC9376C6B205A /* Firebase_FirebaseCoreInternal.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EFE2491E32CAC50F848EF255 /* Firebase_FirebaseCoreInternal.bundle */; }; + 214B61C781E79DEA591F1751 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 4EB562E78DEEF2FAC4EDDEBF /* DesignSystem_DesignSystem.bundle */; }; + 21A01C75053E1F862D201926 /* Firebase_FirebaseCore.bundle in Resources */ = {isa = PBXBuildFile; fileRef = AD69D01DF7849A86F4C17EF3 /* Firebase_FirebaseCore.bundle */; }; + 221E79D0C4EE7C160F28AC4E /* GoogleUtilities_GoogleUtilities_Logger.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FC8C9536B1CA387C5E5002E9 /* GoogleUtilities_GoogleUtilities_Logger.bundle */; }; 24B03597CF38DDDB6A79FECE /* GoogleUtilities_UserDefaults.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E636F12029AD4B16C7FB0A49 /* GoogleUtilities_UserDefaults.framework */; }; 25C16329B5447E96E40BAB34 /* DetailInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86C4E404056697A170B2B575 /* DetailInterface.framework */; }; - 2A9E6C9228EFD0F89BB15873 /* FirebaseCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6057899A5EBA0F72DCB4F9FB /* FirebaseCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2DECB327F9E1EFE0AE533114 /* Launch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E710496E985656C6B2D0826 /* Launch.framework */; }; 2E52F27A54B699D9FDADE3EA /* GoogleUtilities_Reachability.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586B2137F5665C47D8CBF265 /* GoogleUtilities_Reachability.framework */; }; 2E743A6F76CCB6064D781210 /* TuistAssets+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95D529DAAF6A9D59C44D9D68 /* TuistAssets+App.swift */; }; 2F849686E3F1AB9940B88C90 /* Explore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 233D852B07E4FC2B2B1F1179 /* Explore.framework */; }; - 2FEC4C6AC218B26FF4A2F4A8 /* GoogleUtilities_Network.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C99EEBAAE10B045CF1A64A0E /* GoogleUtilities_Network.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 326C0B3CADC173970CDF3EAF /* Auth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 709ECB981BF7FB2A9D697179 /* Auth.framework */; }; 33E81FC86F95AFABE4A4C1CE /* HomeDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A384F9952484B3EE82AEEEB0 /* HomeDomain.framework */; }; - 343BDB365A3C8C6E6705D1F5 /* GoogleAppMeasurementIdentitySupport.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6CC5BE38C825952D62A4FEA /* GoogleAppMeasurementIdentitySupport.xcframework */; }; 352FA513E7B4EF4FF9C5A9A0 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E02385EF041EF7C0B15DA4 /* CoreTelephony.framework */; }; 390C981C40F4FEC12F19402B /* AppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0685C94FE185B23B0219AB /* AppCoordinator.swift */; }; + 3924822A85CCB856CF6D53E7 /* Firebase_FirebaseInstallations.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 21B8EE4A1F0458879F0B90F2 /* Firebase_FirebaseInstallations.bundle */; }; 3B197E4B3C8EC9C0A91A7459 /* FBLPromises.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A04862A34120F5891A8E63BD /* FBLPromises.framework */; }; 3B8CD8CA059DB727F00BFCFD /* KakaoSDKCommon.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 07A64FDDEF0AA8332A7C2E8F /* KakaoSDKCommon.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3C5F34441E5BE18D3A80FB67 /* HomeRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DEB0BB71823B6387131290 /* HomeRoute.swift */; }; 3E218B454583303272ECB968 /* DetailData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56CEFEBE90EBB1FAFCA079B3 /* DetailData.framework */; }; - 3F828FC9E0F2A854B6E472EF /* FirebaseInstallations.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1EDD3D57F65917DB1A07B052 /* FirebaseInstallations.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 4056A0FE42A1656466061EE8 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C86E6E6BCDFAB61BBD09E06F /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3F9833F6C4BC374663C6FE35 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4EB562E78DEEF2FAC4EDDEBF /* DesignSystem_DesignSystem.bundle */; }; + 454F1A3A0FFEA9BCBD874E3E /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 5DDB2F4EA01B0EEF77406ED9 /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle */; }; + 455BCB85C4E266C816471B82 /* Firebase_FirebaseCore.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = AD69D01DF7849A86F4C17EF3 /* Firebase_FirebaseCore.bundle */; }; + 46C14C6043CB9460A652AEC7 /* Detail_Detail.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F0D118266653E3D17C69D780 /* Detail_Detail.bundle */; }; 48469C5111BF762561C9B9B6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8F7F83A194E1D17030DCA033 /* Assets.xcassets */; }; 492675EEAF29D31EF314EE9E /* GoogleUtilities_AppDelegateSwizzler.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48998AA38F90160E6A754556 /* GoogleUtilities_AppDelegateSwizzler.framework */; }; - 4943C02C8CCE2B41CF3E2D13 /* FirebaseCoreInternal.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 64190CDE29515E79F9CFDF34 /* FirebaseCoreInternal.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4AF6277B6AD48D9FB004CA49 /* ExploreRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A0C78488ACCB4EC45CD33F3 /* ExploreRoute.swift */; }; 4B145EC4CCB33E190DBB4467 /* AuthFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E6B457B0A45148B574F626 /* AuthFlow.swift */; }; - 4B4BEDFFBA8F6B8697F6D658 /* GoogleUtilities_NSData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 97F9F26BC0A0A0A32CD460D4 /* GoogleUtilities_NSData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4F5500B75F6D9A39D8518EAE /* Firebase_FirebaseInstallations.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 21B8EE4A1F0458879F0B90F2 /* Firebase_FirebaseInstallations.bundle */; }; 509D382CCFE306D7B52B5D3F /* FirebaseSessionsObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE70F210A2CC94EABD7C03 /* FirebaseSessionsObjC.framework */; }; - 51247B74AD34D897B25E4802 /* Detail.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6FB9E693CAE8686756749690 /* Detail.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5189CF63EEE31ED6C09F5354 /* FirebaseCoreExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D986AB50C6EC5E677534690A /* FirebaseCoreExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 5199DCE2F06390D49C5B3E99 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1A24FC5D83E61ED5CD9BE219 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle */; }; + 52792251855EB8FA202BAC86 /* nanopb_nanopb.bundle in Resources */ = {isa = PBXBuildFile; fileRef = ADED33C4EE6E5E141B0AB27F /* nanopb_nanopb.bundle */; }; 5533C7995DDE899C36BC2346 /* third_party_IsAppEncrypted.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 255DFB5369032FF8E4C1007C /* third_party_IsAppEncrypted.framework */; }; 557E5EB9CE186DC932D2D731 /* GoogleUtilities_NSData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97F9F26BC0A0A0A32CD460D4 /* GoogleUtilities_NSData.framework */; }; 55C10C02F203892AF5DFBEC5 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97590F8716CD862F585CC863 /* Moya.framework */; }; - 5B8ED560C12821F468B19513 /* GoogleAdsOnDeviceConversion.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CE72C73A76A964F8E7408D6 /* GoogleAdsOnDeviceConversion.xcframework */; }; + 5B0876950287ADC67A485B67 /* Detail_Detail.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = F0D118266653E3D17C69D780 /* Detail_Detail.bundle */; }; 5C67BAA15381AE7145205E2B /* SearchInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1398C2480450D84DC3712CB1 /* SearchInterface.framework */; }; 5D498E3D12F6070817B573C5 /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 137FBFC1E48C21B372502272 /* FoundationKit.framework */; }; + 5DC88C3A58701D9C098920F4 /* nanopb_nanopb.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = ADED33C4EE6E5E141B0AB27F /* nanopb_nanopb.bundle */; }; 60BAC7B09140821CE84C3573 /* NetworkErrorAppMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC4BECC212699120AF58DCF /* NetworkErrorAppMapper.swift */; }; - 617287F49CD5AF999D4CC84E /* GoogleUtilities_UserDefaults.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E636F12029AD4B16C7FB0A49 /* GoogleUtilities_UserDefaults.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 618C5A4BDBBDA7F1A2F8DC93 /* Home.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76E66C32BAE4D2C1EE4C64CB /* Home.framework */; }; + 6238E134AEF9AF7C7D62F513 /* Promises_Promises.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = F260309AD89688149AD615B2 /* Promises_Promises.bundle */; }; 65C48DAD150D3041D0A25442 /* VersionCheckService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9623594413736EB5B5E46F /* VersionCheckService.swift */; }; - 667E72036A7944FECF2FEBB0 /* GoogleUtilities_MethodSwizzler.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 426373E4E665642601D5BE1A /* GoogleUtilities_MethodSwizzler.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 684249CA8A3486EB41BE1783 /* FirebaseAnalytics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25C4E914C21B7ADF81495C99 /* FirebaseAnalytics.xcframework */; }; 69B40BAF2815D2969E4A0FB1 /* Kingfisher.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 77D69EAF942AA87F8A9468BF /* Kingfisher.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 6B3574A6BF172B5045B3F44A /* GoogleUtilities_GoogleUtilities_Environment.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 54C16966143C68BB125F5D74 /* GoogleUtilities_GoogleUtilities_Environment.bundle */; }; + 6DA58C0BE7A7A82BB4058DC1 /* GoogleUtilities_GoogleUtilities_Network.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 39BF2D18DFB89E880E42645F /* GoogleUtilities_GoogleUtilities_Network.bundle */; }; 6E8362D867B53D4394477600 /* Moya.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 97590F8716CD862F585CC863 /* Moya.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 6F40F0302996AC8E9B709719 /* BookmarkDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F861BEFA693139AC601928 /* BookmarkDomain.framework */; }; 6F454DB6DF4C752D7E218FFF /* SubscribeRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4616639497709FF78B11EC /* SubscribeRoute.swift */; }; - 6F52EB8BAB38DBC2979F5AB7 /* GoogleDataTransport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CAA551898AB3AD913E2B2E80 /* GoogleDataTransport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 70F3CF0BB9F240B2A59853E0 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E9369BFA2C65412102538303 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 729F10544E8CB2CD05A2D73D /* KakaoSDKAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C71FCA8677FAE2B173DC8BC /* KakaoSDKAuth.framework */; }; 7389C3BF0F6EE9AA745BEADA /* Subscribe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7280B4F86503740125AA0E61 /* Subscribe.framework */; }; 73F3FC1D4FF7EB1EE2A318E4 /* FirebaseCrashlytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 579A16AE603CDAC89FBACF86 /* FirebaseCrashlytics.framework */; }; @@ -81,15 +86,18 @@ 7B9C33FCCE5877A1A9EAE367 /* ExploreStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540F7C6DDBDE7E9CAA207079 /* ExploreStack.swift */; }; 7B9F449FE333FAF6C557BDCD /* Promises.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DF851AB63186CE3D1CB0DED /* Promises.framework */; }; 7BCB27357632345470081169 /* GoogleDataTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CAA551898AB3AD913E2B2E80 /* GoogleDataTransport.framework */; }; + 7C119429E6762110C64C8124 /* Promises_FBLPromises.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7DFD84ECD2039208E4B5D331 /* Promises_FBLPromises.bundle */; }; 7CB41A05775C83D5F8362582 /* BookmarkStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3FD82EB3E15D948FDA8FAD1 /* BookmarkStack.swift */; }; 80319378A3DAAAA15CA9AEEA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCA3C5FAA7EFDD728B5A5DA0 /* UIKit.framework */; }; - 82084C94D10127344D2915C5 /* GoogleUtilities_Reachability.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 586B2137F5665C47D8CBF265 /* GoogleUtilities_Reachability.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 82139E5A2BB0D66FFFF431C2 /* GoogleUtilities_GoogleUtilities_NSData.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = F64687C01E47DB17FF48B3F0 /* GoogleUtilities_GoogleUtilities_NSData.bundle */; }; 825230B66CE03FD8757C0F13 /* MypageInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96DD70846B0784404F045D9B /* MypageInterface.framework */; }; + 8372A983930DA8599F6C2972 /* GoogleDataTransport_GoogleDataTransport.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D23E56F96E077CA1BDF4848B /* GoogleDataTransport_GoogleDataTransport.bundle */; }; 83989972E0EFDFDC98B9D266 /* AuthData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90F102DAA3B6B8E740853FB0 /* AuthData.framework */; }; + 84E0D6A44FC3649840CB2891 /* Firebase_FirebaseCoreExtension.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 001331504CFB608C259AD01C /* Firebase_FirebaseCoreExtension.bundle */; }; + 87FD203588C881E516CEEF31 /* GoogleDataTransport_GoogleDataTransport.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = D23E56F96E077CA1BDF4848B /* GoogleDataTransport_GoogleDataTransport.bundle */; }; 886EBD382F20C3E46CEA0427 /* DetailDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4307B0453450735C4C2D0075 /* DetailDomain.framework */; }; 88B77F146FB7D3D00F3C2450 /* GoogleUtilities_Environment.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49A8F44173AE773538037143 /* GoogleUtilities_Environment.framework */; }; 8B7F4D5F182C6C286C41D29C /* MypageDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF295CF0B578304BEF374ADF /* MypageDomain.framework */; }; - 8C1ECE2C139ABD512A2275C6 /* FirebaseAnalytics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59562D711788A69AA94F066C /* FirebaseAnalytics.xcframework */; }; 8F3691F7301E714387485350 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9369BFA2C65412102538303 /* DesignSystem.framework */; }; 8FC13E553A63D7A2F007D79B /* SubscribeData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C31F0BDE173A605012E7B8AC /* SubscribeData.framework */; }; 92F54D6F46C20B4A9B9764D4 /* MypageData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25D86E385893D41F56082155 /* MypageData.framework */; }; @@ -101,9 +109,13 @@ 9D12C99AAD2F9CD449517FBA /* SearchData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D326740F43A5F556E2007C0 /* SearchData.framework */; }; 9D2DD36569CD3FA02C1A5DAD /* ExploreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2EE2EA788E57C11B55BBF8A /* ExploreData.framework */; }; 9E97060454F08C720AC1E1DB /* FirebaseCrashlyticsSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61F2B8D3FBE655A0B9B1C1C3 /* FirebaseCrashlyticsSwift.framework */; }; + 9EFB4F1605EAD76AB26CF7D4 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = CFD5674BA4AFC34FEC904609 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle */; }; 9FC27D46D287335E3F17DE53 /* Bookmark.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FBE2452C04B4D7AC7749E0 /* Bookmark.framework */; }; A0142B1AA7D90160EBBC2FE8 /* SearchDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A00883EC86642517904880FC /* SearchDomain.framework */; }; A0EBB486D9671C02D5B5293F /* AuthInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 364B2FD98E76A3247813D747 /* AuthInterface.framework */; }; + A445AE128B99A52E7FECCEB3 /* Firebase_FirebaseCrashlytics.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A519D8A682020144739488CD /* Firebase_FirebaseCrashlytics.bundle */; }; + A58B5C813FBF9A8D1C3EDE82 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 1A24FC5D83E61ED5CD9BE219 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle */; }; + A63FF532A5DE421354BF1D50 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = FA19395CE67AB6554BDAFCF5 /* Alamofire_Alamofire.bundle */; }; A74DFCAC53D088F807F9FF1D /* SubscribeStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECC235BCF8EEC6740150B1F /* SubscribeStack.swift */; }; A74FEE290A5DA1D3F24DF935 /* KakaoSDKUser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D38B74E3880A33963F2FC652 /* KakaoSDKUser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A76F97E3ED283C3131700469 /* KakaoSDKCommon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07A64FDDEF0AA8332A7C2E8F /* KakaoSDKCommon.framework */; }; @@ -111,39 +123,48 @@ A92C683605E31D18E761A10D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FE0ECF9910AB356967B5279 /* SystemConfiguration.framework */; }; A9FE5F68F85E5B7109D5A150 /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DB091534BC4A342165F84D /* Router.swift */; }; AA253D8AD1A1D49463E18C89 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BE35C6E44DDB3DC2EAFA79F /* libz.tbd */; }; + AA6B4867B53B4ACECC7EC473 /* GoogleAdsOnDeviceConversion.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03093B9870F2D113F9FA3696 /* GoogleAdsOnDeviceConversion.xcframework */; }; AB34FB6F6DB90E6EABE7E0D3 /* FirebaseAnalyticsWrapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBB016895105DD820FB961E /* FirebaseAnalyticsWrapper.framework */; }; ACB9F921EC8195E3A4550EF3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E554DAA4AB515DAF86082D9E /* GoogleService-Info.plist */; }; AF2C76A0516AA27E58A19304 /* FirebaseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6057899A5EBA0F72DCB4F9FB /* FirebaseCore.framework */; }; B0F5FC2CBE0632DF445A58CC /* BookmarkRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = F583B421B451B7D4ACF64E4A /* BookmarkRoute.swift */; }; + B1AB58CEEE97101BB03E214A /* GoogleUtilities_GoogleUtilities_Network.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 39BF2D18DFB89E880E42645F /* GoogleUtilities_GoogleUtilities_Network.bundle */; }; B202306A3AFE89A5BDBFB17A /* KakaoSDKUser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D38B74E3880A33963F2FC652 /* KakaoSDKUser.framework */; }; BA0821813F9EFEC96108F29C /* FirebaseSessions.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 235BA3CECEDCE6AB843915C7 /* FirebaseSessions.framework */; }; - BCC9EDD6ADD2F07F95D4BAC9 /* GoogleUtilities_AppDelegateSwizzler.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48998AA38F90160E6A754556 /* GoogleUtilities_AppDelegateSwizzler.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BC4240217A601EA172B9234C /* Firebase_FirebaseCoreInternal.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = EFE2491E32CAC50F848EF255 /* Firebase_FirebaseCoreInternal.bundle */; }; C3589A70DFF400CA5B499F90 /* AppRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B1B1045BA33FE4E4B7B2BE /* AppRootView.swift */; }; + C4617ABF620439B41E6D77CE /* GoogleAppMeasurementIdentitySupport.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFF70D51AD4B207AB8DD7AD3 /* GoogleAppMeasurementIdentitySupport.xcframework */; }; C4B75090C0B2C8C29DCB5A6C /* AppContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14007BBD56368520EDB35575 /* AppContainer.swift */; }; + C6DB28A3E3B8988BEA603F69 /* GoogleAppMeasurement.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A868C7007862E33B3D0B0E83 /* GoogleAppMeasurement.xcframework */; }; + C6E77641A727E0AF1DD9DF26 /* GoogleUtilities_GoogleUtilities_NSData.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F64687C01E47DB17FF48B3F0 /* GoogleUtilities_GoogleUtilities_NSData.bundle */; }; CCA882DEDF8A62AB1141EBD4 /* TuistPlists+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB0EC4037905D748A3AC2129 /* TuistPlists+App.swift */; }; CF3C49C4B9CB32CF2ABAAE6C /* AuthDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F171699E8077C4150AFB994 /* AuthDomain.framework */; }; D0C295699905C71F5BA36345 /* GoogleUtilities_Network.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C99EEBAAE10B045CF1A64A0E /* GoogleUtilities_Network.framework */; }; D0D65E408FF57299A1762EC2 /* GoogleUtilities_Logger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FAFAA40E48DF2BAD19BC548 /* GoogleUtilities_Logger.framework */; }; - D7023AF7E9A9396BAF28A867 /* FBLPromises.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A04862A34120F5891A8E63BD /* FBLPromises.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - D7ABC7FF8DF5D9DD20A14358 /* Promises.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4DF851AB63186CE3D1CB0DED /* Promises.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + D14B768C8A9BC8DB06A8176C /* CrashlyticsErrorLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D70261E566E247AFF2EFAC /* CrashlyticsErrorLogger.swift */; }; + D30AF7E0E537F481B35D857F /* Firebase_FirebaseCoreExtension.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 001331504CFB608C259AD01C /* Firebase_FirebaseCoreExtension.bundle */; }; + D597461A2B9FF9A82840B3C4 /* GoogleUtilities_GoogleUtilities_Logger.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = FC8C9536B1CA387C5E5002E9 /* GoogleUtilities_GoogleUtilities_Logger.bundle */; }; + DA7881D366B229EA84781AB6 /* GoogleUtilities_GoogleUtilities_Reachability.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D6375694D1B80179B7C090E9 /* GoogleUtilities_GoogleUtilities_Reachability.bundle */; }; DCD1CDA51C0E83201D9519D5 /* SubscribeInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 819B3A414C51EAA10DE042A0 /* SubscribeInterface.framework */; }; + DD677EE5EF51492839B9E43E /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5DDB2F4EA01B0EEF77406ED9 /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle */; }; DE94F4759ADE18287F00A3FB /* FirebaseAnalyticsTarget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C85A81A03B5267CA8CC2EC9 /* FirebaseAnalyticsTarget.framework */; }; E492654A9AF926A52A47BCCC /* Mypage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE449FC872A10DA9227F0A7 /* Mypage.framework */; }; E5EECDAED4239341C2F24AE2 /* ExploreDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B81DA1013615941AD811A574 /* ExploreDomain.framework */; }; + E77E2BAE7976D9A70C4A966E /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CFD5674BA4AFC34FEC904609 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle */; }; E876353B6A37EF48E58A9D39 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D4C1070D34B90B47363412F /* PopupView.framework */; }; + E9C58ECCD59D1AF6ED04CA0A /* Promises_FBLPromises.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 7DFD84ECD2039208E4B5D331 /* Promises_FBLPromises.bundle */; }; ED14030AAE7234BDD355EFB0 /* nanopb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F4076E956478B59F7481B80 /* nanopb.framework */; }; + EDFE67D4B01135905A134FC7 /* GoogleUtilities_GoogleUtilities_Reachability.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = D6375694D1B80179B7C090E9 /* GoogleUtilities_GoogleUtilities_Reachability.bundle */; }; F093B195EA3559F7AD713EE0 /* ExploreInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78CD79CD69E90D94B6A94553 /* ExploreInterface.framework */; }; + F099CD980652945E75D48F5F /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FA19395CE67AB6554BDAFCF5 /* Alamofire_Alamofire.bundle */; }; F1113AB299F42FEAAB55681C /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D5C086E361BFD0D4DF600B2D /* libc++.tbd */; }; - F1597A735BFBCAEA1FAC7971 /* GoogleUtilities_Logger.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2FAFAA40E48DF2BAD19BC548 /* GoogleUtilities_Logger.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + F1980F2C5A2659EE94119A81 /* Firebase_FirebaseCrashlytics.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = A519D8A682020144739488CD /* Firebase_FirebaseCrashlytics.bundle */; }; F2527FB2BF7081A7A0F63630 /* HomeData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 399957C9AAC3B887DDD3649B /* HomeData.framework */; }; F4F71442B9CC6C3E397CD7E8 /* Search.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 460AADA523E2A539BF85F4C6 /* Search.framework */; }; - F63766E053EA36F3C0101C0D /* GoogleAppMeasurement.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85D9916874570E959AD65449 /* GoogleAppMeasurement.xcframework */; }; F8CB5ED6F921603868665787 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9794475B8B6D993D855A2001 /* StoreKit.framework */; }; FADEAB676778FB739860219D /* MyPageStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 033342B810467F440C2F1C7B /* MyPageStack.swift */; }; - FB2D3CD81D0E7CCDE4156363 /* nanopb.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5F4076E956478B59F7481B80 /* nanopb.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; FE060CC116FAC5B10EC8A846 /* GoogleAdsOnDeviceConversionTarget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6F604B0FACC3BEB663D1D1 /* GoogleAdsOnDeviceConversionTarget.framework */; }; FE078F42728C23B77EE02A1B /* TuistBundle+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083CD4D343ECF7F321C1905D /* TuistBundle+App.swift */; }; - FED64D5941C7FDEB946F6B3D /* FirebaseCrashlytics.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 579A16AE603CDAC89FBACF86 /* FirebaseCrashlytics.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -153,43 +174,55 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 4056A0FE42A1656466061EE8 /* Alamofire.framework in Embed Frameworks */, - 70F3CF0BB9F240B2A59853E0 /* DesignSystem.framework in Embed Frameworks */, - 51247B74AD34D897B25E4802 /* Detail.framework in Embed Frameworks */, - D7023AF7E9A9396BAF28A867 /* FBLPromises.framework in Embed Frameworks */, - 2A9E6C9228EFD0F89BB15873 /* FirebaseCore.framework in Embed Frameworks */, - 5189CF63EEE31ED6C09F5354 /* FirebaseCoreExtension.framework in Embed Frameworks */, - 4943C02C8CCE2B41CF3E2D13 /* FirebaseCoreInternal.framework in Embed Frameworks */, - FED64D5941C7FDEB946F6B3D /* FirebaseCrashlytics.framework in Embed Frameworks */, - 3F828FC9E0F2A854B6E472EF /* FirebaseInstallations.framework in Embed Frameworks */, - 6F52EB8BAB38DBC2979F5AB7 /* GoogleDataTransport.framework in Embed Frameworks */, - BCC9EDD6ADD2F07F95D4BAC9 /* GoogleUtilities_AppDelegateSwizzler.framework in Embed Frameworks */, - 232800970AFA0DEF4018B1FB /* GoogleUtilities_Environment.framework in Embed Frameworks */, - F1597A735BFBCAEA1FAC7971 /* GoogleUtilities_Logger.framework in Embed Frameworks */, - 667E72036A7944FECF2FEBB0 /* GoogleUtilities_MethodSwizzler.framework in Embed Frameworks */, - 4B4BEDFFBA8F6B8697F6D658 /* GoogleUtilities_NSData.framework in Embed Frameworks */, - 2FEC4C6AC218B26FF4A2F4A8 /* GoogleUtilities_Network.framework in Embed Frameworks */, - 82084C94D10127344D2915C5 /* GoogleUtilities_Reachability.framework in Embed Frameworks */, - 617287F49CD5AF999D4CC84E /* GoogleUtilities_UserDefaults.framework in Embed Frameworks */, 98213E62324FAFF244E18FFB /* KakaoSDKAuth.framework in Embed Frameworks */, 3B8CD8CA059DB727F00BFCFD /* KakaoSDKCommon.framework in Embed Frameworks */, A74FEE290A5DA1D3F24DF935 /* KakaoSDKUser.framework in Embed Frameworks */, 69B40BAF2815D2969E4A0FB1 /* Kingfisher.framework in Embed Frameworks */, 6E8362D867B53D4394477600 /* Moya.framework in Embed Frameworks */, 9531452380F62186E3D0D24B /* PopupView.framework in Embed Frameworks */, - D7ABC7FF8DF5D9DD20A14358 /* Promises.framework in Embed Frameworks */, - FB2D3CD81D0E7CCDE4156363 /* nanopb.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + FBDA11870C9384049F1DFEDD /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + A63FF532A5DE421354BF1D50 /* Alamofire_Alamofire.bundle in Dependencies */, + 214B61C781E79DEA591F1751 /* DesignSystem_DesignSystem.bundle in Dependencies */, + 5B0876950287ADC67A485B67 /* Detail_Detail.bundle in Dependencies */, + 455BCB85C4E266C816471B82 /* Firebase_FirebaseCore.bundle in Dependencies */, + D30AF7E0E537F481B35D857F /* Firebase_FirebaseCoreExtension.bundle in Dependencies */, + BC4240217A601EA172B9234C /* Firebase_FirebaseCoreInternal.bundle in Dependencies */, + F1980F2C5A2659EE94119A81 /* Firebase_FirebaseCrashlytics.bundle in Dependencies */, + 4F5500B75F6D9A39D8518EAE /* Firebase_FirebaseInstallations.bundle in Dependencies */, + 87FD203588C881E516CEEF31 /* GoogleDataTransport_GoogleDataTransport.bundle in Dependencies */, + 454F1A3A0FFEA9BCBD874E3E /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle in Dependencies */, + 6B3574A6BF172B5045B3F44A /* GoogleUtilities_GoogleUtilities_Environment.bundle in Dependencies */, + D597461A2B9FF9A82840B3C4 /* GoogleUtilities_GoogleUtilities_Logger.bundle in Dependencies */, + 9EFB4F1605EAD76AB26CF7D4 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle in Dependencies */, + 82139E5A2BB0D66FFFF431C2 /* GoogleUtilities_GoogleUtilities_NSData.bundle in Dependencies */, + B1AB58CEEE97101BB03E214A /* GoogleUtilities_GoogleUtilities_Network.bundle in Dependencies */, + EDFE67D4B01135905A134FC7 /* GoogleUtilities_GoogleUtilities_Reachability.bundle in Dependencies */, + A58B5C813FBF9A8D1C3EDE82 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle in Dependencies */, + E9C58ECCD59D1AF6ED04CA0A /* Promises_FBLPromises.bundle in Dependencies */, + 6238E134AEF9AF7C7D62F513 /* Promises_Promises.bundle in Dependencies */, + 5DC88C3A58701D9C098920F4 /* nanopb_nanopb.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 001331504CFB608C259AD01C /* Firebase_FirebaseCoreExtension.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firebase_FirebaseCoreExtension.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 01E1AA015F9EE84780DE15E5 /* App-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "App-Info.plist"; sourceTree = ""; }; + 03093B9870F2D113F9FA3696 /* GoogleAdsOnDeviceConversion.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleAdsOnDeviceConversion.xcframework; path = "/Users/minjae/Desktop/Newdok/Tuist/.build/artifacts/google-ads-on-device-conversion-ios-sdk/GoogleAdsOnDeviceConversion/GoogleAdsOnDeviceConversion.xcframework"; sourceTree = ""; }; 033342B810467F440C2F1C7B /* MyPageStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageStack.swift; sourceTree = ""; }; 03CE70F210A2CC94EABD7C03 /* FirebaseSessionsObjC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseSessionsObjC.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 07A64FDDEF0AA8332A7C2E8F /* KakaoSDKCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KakaoSDKCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 07D70261E566E247AFF2EFAC /* CrashlyticsErrorLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashlyticsErrorLogger.swift; sourceTree = ""; }; 083CD4D343ECF7F321C1905D /* TuistBundle+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistBundle+App.swift"; sourceTree = ""; }; 0BE35C6E44DDB3DC2EAFA79F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; 0DBF32E59C44117542EBDEFB /* BookmarkData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BookmarkData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -198,13 +231,16 @@ 137FBFC1E48C21B372502272 /* FoundationKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FoundationKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1398C2480450D84DC3712CB1 /* SearchInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 14007BBD56368520EDB35575 /* AppContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppContainer.swift; sourceTree = ""; }; + 1A24FC5D83E61ED5CD9BE219 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_UserDefaults.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 1ED1B83ED44A88938979E608 /* HomeStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStack.swift; sourceTree = ""; }; 1EDD3D57F65917DB1A07B052 /* FirebaseInstallations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseInstallations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1F171699E8077C4150AFB994 /* AuthDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 20472DE96208EAF694E16719 /* DatabaseKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DatabaseKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 21B8EE4A1F0458879F0B90F2 /* Firebase_FirebaseInstallations.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firebase_FirebaseInstallations.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 233D852B07E4FC2B2B1F1179 /* Explore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Explore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 235BA3CECEDCE6AB843915C7 /* FirebaseSessions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseSessions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 255DFB5369032FF8E4C1007C /* third_party_IsAppEncrypted.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = third_party_IsAppEncrypted.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 25C4E914C21B7ADF81495C99 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalytics.xcframework; path = "/Users/minjae/Desktop/Newdok/Tuist/.build/artifacts/firebase-ios-sdk/FirebaseAnalytics/FirebaseAnalytics.xcframework"; sourceTree = ""; }; 25D86E385893D41F56082155 /* MypageData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MypageData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2EC0EED4803AED8EF066F337 /* FirebaseRemoteConfigInterop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseRemoteConfigInterop.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2FAFAA40E48DF2BAD19BC548 /* GoogleUtilities_Logger.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities_Logger.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -212,6 +248,7 @@ 35DEB0BB71823B6387131290 /* HomeRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRoute.swift; sourceTree = ""; }; 364B2FD98E76A3247813D747 /* AuthInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 399957C9AAC3B887DDD3649B /* HomeData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HomeData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 39BF2D18DFB89E880E42645F /* GoogleUtilities_GoogleUtilities_Network.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_Network.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 426373E4E665642601D5BE1A /* GoogleUtilities_MethodSwizzler.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities_MethodSwizzler.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4307B0453450735C4C2D0075 /* DetailDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DetailDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4459AC440B063044813E979E /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; @@ -220,13 +257,16 @@ 49A8F44173AE773538037143 /* GoogleUtilities_Environment.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities_Environment.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4B1CAF05B8E3BD379195EB98 /* AuthRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRoute.swift; sourceTree = ""; }; 4DF851AB63186CE3D1CB0DED /* Promises.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Promises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4EB562E78DEEF2FAC4EDDEBF /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 50C4E4206185DE9D06029506 /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = ""; }; 540F7C6DDBDE7E9CAA207079 /* ExploreStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreStack.swift; sourceTree = ""; }; + 54C16966143C68BB125F5D74 /* GoogleUtilities_GoogleUtilities_Environment.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_Environment.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 56CEFEBE90EBB1FAFCA079B3 /* DetailData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DetailData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 571E08A9083FD4334E4B7D06 /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; 579A16AE603CDAC89FBACF86 /* FirebaseCrashlytics.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCrashlytics.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 586B2137F5665C47D8CBF265 /* GoogleUtilities_Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities_Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 59562D711788A69AA94F066C /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = FirebaseAnalytics.xcframework; sourceTree = ""; }; 5C85A81A03B5267CA8CC2EC9 /* FirebaseAnalyticsTarget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseAnalyticsTarget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5DDB2F4EA01B0EEF77406ED9 /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 5F4076E956478B59F7481B80 /* nanopb.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = nanopb.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6057899A5EBA0F72DCB4F9FB /* FirebaseCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 61F2B8D3FBE655A0B9B1C1C3 /* FirebaseCrashlyticsSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCrashlyticsSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -242,9 +282,9 @@ 77D69EAF942AA87F8A9468BF /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 78CD79CD69E90D94B6A94553 /* ExploreInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExploreInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7B0685C94FE185B23B0219AB /* AppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinator.swift; sourceTree = ""; }; - 7CE72C73A76A964F8E7408D6 /* GoogleAdsOnDeviceConversion.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleAdsOnDeviceConversion.xcframework; sourceTree = ""; }; 7D4C1070D34B90B47363412F /* PopupView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PopupView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7DC4BECC212699120AF58DCF /* NetworkErrorAppMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkErrorAppMapper.swift; sourceTree = ""; }; + 7DFD84ECD2039208E4B5D331 /* Promises_FBLPromises.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Promises_FBLPromises.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 7E710496E985656C6B2D0826 /* Launch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Launch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7F44EDE91A79696F3FBBFE16 /* Firebase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Firebase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80E02385EF041EF7C0B15DA4 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreTelephony.framework; sourceTree = DEVELOPER_DIR; }; @@ -252,7 +292,6 @@ 81B1B1045BA33FE4E4B7B2BE /* AppRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRootView.swift; sourceTree = ""; }; 839C7785F67E3906215F67C8 /* NewDokTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewDokTabView.swift; sourceTree = ""; }; 84FBE2452C04B4D7AC7749E0 /* Bookmark.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Bookmark.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 85D9916874570E959AD65449 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleAppMeasurement.xcframework; sourceTree = ""; }; 85DB091534BC4A342165F84D /* Router.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; 86C4E404056697A170B2B575 /* DetailInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DetailInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 87508572DAF45259CFBDF271 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; @@ -272,22 +311,27 @@ A00883EC86642517904880FC /* SearchDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A04862A34120F5891A8E63BD /* FBLPromises.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBLPromises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A384F9952484B3EE82AEEEB0 /* HomeDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HomeDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A519D8A682020144739488CD /* Firebase_FirebaseCrashlytics.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firebase_FirebaseCrashlytics.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; A6527EDA66DBCA90ED0AF755 /* AppDependencies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDependencies.swift; sourceTree = ""; }; - A6CC5BE38C825952D62A4FEA /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; + A868C7007862E33B3D0B0E83 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurement.xcframework; path = /Users/minjae/Desktop/Newdok/Tuist/.build/artifacts/googleappmeasurement/GoogleAppMeasurement/GoogleAppMeasurement.xcframework; sourceTree = ""; }; AB0EC4037905D748A3AC2129 /* TuistPlists+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistPlists+App.swift"; sourceTree = ""; }; AB40F3B3D8E2DCB2AC3C9605 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AD69D01DF7849A86F4C17EF3 /* Firebase_FirebaseCore.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firebase_FirebaseCore.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + ADED33C4EE6E5E141B0AB27F /* nanopb_nanopb.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = nanopb_nanopb.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; B6011F38009256ECAA5FCCE7 /* AppToastHost.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppToastHost.swift; sourceTree = ""; }; B6E6B457B0A45148B574F626 /* AuthFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFlow.swift; sourceTree = ""; }; B81DA1013615941AD811A574 /* ExploreDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExploreDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BECC235BCF8EEC6740150B1F /* SubscribeStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeStack.swift; sourceTree = ""; }; BF295CF0B578304BEF374ADF /* MypageDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MypageDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C31F0BDE173A605012E7B8AC /* SubscribeData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SubscribeData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C86E6E6BCDFAB61BBD09E06F /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C99EEBAAE10B045CF1A64A0E /* GoogleUtilities_Network.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities_Network.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CAA551898AB3AD913E2B2E80 /* GoogleDataTransport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleDataTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CFD5674BA4AFC34FEC904609 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + D23E56F96E077CA1BDF4848B /* GoogleDataTransport_GoogleDataTransport.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleDataTransport_GoogleDataTransport.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; D2EE2EA788E57C11B55BBF8A /* ExploreData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExploreData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D38B74E3880A33963F2FC652 /* KakaoSDKUser.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KakaoSDKUser.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D5C086E361BFD0D4DF600B2D /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; }; + D6375694D1B80179B7C090E9 /* GoogleUtilities_GoogleUtilities_Reachability.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_Reachability.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; D986AB50C6EC5E677534690A /* FirebaseCoreExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCoreExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E3FD82EB3E15D948FDA8FAD1 /* BookmarkStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkStack.swift; sourceTree = ""; }; E554DAA4AB515DAF86082D9E /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -297,11 +341,18 @@ EA4616639497709FF78B11EC /* SubscribeRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeRoute.swift; sourceTree = ""; }; EE6F604B0FACC3BEB663D1D1 /* GoogleAdsOnDeviceConversionTarget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleAdsOnDeviceConversionTarget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EF021344F16945968371F691 /* NetworkKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EFE2491E32CAC50F848EF255 /* Firebase_FirebaseCoreInternal.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Firebase_FirebaseCoreInternal.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F0D118266653E3D17C69D780 /* Detail_Detail.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Detail_Detail.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F260309AD89688149AD615B2 /* Promises_Promises.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Promises_Promises.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; F29FA5D3B936B1F16BFF75CD /* MyPageRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageRoute.swift; sourceTree = ""; }; F583B421B451B7D4ACF64E4A /* BookmarkRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkRoute.swift; sourceTree = ""; }; + F64687C01E47DB17FF48B3F0 /* GoogleUtilities_GoogleUtilities_NSData.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_NSData.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; F8F861BEFA693139AC601928 /* BookmarkDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BookmarkDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FA19395CE67AB6554BDAFCF5 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; FBAB840F54EFA40D6A143F7F /* GoogleAppMeasurementTarget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleAppMeasurementTarget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FC8C9536B1CA387C5E5002E9 /* GoogleUtilities_GoogleUtilities_Logger.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_GoogleUtilities_Logger.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; FCA3C5FAA7EFDD728B5A5DA0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + FFF70D51AD4B207AB8DD7AD3 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurementIdentitySupport.xcframework; path = /Users/minjae/Desktop/Newdok/Tuist/.build/artifacts/googleappmeasurement/GoogleAppMeasurementIdentitySupport/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -389,10 +440,10 @@ DCD1CDA51C0E83201D9519D5 /* SubscribeInterface.framework in Frameworks */, ED14030AAE7234BDD355EFB0 /* nanopb.framework in Frameworks */, 5533C7995DDE899C36BC2346 /* third_party_IsAppEncrypted.framework in Frameworks */, - 8C1ECE2C139ABD512A2275C6 /* FirebaseAnalytics.xcframework in Frameworks */, - 5B8ED560C12821F468B19513 /* GoogleAdsOnDeviceConversion.xcframework in Frameworks */, - F63766E053EA36F3C0101C0D /* GoogleAppMeasurement.xcframework in Frameworks */, - 343BDB365A3C8C6E6705D1F5 /* GoogleAppMeasurementIdentitySupport.xcframework in Frameworks */, + 684249CA8A3486EB41BE1783 /* FirebaseAnalytics.xcframework in Frameworks */, + AA6B4867B53B4ACECC7EC473 /* GoogleAdsOnDeviceConversion.xcframework in Frameworks */, + C6DB28A3E3B8988BEA603F69 /* GoogleAppMeasurement.xcframework in Frameworks */, + C4617ABF620439B41E6D77CE /* GoogleAppMeasurementIdentitySupport.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -409,22 +460,6 @@ path = ../../Configurations; sourceTree = ""; }; - 2B532F2F24B3806AA00CA782 /* firebase-ios-sdk */ = { - isa = PBXGroup; - children = ( - EB592668F4660E34F5D78F27 /* FirebaseAnalytics */, - ); - path = "firebase-ios-sdk"; - sourceTree = ""; - }; - 30738C833C3B6BB1FE637F27 /* GoogleAppMeasurementIdentitySupport */ = { - isa = PBXGroup; - children = ( - A6CC5BE38C825952D62A4FEA /* GoogleAppMeasurementIdentitySupport.xcframework */, - ); - path = GoogleAppMeasurementIdentitySupport; - sourceTree = ""; - }; 3A443C92BF615B174B13C048 /* Services */ = { isa = PBXGroup; children = ( @@ -442,15 +477,6 @@ ); sourceTree = ""; }; - 4FFC2DDE62C74F3CF60D4731 /* Tuist */ = { - isa = PBXGroup; - children = ( - BC8F91C2FAA18CA0D1391EB7 /* .build */, - ); - name = Tuist; - path = ../../Tuist; - sourceTree = ""; - }; 52611B11A5E6A7198C4E57A3 /* Project */ = { isa = PBXGroup; children = ( @@ -458,7 +484,7 @@ B3BCDE38B26B330C9A04FADE /* Derived */, 62EFB15EC88C1D2636544B42 /* Resources */, 858C4E433DBF0294DFED1B0C /* Sources */, - 4FFC2DDE62C74F3CF60D4731 /* Tuist */, + 50C4E4206185DE9D06029506 /* App.entitlements */, ); name = Project; sourceTree = ""; @@ -502,6 +528,7 @@ 3A443C92BF615B174B13C048 /* Services */, 6F41BED0C1858EA69ED3F19E /* Tabs */, FA93CC6EFD37E79110C86AFE /* Toast */, + 07D70261E566E247AFF2EFAC /* CrashlyticsErrorLogger.swift */, 0E742829AD9D1D2B50EFB2A0 /* NewdokApp.swift */, ); path = Sources; @@ -533,14 +560,6 @@ path = Navigation; sourceTree = ""; }; - A582907BA4DE68BF5C585D80 /* GoogleAdsOnDeviceConversion */ = { - isa = PBXGroup; - children = ( - 7CE72C73A76A964F8E7408D6 /* GoogleAdsOnDeviceConversion.xcframework */, - ); - path = GoogleAdsOnDeviceConversion; - sourceTree = ""; - }; A66C63392A87266E27A23862 /* Root */ = { isa = PBXGroup; children = ( @@ -558,27 +577,15 @@ path = Derived; sourceTree = ""; }; - BC1FA09C060027D4E8C5047D /* GoogleAppMeasurement */ = { - isa = PBXGroup; - children = ( - 85D9916874570E959AD65449 /* GoogleAppMeasurement.xcframework */, - ); - path = GoogleAppMeasurement; - sourceTree = ""; - }; - BC8F91C2FAA18CA0D1391EB7 /* .build */ = { - isa = PBXGroup; - children = ( - F1808424065DE458DD8D7E93 /* artifacts */, - ); - path = .build; - sourceTree = ""; - }; BDD1182E50DC622819F25364 /* Frameworks */ = { isa = PBXGroup; children = ( 91FB685CB6A1E3D66A15E903 /* AppKit.framework */, 80E02385EF041EF7C0B15DA4 /* CoreTelephony.framework */, + 25C4E914C21B7ADF81495C99 /* FirebaseAnalytics.xcframework */, + 03093B9870F2D113F9FA3696 /* GoogleAdsOnDeviceConversion.xcframework */, + A868C7007862E33B3D0B0E83 /* GoogleAppMeasurement.xcframework */, + FFF70D51AD4B207AB8DD7AD3 /* GoogleAppMeasurementIdentitySupport.xcframework */, D5C086E361BFD0D4DF600B2D /* libc++.tbd */, 75C1D964EE1929E7F47691C1 /* libsqlite3.tbd */, 0BE35C6E44DDB3DC2EAFA79F /* libz.tbd */, @@ -590,14 +597,6 @@ name = Frameworks; sourceTree = ""; }; - D0B8970BE595EFAFFDEFF6EF /* google-ads-on-device-conversion-ios-sdk */ = { - isa = PBXGroup; - children = ( - A582907BA4DE68BF5C585D80 /* GoogleAdsOnDeviceConversion */, - ); - path = "google-ads-on-device-conversion-ios-sdk"; - sourceTree = ""; - }; E7BF953E865040847C6A1924 /* DI */ = { isa = PBXGroup; children = ( @@ -611,7 +610,7 @@ E9C3DB3EC6D7655028A9C0D3 /* Products */ = { isa = PBXGroup; children = ( - C86E6E6BCDFAB61BBD09E06F /* Alamofire.framework */, + FA19395CE67AB6554BDAFCF5 /* Alamofire_Alamofire.bundle */, 571E08A9083FD4334E4B7D06 /* App.app */, 709ECB981BF7FB2A9D697179 /* Auth.framework */, 90F102DAA3B6B8E740853FB0 /* AuthData.framework */, @@ -622,7 +621,9 @@ F8F861BEFA693139AC601928 /* BookmarkDomain.framework */, E72FF74C328526DB94E50010 /* BookmarkInterface.framework */, 20472DE96208EAF694E16719 /* DatabaseKit.framework */, + 4EB562E78DEEF2FAC4EDDEBF /* DesignSystem_DesignSystem.bundle */, E9369BFA2C65412102538303 /* DesignSystem.framework */, + F0D118266653E3D17C69D780 /* Detail_Detail.bundle */, 6FB9E693CAE8686756749690 /* Detail.framework */, 56CEFEBE90EBB1FAFCA079B3 /* DetailData.framework */, 4307B0453450735C4C2D0075 /* DetailDomain.framework */, @@ -632,6 +633,11 @@ B81DA1013615941AD811A574 /* ExploreDomain.framework */, 78CD79CD69E90D94B6A94553 /* ExploreInterface.framework */, A04862A34120F5891A8E63BD /* FBLPromises.framework */, + AD69D01DF7849A86F4C17EF3 /* Firebase_FirebaseCore.bundle */, + 001331504CFB608C259AD01C /* Firebase_FirebaseCoreExtension.bundle */, + EFE2491E32CAC50F848EF255 /* Firebase_FirebaseCoreInternal.bundle */, + A519D8A682020144739488CD /* Firebase_FirebaseCrashlytics.bundle */, + 21B8EE4A1F0458879F0B90F2 /* Firebase_FirebaseInstallations.bundle */, 7F44EDE91A79696F3FBBFE16 /* Firebase.framework */, 5C85A81A03B5267CA8CC2EC9 /* FirebaseAnalyticsTarget.framework */, 9FBB016895105DD820FB961E /* FirebaseAnalyticsWrapper.framework */, @@ -647,9 +653,18 @@ 137FBFC1E48C21B372502272 /* FoundationKit.framework */, EE6F604B0FACC3BEB663D1D1 /* GoogleAdsOnDeviceConversionTarget.framework */, FBAB840F54EFA40D6A143F7F /* GoogleAppMeasurementTarget.framework */, + D23E56F96E077CA1BDF4848B /* GoogleDataTransport_GoogleDataTransport.bundle */, CAA551898AB3AD913E2B2E80 /* GoogleDataTransport.framework */, 48998AA38F90160E6A754556 /* GoogleUtilities_AppDelegateSwizzler.framework */, 49A8F44173AE773538037143 /* GoogleUtilities_Environment.framework */, + 5DDB2F4EA01B0EEF77406ED9 /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle */, + 54C16966143C68BB125F5D74 /* GoogleUtilities_GoogleUtilities_Environment.bundle */, + FC8C9536B1CA387C5E5002E9 /* GoogleUtilities_GoogleUtilities_Logger.bundle */, + CFD5674BA4AFC34FEC904609 /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle */, + 39BF2D18DFB89E880E42645F /* GoogleUtilities_GoogleUtilities_Network.bundle */, + F64687C01E47DB17FF48B3F0 /* GoogleUtilities_GoogleUtilities_NSData.bundle */, + D6375694D1B80179B7C090E9 /* GoogleUtilities_GoogleUtilities_Reachability.bundle */, + 1A24FC5D83E61ED5CD9BE219 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle */, 2FAFAA40E48DF2BAD19BC548 /* GoogleUtilities_Logger.framework */, 426373E4E665642601D5BE1A /* GoogleUtilities_MethodSwizzler.framework */, C99EEBAAE10B045CF1A64A0E /* GoogleUtilities_Network.framework */, @@ -670,9 +685,12 @@ 25D86E385893D41F56082155 /* MypageData.framework */, BF295CF0B578304BEF374ADF /* MypageDomain.framework */, 96DD70846B0784404F045D9B /* MypageInterface.framework */, + ADED33C4EE6E5E141B0AB27F /* nanopb_nanopb.bundle */, 5F4076E956478B59F7481B80 /* nanopb.framework */, EF021344F16945968371F691 /* NetworkKit.framework */, 7D4C1070D34B90B47363412F /* PopupView.framework */, + 7DFD84ECD2039208E4B5D331 /* Promises_FBLPromises.bundle */, + F260309AD89688149AD615B2 /* Promises_Promises.bundle */, 4DF851AB63186CE3D1CB0DED /* Promises.framework */, 460AADA523E2A539BF85F4C6 /* Search.framework */, 8D326740F43A5F556E2007C0 /* SearchData.framework */, @@ -688,33 +706,6 @@ name = Products; sourceTree = ""; }; - EAFCD759662FE9DDE2A42051 /* googleappmeasurement */ = { - isa = PBXGroup; - children = ( - BC1FA09C060027D4E8C5047D /* GoogleAppMeasurement */, - 30738C833C3B6BB1FE637F27 /* GoogleAppMeasurementIdentitySupport */, - ); - path = googleappmeasurement; - sourceTree = ""; - }; - EB592668F4660E34F5D78F27 /* FirebaseAnalytics */ = { - isa = PBXGroup; - children = ( - 59562D711788A69AA94F066C /* FirebaseAnalytics.xcframework */, - ); - path = FirebaseAnalytics; - sourceTree = ""; - }; - F1808424065DE458DD8D7E93 /* artifacts */ = { - isa = PBXGroup; - children = ( - 2B532F2F24B3806AA00CA782 /* firebase-ios-sdk */, - D0B8970BE595EFAFFDEFF6EF /* google-ads-on-device-conversion-ios-sdk */, - EAFCD759662FE9DDE2A42051 /* googleappmeasurement */, - ); - path = artifacts; - sourceTree = ""; - }; FA93CC6EFD37E79110C86AFE /* Toast */ = { isa = PBXGroup; children = ( @@ -734,6 +725,7 @@ 37BFF6A8CB5CC7FA21AD3FA3 /* Resources */, BC0DC3536DED64E0E8C9923E /* Frameworks */, 8EFDE6013C818852098745E7 /* Embed Frameworks */, + FBDA11870C9384049F1DFEDD /* Dependencies */, ); buildRules = ( ); @@ -754,8 +746,6 @@ attributes = { BuildIndependentTargetsInParallel = YES; ORGANIZATIONNAME = Newdok; - TargetAttributes = { - }; }; buildConfigurationList = B3FD05C59F197F398A0B04AB /* Build configuration list for PBXProject "App" */; compatibilityVersion = "Xcode 14.0"; @@ -782,6 +772,26 @@ files = ( 48469C5111BF762561C9B9B6 /* Assets.xcassets in Resources */, ACB9F921EC8195E3A4550EF3 /* GoogleService-Info.plist in Resources */, + F099CD980652945E75D48F5F /* Alamofire_Alamofire.bundle in Resources */, + 3F9833F6C4BC374663C6FE35 /* DesignSystem_DesignSystem.bundle in Resources */, + 46C14C6043CB9460A652AEC7 /* Detail_Detail.bundle in Resources */, + 21A01C75053E1F862D201926 /* Firebase_FirebaseCore.bundle in Resources */, + 84E0D6A44FC3649840CB2891 /* Firebase_FirebaseCoreExtension.bundle in Resources */, + 2050CD74997BC9376C6B205A /* Firebase_FirebaseCoreInternal.bundle in Resources */, + A445AE128B99A52E7FECCEB3 /* Firebase_FirebaseCrashlytics.bundle in Resources */, + 3924822A85CCB856CF6D53E7 /* Firebase_FirebaseInstallations.bundle in Resources */, + 8372A983930DA8599F6C2972 /* GoogleDataTransport_GoogleDataTransport.bundle in Resources */, + DD677EE5EF51492839B9E43E /* GoogleUtilities_GoogleUtilities_AppDelegateSwizzler.bundle in Resources */, + 16B06C4306001183D71A4F9B /* GoogleUtilities_GoogleUtilities_Environment.bundle in Resources */, + 221E79D0C4EE7C160F28AC4E /* GoogleUtilities_GoogleUtilities_Logger.bundle in Resources */, + E77E2BAE7976D9A70C4A966E /* GoogleUtilities_GoogleUtilities_MethodSwizzler.bundle in Resources */, + C6E77641A727E0AF1DD9DF26 /* GoogleUtilities_GoogleUtilities_NSData.bundle in Resources */, + 6DA58C0BE7A7A82BB4058DC1 /* GoogleUtilities_GoogleUtilities_Network.bundle in Resources */, + DA7881D366B229EA84781AB6 /* GoogleUtilities_GoogleUtilities_Reachability.bundle in Resources */, + 5199DCE2F06390D49C5B3E99 /* GoogleUtilities_GoogleUtilities_UserDefaults.bundle in Resources */, + 7C119429E6762110C64C8124 /* Promises_FBLPromises.bundle in Resources */, + 00907C0C40B6C87BF82F1310 /* Promises_Promises.bundle in Resources */, + 52792251855EB8FA202BAC86 /* nanopb_nanopb.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -795,6 +805,7 @@ 2E743A6F76CCB6064D781210 /* TuistAssets+App.swift in Sources */, FE078F42728C23B77EE02A1B /* TuistBundle+App.swift in Sources */, CCA882DEDF8A62AB1141EBD4 /* TuistPlists+App.swift in Sources */, + D14B768C8A9BC8DB06A8176C /* CrashlyticsErrorLogger.swift in Sources */, C4B75090C0B2C8C29DCB5A6C /* AppContainer.swift in Sources */, 0C267D12DF8888A49CDF7F4C /* AppDependencies.swift in Sources */, 60BAC7B09140821CE84C3573 /* NetworkErrorAppMapper.swift in Sources */, @@ -827,6 +838,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = App.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -896,53 +908,11 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap", ); - OTHER_SWIFT_FLAGS = ( + OTHER_LDFLAGS = ( "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/firebase-ios-sdk/CoreOnly/Sources/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/promises/Sources/FBLPromises/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsTarget/FirebaseAnalyticsTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsWrapper/FirebaseAnalyticsWrapper.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCore/FirebaseCore.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCoreExtension/FirebaseCoreExtension.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCrashlytics/FirebaseCrashlytics.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseInstallations/FirebaseInstallations.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseSessionsObjC/FirebaseSessionsObjC.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAdsOnDeviceConversionTarget/GoogleAdsOnDeviceConversionTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAppMeasurementTarget/GoogleAppMeasurementTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleDataTransport/GoogleDataTransport.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_AppDelegateSwizzler/GoogleUtilities_AppDelegateSwizzler.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Environment/GoogleUtilities_Environment.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Logger/GoogleUtilities_Logger.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_MethodSwizzler/GoogleUtilities_MethodSwizzler.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_NSData/GoogleUtilities_NSData.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Network/GoogleUtilities_Network.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Reachability/GoogleUtilities_Reachability.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_UserDefaults/GoogleUtilities_UserDefaults.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/firebase-ios-sdk/CoreOnly/Sources/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/promises/Sources/FBLPromises/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsTarget/FirebaseAnalyticsTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsWrapper/FirebaseAnalyticsWrapper.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCore/FirebaseCore.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCoreExtension/FirebaseCoreExtension.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCrashlytics/FirebaseCrashlytics.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseInstallations/FirebaseInstallations.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseSessionsObjC/FirebaseSessionsObjC.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAdsOnDeviceConversionTarget/GoogleAdsOnDeviceConversionTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAppMeasurementTarget/GoogleAppMeasurementTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleDataTransport/GoogleDataTransport.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_AppDelegateSwizzler/GoogleUtilities_AppDelegateSwizzler.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Environment/GoogleUtilities_Environment.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Logger/GoogleUtilities_Logger.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_MethodSwizzler/GoogleUtilities_MethodSwizzler.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_NSData/GoogleUtilities_NSData.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Network/GoogleUtilities_Network.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Reachability/GoogleUtilities_Reachability.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_UserDefaults/GoogleUtilities_UserDefaults.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = App; SDKROOT = iphoneos; @@ -1018,6 +988,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = App.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -1087,53 +1058,11 @@ "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap", "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap", ); - OTHER_SWIFT_FLAGS = ( + OTHER_LDFLAGS = ( "$(inherited)", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/firebase-ios-sdk/CoreOnly/Sources/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/promises/Sources/FBLPromises/include/module.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsTarget/FirebaseAnalyticsTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsWrapper/FirebaseAnalyticsWrapper.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCore/FirebaseCore.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCoreExtension/FirebaseCoreExtension.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCrashlytics/FirebaseCrashlytics.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseInstallations/FirebaseInstallations.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseSessionsObjC/FirebaseSessionsObjC.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAdsOnDeviceConversionTarget/GoogleAdsOnDeviceConversionTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAppMeasurementTarget/GoogleAppMeasurementTarget.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleDataTransport/GoogleDataTransport.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_AppDelegateSwizzler/GoogleUtilities_AppDelegateSwizzler.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Environment/GoogleUtilities_Environment.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Logger/GoogleUtilities_Logger.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_MethodSwizzler/GoogleUtilities_MethodSwizzler.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_NSData/GoogleUtilities_NSData.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Network/GoogleUtilities_Network.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Reachability/GoogleUtilities_Reachability.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_UserDefaults/GoogleUtilities_UserDefaults.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap", - "-Xcc", - "-fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", ); + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/firebase-ios-sdk/CoreOnly/Sources/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/checkouts/promises/Sources/FBLPromises/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsTarget/FirebaseAnalyticsTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseAnalyticsWrapper/FirebaseAnalyticsWrapper.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCore/FirebaseCore.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCoreExtension/FirebaseCoreExtension.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseCrashlytics/FirebaseCrashlytics.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseInstallations/FirebaseInstallations.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/FirebaseSessionsObjC/FirebaseSessionsObjC.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAdsOnDeviceConversionTarget/GoogleAdsOnDeviceConversionTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleAppMeasurementTarget/GoogleAppMeasurementTarget.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleDataTransport/GoogleDataTransport.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_AppDelegateSwizzler/GoogleUtilities_AppDelegateSwizzler.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Environment/GoogleUtilities_Environment.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Logger/GoogleUtilities_Logger.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_MethodSwizzler/GoogleUtilities_MethodSwizzler.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_NSData/GoogleUtilities_NSData.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Network/GoogleUtilities_Network.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_Reachability/GoogleUtilities_Reachability.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/GoogleUtilities_UserDefaults/GoogleUtilities_UserDefaults.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/nanopb/nanopb.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../Tuist/.build/tuist-derived/third_party_IsAppEncrypted/third_party_IsAppEncrypted.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = App; SDKROOT = iphoneos; diff --git a/Modules/App/App.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/App/App.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index 652100b7..1318fe78 100644 --- a/Modules/App/App.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/App/App.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -16,7 +16,7 @@ isShown orderHint - 30 + 32 diff --git a/Modules/App/Project.swift b/Modules/App/Project.swift index 07318d7e..17a53177 100644 --- a/Modules/App/Project.swift +++ b/Modules/App/Project.swift @@ -38,6 +38,7 @@ let project = Project( infoPlist: .extendingDefault( with: [ "API_BASE_URL": "$(API_BASE_URL)", + "KAKAO_NATIVE_APP_KEY": "$(KAKAO_NATIVE_APP_KEY)", "CFBundleDisplayName": "$(APP_DISPLAY_NAME)", "CFBundleShortVersionString": "$(MARKETING_VERSION)", "CFBundleVersion": "$(CURRENT_PROJECT_VERSION)", @@ -68,13 +69,24 @@ let project = Project( [ "CFBundleURLName": "$(PRODUCT_BUNDLE_IDENTIFIER)", "CFBundleURLSchemes": ["newdok"] + ], + [ + "CFBundleURLName": "kakao", + "CFBundleURLSchemes": ["kakao$(KAKAO_NATIVE_APP_KEY)"] ] ], + "LSApplicationQueriesSchemes": [ + "kakaokompassauth", + "kakaotalk", + "kakaolink", + "kakaoplus" + ], "ITSAppUsesNonExemptEncryption": false ] ), sources: ["Sources/**"], resources: ["Resources/**"], + entitlements: "App.entitlements", dependencies: [ // Infrastructure .networkKit, diff --git a/Modules/App/Sources/DI/AppContainer.swift b/Modules/App/Sources/DI/AppContainer.swift index 56128ab9..1601c7f8 100644 --- a/Modules/App/Sources/DI/AppContainer.swift +++ b/Modules/App/Sources/DI/AppContainer.swift @@ -95,6 +95,7 @@ final class AppContainer { onBack: @escaping () -> Void, onRecovery: @escaping () -> Void, onSignup: @escaping () -> Void, + onNeedSignup: @escaping (String, String?) -> Void, onAuthenticated: @escaping () -> Void ) -> some View { authBuilder.makeLoginView( @@ -102,17 +103,22 @@ final class AppContainer { onBack: onBack, onRecovery: onRecovery, onSignup: onSignup, + onNeedSignup: onNeedSignup, onAuthenticated: onAuthenticated ) } func makeSignupView( + signupToken: String, + nickname: String?, onBack: @escaping () -> Void, onLogin: @escaping () -> Void, onRecovery: @escaping () -> Void, onAuthenticated: @escaping () -> Void ) -> some View { authBuilder.makeSignupView( + signupToken: signupToken, + nickname: nickname, onBack: onBack, onLogin: onLogin, onRecovery: onRecovery, diff --git a/Modules/App/Sources/Navigation/AuthFlow.swift b/Modules/App/Sources/Navigation/AuthFlow.swift index 790c1709..eeb96a1f 100644 --- a/Modules/App/Sources/Navigation/AuthFlow.swift +++ b/Modules/App/Sources/Navigation/AuthFlow.swift @@ -20,8 +20,9 @@ struct AuthFlow: View { private func routeView(_ route: AuthRoute) -> some View { switch route { case .onboarding: + // 소셜 로그인: 직접 회원가입 진입 없음 — 회원가입 버튼도 로그인 화면으로 container.makeOnboardingView( - onSignup: { router.push(.signup) }, + onSignup: { router.push(.login) }, onLogin: { router.push(.login) } ) case .login: @@ -29,11 +30,16 @@ struct AuthFlow: View { canGoBack: !router.path.isEmpty, onBack: { router.pop() }, onRecovery: { router.push(.recovery) }, - onSignup: { router.push(.signup) }, + onSignup: { router.push(.login) }, + onNeedSignup: { token, nickname in + router.push(.signup(signupToken: token, nickname: nickname)) + }, onAuthenticated: { coordinator.finishAuth() } ) - case .signup: + case let .signup(token, nickname): container.makeSignupView( + signupToken: token, + nickname: nickname, onBack: { router.pop() }, onLogin: { router.push(.login) }, onRecovery: { router.push(.recovery) }, @@ -42,7 +48,7 @@ struct AuthFlow: View { case .recovery: container.makeRecoveryView( onBack: { router.pop() }, - onSignup: { router.push(.signup) }, + onSignup: { router.push(.login) }, onLogin: { router.push(.login) }, onServiceFeedback: { router.push(.serviceFeedback) } ) diff --git a/Modules/App/Sources/Navigation/AuthRoute.swift b/Modules/App/Sources/Navigation/AuthRoute.swift index 8d9fd199..639d4752 100644 --- a/Modules/App/Sources/Navigation/AuthRoute.swift +++ b/Modules/App/Sources/Navigation/AuthRoute.swift @@ -1,7 +1,7 @@ enum AuthRoute: Hashable, Identifiable { case onboarding case login - case signup + case signup(signupToken: String, nickname: String?) case recovery case serviceFeedback diff --git a/Modules/App/Sources/Tabs/BookmarkStack.swift b/Modules/App/Sources/Tabs/BookmarkStack.swift index b7787a83..cdb17f91 100644 --- a/Modules/App/Sources/Tabs/BookmarkStack.swift +++ b/Modules/App/Sources/Tabs/BookmarkStack.swift @@ -36,7 +36,7 @@ struct BookmarkStack: View { container.makeBrandDetailView( id: id, onBack: { coordinator.bookmarkRouter.pop() }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onGoHome: { coordinator.goHome() }, onArticleTap: { coordinator.bookmarkRouter.push(.articleDetail(id: $0, isPast: true)) } ) diff --git a/Modules/App/Sources/Tabs/ExploreStack.swift b/Modules/App/Sources/Tabs/ExploreStack.swift index 371298a4..050456a6 100644 --- a/Modules/App/Sources/Tabs/ExploreStack.swift +++ b/Modules/App/Sources/Tabs/ExploreStack.swift @@ -12,7 +12,7 @@ struct ExploreStack: View { exploreTrigger: coordinator.exploreTrigger, onConsumePending: { coordinator.consumeExploreParams() }, onSearch: { coordinator.exploreRouter.push(.search) }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onLogin: { coordinator.presentAuth(.login) }, onEditProfile: { coordinator.openEditProfile() }, onBrandTap: { coordinator.exploreRouter.push(.brandDetail(id: $0)) } @@ -36,7 +36,7 @@ struct ExploreStack: View { container.makeBrandDetailView( id: id, onBack: { coordinator.exploreRouter.pop() }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onGoHome: { coordinator.goHome() }, onArticleTap: { coordinator.exploreRouter.push(.articleDetail(id: $0, isPast: true)) } ) diff --git a/Modules/App/Sources/Tabs/HomeStack.swift b/Modules/App/Sources/Tabs/HomeStack.swift index a5535240..232c9aa8 100644 --- a/Modules/App/Sources/Tabs/HomeStack.swift +++ b/Modules/App/Sources/Tabs/HomeStack.swift @@ -11,7 +11,7 @@ struct HomeStack: View { container.makeHomeView( onArticleTap: { coordinator.homeRouter.push(.articleDetail(id: $0, isPast: false)) }, onSearch: { coordinator.homeRouter.push(.search) }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onLogin: { coordinator.presentAuth(.login) }, onGoToExplore: { day, tab in coordinator.moveToExplore(day: day, tab: tab) } ) @@ -38,7 +38,7 @@ struct HomeStack: View { container.makeBrandDetailView( id: id, onBack: { coordinator.homeRouter.pop() }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onGoHome: { coordinator.goHome() }, onArticleTap: { coordinator.homeRouter.push(.articleDetail(id: $0, isPast: true)) } ) diff --git a/Modules/App/Sources/Tabs/SubscribeStack.swift b/Modules/App/Sources/Tabs/SubscribeStack.swift index e342c802..27da2de5 100644 --- a/Modules/App/Sources/Tabs/SubscribeStack.swift +++ b/Modules/App/Sources/Tabs/SubscribeStack.swift @@ -32,7 +32,7 @@ struct SubscribeStack: View { container.makeBrandDetailView( id: id, onBack: { coordinator.subscribeRouter.pop() }, - onSignup: { coordinator.presentAuth(.signup) }, + onSignup: { coordinator.presentAuth(.login) }, onGoHome: { coordinator.goHome() }, onArticleTap: { coordinator.subscribeRouter.push(.articleDetail(id: $0, isPast: true)) } ) diff --git a/Modules/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift b/Modules/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift index 0feaa448..e2eeccee 100644 --- a/Modules/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift +++ b/Modules/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift @@ -44,6 +44,7 @@ public enum DesignSystemAsset: Sendable { public static let font = DesignSystemImages(name: "font") public static let highlight = DesignSystemImages(name: "highlight") public static let home = DesignSystemImages(name: "home") + public static let kakaoBubble = DesignSystemImages(name: "kakaoBubble") public static let letter = DesignSystemImages(name: "letter") public static let logo = DesignSystemImages(name: "logo") public static let mailbox = DesignSystemImages(name: "mailbox") diff --git a/Modules/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift b/Modules/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift index 2d4b511f..7ffa9857 100644 --- a/Modules/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift +++ b/Modules/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift @@ -8,59 +8,49 @@ public import Foundation #else import Foundation #endif -// MARK: - Swift Bundle Accessor for Static Frameworks +// MARK: - Swift Bundle Accessor - for SPM +private class BundleFinder {} extension Foundation.Bundle { -/// Since DesignSystem is a static framework, a cut down framework is embedded, with all the resources but only a stub Mach-O image. +/// Since DesignSystem is a static framework, the bundle containing the resources is copied into the final product. static let module: Bundle = { - class BundleFinder {} - let hostBundle = Bundle(for: BundleFinder.self) - var candidates: [URL?] = [ - hostBundle.privateFrameworksURL, - hostBundle.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL, - hostBundle.bundleURL.deletingLastPathComponent(), - hostBundle.resourceURL, - Bundle.main.privateFrameworksURL, - Bundle.main.bundleURL.appendingPathComponent("Frameworks"), - Bundle.main.bundleURL, - Bundle.main.resourceURL, - // App extensions are placed under PlugIns/ in the host app bundle. - // Navigate up from the extension to the containing app's Frameworks directory. - hostBundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Frameworks"), - ].map({ $0?.appendingPathComponent("DesignSystem.framework") }) - - for candidate in candidates { - if let bundle = candidate.flatMap(Bundle.init(url:)) { - return bundle - } - } - - var bundleCandidates: [URL?] = [ - hostBundle.resourceURL, - hostBundle.bundleURL, - hostBundle.privateFrameworksURL, - hostBundle.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL.deletingLastPathComponent(), + let bundleName = "DesignSystem_DesignSystem" + let bundleFinderResourceURL = Bundle(for: BundleFinder.self).resourceURL + var candidates = [ Bundle.main.resourceURL, + bundleFinderResourceURL, Bundle.main.bundleURL, - Bundle.main.privateFrameworksURL, - Bundle.main.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Frameworks"), ] - if ProcessInfo.processInfo.processName == "xctest" - || ProcessInfo.processInfo.processName == "swift-testing" - { - bundleCandidates.append(hostBundle.bundleURL.appendingPathComponent("..")) + // This is a fix to make Previews work with bundled resources. + // Logic here is taken from SPM's generated `resource_bundle_accessors.swift` file, + // which is located under the derived data directory after building the project. + if let override = ProcessInfo.processInfo.environment["PACKAGE_RESOURCE_BUNDLE_PATH"] { + candidates.append(URL(fileURLWithPath: override)) + // Deleting derived data and not rebuilding the frameworks containing resources may result in a state + // where the bundles are only available in the framework's directory that is actively being previewed. + // Since we don't know which framework this is, we also need to look in all the framework subpaths. + if let subpaths = try? Foundation.FileManager.default.contentsOfDirectory(atPath: override) { + for subpath in subpaths { + if subpath.hasSuffix(".framework") { + candidates.append(URL(fileURLWithPath: override + "/" + subpath)) + } + } + } } - for candidate in bundleCandidates { - let bundlePath = candidate?.appendingPathComponent("DesignSystem_DesignSystem.bundle") + // This is a fix to make unit tests work with bundled resources. + // Making this change allows unit tests to search one directory up for a bundle. + // More context can be found in this PR: https://github.com/tuist/tuist/pull/6895 + #if canImport(XCTest) + candidates.append(bundleFinderResourceURL?.appendingPathComponent("..")) + #endif + + for candidate in candidates { + let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle") if let bundle = bundlePath.flatMap(Bundle.init(url:)) { return bundle } } - - return Bundle.main + fatalError("unable to find bundle named DesignSystem_DesignSystem") }() } // MARK: - Objective-C Bundle Accessor diff --git a/Modules/DesignSystem/DesignSystem.xcodeproj/project.pbxproj b/Modules/DesignSystem/DesignSystem.xcodeproj/project.pbxproj index 2a6d31e0..ffd6a19d 100644 --- a/Modules/DesignSystem/DesignSystem.xcodeproj/project.pbxproj +++ b/Modules/DesignSystem/DesignSystem.xcodeproj/project.pbxproj @@ -8,23 +8,23 @@ /* Begin PBXBuildFile section */ 07AB90021A70B1D55E233DDA /* NoDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF6A52DBE12C84500829BA2 /* NoDataView.swift */; }; - 0BFDC77A09ED37206E78FD25 /* SpoqaHanSansNeo-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = D45E4F8E9B8A1813A5ADE0C1 /* SpoqaHanSansNeo-Light.otf */; }; 10CD774838BC725239E13F32 /* ServerErrorPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB10DEC593FE87C6FF2F2CEF /* ServerErrorPopupView.swift */; }; - 13DF60422EC2F2B2EBA47DB5 /* SpoqaHanSansNeo-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 56DFA51B1676775D07DC3DD2 /* SpoqaHanSansNeo-Regular.otf */; }; 17F1EA7C9E3FF456C6E7A249 /* DesignToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492AE22B6B053E92F864EFAD /* DesignToken.swift */; }; 1A358594D74B1F60E1BF9612 /* SubscribeCheckPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470F5079EDDB033641E50DED /* SubscribeCheckPopupView.swift */; }; 1FA24D3FDDFF21AFE5CFC0D9 /* NetworkErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43927DC076C8D16C0564FAD5 /* NetworkErrorView.swift */; }; + 222061C7A7A3B1724EA3FFF4 /* SpoqaHanSansNeo-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3A89362609648144517CFE75 /* SpoqaHanSansNeo-Medium.otf */; }; 25340958D416067BB478FB71 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28746752247E3911CD5C3C07 /* Kingfisher.framework */; }; 2C2A6F1B0843699ACFE53D23 /* TuistFonts+DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1489E7809DA4DADA471C2CDC /* TuistFonts+DesignSystem.swift */; }; - 317C16F03A5E8BF0EA256954 /* SpoqaHanSansNeo-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3A89362609648144517CFE75 /* SpoqaHanSansNeo-Medium.otf */; }; + 2EDDF3D2C0A79069831FB1B8 /* SpoqaHanSansNeo-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = D45E4F8E9B8A1813A5ADE0C1 /* SpoqaHanSansNeo-Light.otf */; }; 3C49F77F8ACF1FC3BD37A181 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ED3D8DA640FE3624B7ACF45 /* LoadingView.swift */; }; 41412A573756BE6C91B6AA4D /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1516FE4B1E4C70074B90CC52 /* ToastView.swift */; }; 4A114BB04ACEC0F11EF431BE /* CheckIsSubscribeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8855864E885ED8AA71D9183 /* CheckIsSubscribeView.swift */; }; - 4C768B0DAB889891D8E0145C /* SpoqaHanSansNeo-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1CFCDF29DFB293A9C3F9D6D9 /* SpoqaHanSansNeo-Bold.otf */; }; + 4B40701BFDF0C8C2E2EEB8C2 /* load.gif in Resources */ = {isa = PBXBuildFile; fileRef = 48854A6B16F3CFBA5DA0F0AD /* load.gif */; }; 4D1C8FAC5AA3A85D2B2BFAAF /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B424097EED4FD25BE22C5E1 /* Color+Extension.swift */; }; 574EA4DB241751A576797002 /* NotRegisteredIdPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF5531123A3004A8540D621 /* NotRegisteredIdPopupView.swift */; }; 640485EA967CD4669600CD37 /* SwipeBackHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71BC3474A53F2F77D7EB19EC /* SwipeBackHandler.swift */; }; 654333589294F1C702FC438B /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 56A7772AA0518B04428BE5C5 /* Shared.framework */; }; + 6730CF576CD7C88793997534 /* Assets.xcassets in Sources */ = {isa = PBXBuildFile; fileRef = 4F6AF114A38FDBD9663A6B1B /* Assets.xcassets */; }; 68B44B93AD7ED2B47CD71A4A /* SubscribeGuestAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04616C3C5DB23A49097D3BF /* SubscribeGuestAlertView.swift */; }; 6F4DC4FB98D3EF58306E1CDA /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86103BCC821FCC1FE2B9F3CD /* BackButton.swift */; }; 70C7D51B82F95045C9DDF2D0 /* LottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F249E8F2A7648435125CF681 /* LottieView.swift */; }; @@ -37,28 +37,39 @@ 90D6A5AEB9B8DACDEBE64A29 /* SystemErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE683B09BDE84B3483EE6137 /* SystemErrorView.swift */; }; 963BD2E45D7172CE4BF69364 /* VerificationButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DEFF305135085B93F19593 /* VerificationButtonStyle.swift */; }; 995B9101E7615E81051315F2 /* ServerErrorPopupModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C99E8042EF39E3FF60FBED8 /* ServerErrorPopupModifier.swift */; }; - 99AD012E16AE91B0DA8273E7 /* SpoqaHanSansNeo-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1EAA4A417D2996F4DF2DED40 /* SpoqaHanSansNeo-Thin.otf */; }; A202EC13E48DCA48C5318D26 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6654808CA89C3FC25B33948 /* PopupView.framework */; }; + A34723E76FBB0E7BC50177C2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F6AF114A38FDBD9663A6B1B /* Assets.xcassets */; }; AB862E59C188B650427CF4E2 /* LoadingDotsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531101C9CF4F7EADA8C4F207 /* LoadingDotsView.swift */; }; ABB14811E13F7B1ECCF8B086 /* TuistAssets+DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5263BC75B281154AC0B5A7B /* TuistAssets+DesignSystem.swift */; }; BC4360B914A0E6C10A4A851E /* CheckSubscribeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CF8A496C7E691DCF3A7C603 /* CheckSubscribeView.swift */; }; BDD988384DEC9A8C4E1B5F71 /* PullToRefreshView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 480127A043369072FC6A4A0E /* PullToRefreshView.swift */; }; C35D008C753D8412BCE4632E /* EmailInfoModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0409EEB7627BF07C31330B2A /* EmailInfoModalView.swift */; }; + C5ED47454F1440981737F4E0 /* SpoqaHanSansNeo-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 56DFA51B1676775D07DC3DD2 /* SpoqaHanSansNeo-Regular.otf */; }; C762D2313D50B4F194A883EA /* SubscribeModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5A82649FDA27AE6DC525DF /* SubscribeModalView.swift */; }; - C76B2F629431891F99DAB0A3 /* load.gif in Resources */ = {isa = PBXBuildFile; fileRef = 48854A6B16F3CFBA5DA0F0AD /* load.gif */; }; D077CFC5DD281F26BDA2376F /* AuthFailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41950894E4E9C8FF11201792 /* AuthFailView.swift */; }; - D2E21543F5B3B63472BE98A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F6AF114A38FDBD9663A6B1B /* Assets.xcassets */; }; D35DFD63D8CD70868B230DA2 /* CustomTextFieldModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B4CDA86843A89A3AD229E60 /* CustomTextFieldModifier.swift */; }; D748D56D7CAC703E51B32DD4 /* CalendarPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743901F00E06BB210FBD1E5B /* CalendarPopupView.swift */; }; E3003B318BD827C1E876F9C9 /* UnsubscribePopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A1DCEB0845AC2B2D687FA2A /* UnsubscribePopupView.swift */; }; E4DAAFF70B6D667729E15EDE /* LoginErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3CC877F7AECA4386F75D208 /* LoginErrorView.swift */; }; + E581A24F3469865C4F8CB742 /* SpoqaHanSansNeo-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1EAA4A417D2996F4DF2DED40 /* SpoqaHanSansNeo-Thin.otf */; }; E76992BBB4AB0B14426864B0 /* OverlayRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C517C8B4DCEC79C458B727 /* OverlayRootView.swift */; }; EA14ADB3FF1DCA11D8B9D962 /* ColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD516035027585AFC53F053 /* ColorPalette.swift */; }; EBF8A05ADDF1FF48833C370E /* BirthYearPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7519630D4BA8D550F1D471 /* BirthYearPickerView.swift */; }; F6018B5F7748E322214C52D6 /* TuistBundle+DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4AD9735556ECA8C8008FEC /* TuistBundle+DesignSystem.swift */; }; F69B0539C8191095A861614C /* SubscribeStatePopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCE4C52744BC5AEDA5913B79 /* SubscribeStatePopupView.swift */; }; + F8D28129A82E22B7978D772C /* SpoqaHanSansNeo-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1CFCDF29DFB293A9C3F9D6D9 /* SpoqaHanSansNeo-Bold.otf */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 4A4956649CBDCC6BF0221AD1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F639F9585E77B0BBBB642E14 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C777EA7684CF3B97BE76C38C; + remoteInfo = DesignSystem_DesignSystem; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 261A68F06D4B4813FC5879A5 /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; @@ -70,6 +81,16 @@ name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; + 3FBA6A1C0FF2C099107F7C40 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 49C4A8593835DDF36FBC2A05 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -97,6 +118,7 @@ 28746752247E3911CD5C3C07 /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3A89362609648144517CFE75 /* SpoqaHanSansNeo-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpoqaHanSansNeo-Medium.otf"; sourceTree = ""; }; 41950894E4E9C8FF11201792 /* AuthFailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFailView.swift; sourceTree = ""; }; + 42D7C40704F4FCBCDB855667 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 43927DC076C8D16C0564FAD5 /* NetworkErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkErrorView.swift; sourceTree = ""; }; 470F5079EDDB033641E50DED /* SubscribeCheckPopupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeCheckPopupView.swift; sourceTree = ""; }; 480127A043369072FC6A4A0E /* PullToRefreshView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PullToRefreshView.swift; sourceTree = ""; }; @@ -132,12 +154,20 @@ CE5A82649FDA27AE6DC525DF /* SubscribeModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeModalView.swift; sourceTree = ""; }; D45E4F8E9B8A1813A5ADE0C1 /* SpoqaHanSansNeo-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpoqaHanSansNeo-Light.otf"; sourceTree = ""; }; D8855864E885ED8AA71D9183 /* CheckIsSubscribeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckIsSubscribeView.swift; sourceTree = ""; }; + DDA12AD00E98A3497D3A729E /* DesignSystem_DesignSystem-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DesignSystem_DesignSystem-Info.plist"; sourceTree = ""; }; DE683B09BDE84B3483EE6137 /* SystemErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemErrorView.swift; sourceTree = ""; }; F04616C3C5DB23A49097D3BF /* SubscribeGuestAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeGuestAlertView.swift; sourceTree = ""; }; F249E8F2A7648435125CF681 /* LottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1964AC1CF76FA8EBDF2A15A1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 21D2E38EFDFDB350406F7982 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -238,6 +268,7 @@ 82664F67710540CBDEBE5B11 /* Products */ = { isa = PBXGroup; children = ( + 42D7C40704F4FCBCDB855667 /* DesignSystem_DesignSystem.bundle */, 69B7BBEAD5472C7195924AC8 /* DesignSystem.framework */, 28746752247E3911CD5C3C07 /* Kingfisher.framework */, B6654808CA89C3FC25B33948 /* PopupView.framework */, @@ -347,6 +378,7 @@ F2F0D6EECE384EBEC3AFDEB4 /* InfoPlists */ = { isa = PBXGroup; children = ( + DDA12AD00E98A3497D3A729E /* DesignSystem_DesignSystem-Info.plist */, 8937FA9427EEA938B58C5B3E /* DesignSystem-Info.plist */, ); path = InfoPlists; @@ -376,6 +408,7 @@ buildRules = ( ); dependencies = ( + 5EE60265510B17C28AE5EBA4 /* PBXTargetDependency */, ); name = DesignSystem; packageProductDependencies = ( @@ -384,6 +417,26 @@ productReference = 69B7BBEAD5472C7195924AC8 /* DesignSystem.framework */; productType = "com.apple.product-type.framework"; }; + C777EA7684CF3B97BE76C38C /* DesignSystem_DesignSystem */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05AE9C11574FFE2195EAFA90 /* Build configuration list for PBXNativeTarget "DesignSystem_DesignSystem" */; + buildPhases = ( + 97B9A85DB0C77866043716C8 /* Sources */, + B43C3DC03910608BAD041023 /* Resources */, + 1964AC1CF76FA8EBDF2A15A1 /* Frameworks */, + 3FBA6A1C0FF2C099107F7C40 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DesignSystem_DesignSystem; + packageProductDependencies = ( + ); + productName = DesignSystem_DesignSystem; + productReference = 42D7C40704F4FCBCDB855667 /* DesignSystem_DesignSystem.bundle */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -409,6 +462,7 @@ projectRoot = ""; targets = ( 83C9B5D1938C22907FF6E247 /* DesignSystem */, + C777EA7684CF3B97BE76C38C /* DesignSystem_DesignSystem */, ); }; /* End PBXProject section */ @@ -418,19 +472,33 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D2E21543F5B3B63472BE98A1 /* Assets.xcassets in Resources */, - 4C768B0DAB889891D8E0145C /* SpoqaHanSansNeo-Bold.otf in Resources */, - 0BFDC77A09ED37206E78FD25 /* SpoqaHanSansNeo-Light.otf in Resources */, - 317C16F03A5E8BF0EA256954 /* SpoqaHanSansNeo-Medium.otf in Resources */, - 13DF60422EC2F2B2EBA47DB5 /* SpoqaHanSansNeo-Regular.otf in Resources */, - 99AD012E16AE91B0DA8273E7 /* SpoqaHanSansNeo-Thin.otf in Resources */, - C76B2F629431891F99DAB0A3 /* load.gif in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B43C3DC03910608BAD041023 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A34723E76FBB0E7BC50177C2 /* Assets.xcassets in Resources */, + F8D28129A82E22B7978D772C /* SpoqaHanSansNeo-Bold.otf in Resources */, + 2EDDF3D2C0A79069831FB1B8 /* SpoqaHanSansNeo-Light.otf in Resources */, + 222061C7A7A3B1724EA3FFF4 /* SpoqaHanSansNeo-Medium.otf in Resources */, + C5ED47454F1440981737F4E0 /* SpoqaHanSansNeo-Regular.otf in Resources */, + E581A24F3469865C4F8CB742 /* SpoqaHanSansNeo-Thin.otf in Resources */, + 4B40701BFDF0C8C2E2EEB8C2 /* load.gif in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 97B9A85DB0C77866043716C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; BA6DF36C53063F00B80115EA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -438,6 +506,7 @@ ABB14811E13F7B1ECCF8B086 /* TuistAssets+DesignSystem.swift in Sources */, F6018B5F7748E322214C52D6 /* TuistBundle+DesignSystem.swift in Sources */, 2C2A6F1B0843699ACFE53D23 /* TuistFonts+DesignSystem.swift in Sources */, + 6730CF576CD7C88793997534 /* Assets.xcassets in Sources */, 6F4DC4FB98D3EF58306E1CDA /* BackButton.swift in Sources */, 963BD2E45D7172CE4BF69364 /* VerificationButtonStyle.swift in Sources */, 4D1C8FAC5AA3A85D2B2BFAAF /* Color+Extension.swift in Sources */, @@ -480,7 +549,43 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 5EE60265510B17C28AE5EBA4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DesignSystem_DesignSystem; + target = C777EA7684CF3B97BE76C38C /* DesignSystem_DesignSystem */; + targetProxy = 4A4956649CBDCC6BF0221AD1 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 06FE36F5BCD04B71D2901212 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GENERATE_MASTER_OBJECT_FILE = NO; + INFOPLIST_FILE = "Derived/InfoPlists/DesignSystem_DesignSystem-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newdok.designsystem.generated.resources; + PRODUCT_NAME = DesignSystem_DesignSystem; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = ""; + }; + name = Debug; + }; 0C02DEECDC95653FCDD00F9F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -499,6 +604,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; + PACKAGE_RESOURCE_BUNDLE_NAME = DesignSystem_DesignSystem; PRODUCT_BUNDLE_IDENTIFIER = com.newdok.designsystem; PRODUCT_NAME = DesignSystem; SDKROOT = iphoneos; @@ -539,6 +645,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; + PACKAGE_RESOURCE_BUNDLE_NAME = DesignSystem_DesignSystem; PRODUCT_BUNDLE_IDENTIFIER = com.newdok.designsystem; PRODUCT_NAME = DesignSystem; SDKROOT = iphoneos; @@ -616,6 +723,29 @@ }; name = Debug; }; + 85B6B79ADD7A4E7548F316CC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GENERATE_MASTER_OBJECT_FILE = NO; + INFOPLIST_FILE = "Derived/InfoPlists/DesignSystem_DesignSystem-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newdok.designsystem.generated.resources; + PRODUCT_NAME = DesignSystem_DesignSystem; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = ""; + }; + name = Release; + }; 88DC404DB5E70F332291F97C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -672,6 +802,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 05AE9C11574FFE2195EAFA90 /* Build configuration list for PBXNativeTarget "DesignSystem_DesignSystem" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 06FE36F5BCD04B71D2901212 /* Debug */, + 85B6B79ADD7A4E7548F316CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5C0CBBA2BFE0CEE21375AF0A /* Build configuration list for PBXProject "DesignSystem" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Modules/DesignSystem/DesignSystem.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/DesignSystem/DesignSystem.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index dc4e9aa9..cadebdd0 100644 --- a/Modules/DesignSystem/DesignSystem.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/DesignSystem/DesignSystem.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -11,6 +11,13 @@ orderHint 9 + DesignSystem_DesignSystem.xcscheme_^#shared#^_ + + isShown + + orderHint + 10 + diff --git a/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/Contents.json b/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/Contents.json new file mode 100644 index 00000000..be4b98c0 --- /dev/null +++ b/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "kakaoBubble.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/kakaoBubble.pdf b/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/kakaoBubble.pdf new file mode 100644 index 00000000..ba8f3d96 Binary files /dev/null and b/Modules/DesignSystem/Resources/Assets.xcassets/kakaoBubble.imageset/kakaoBubble.pdf differ diff --git a/Modules/Features/Auth/Auth.xcodeproj/project.pbxproj b/Modules/Features/Auth/Auth.xcodeproj/project.pbxproj index b146bf3e..10a6d7be 100644 --- a/Modules/Features/Auth/Auth.xcodeproj/project.pbxproj +++ b/Modules/Features/Auth/Auth.xcodeproj/project.pbxproj @@ -8,20 +8,20 @@ /* Begin PBXBuildFile section */ 031E2B926BC3F4B22BBFCA35 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 62778DFF53ACB46ECC6F5F35 /* NetworkKit.framework */; }; + 05B26DCC15BAC48E1F871A86 /* AppleAuthServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0BAEBE3CDD9B85B10AE26D /* AppleAuthServiceProtocol.swift */; }; 068F8D60BA7BADAEE244105C /* LoginError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7179D642D174007438E18BB /* LoginError.swift */; }; 06C7F1D619C3D8813EC698DC /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADA7DDBBA02C09D5678982D1 /* LoginViewModel.swift */; }; 0AAC727B5804E8861378DBA9 /* AuthErrorResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8002CFA53E586CEF850C3B0A /* AuthErrorResponseDTO.swift */; }; - 0C8A59F69E82B238BBACE038 /* PwInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C904E1C986F43E7E3173A68 /* PwInputView.swift */; }; 0DD4957EB4B1CA41581F98F0 /* AuthLoginResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 252C2F86266EE72217090DE5 /* AuthLoginResponseDTO.swift */; }; 0F56C20E1DA7712315D9E806 /* AuthUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D19C06CB9237BDD75BDE6D0 /* AuthUser.swift */; }; 11398BE7E7D82516E37D424D /* SignupFormatStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2A7B152CF8BFC2A33B5864 /* SignupFormatStyle.swift */; }; 122C53001252A72B60454C84 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FDB1F539F81A1BE90F87D4C /* Kingfisher.framework */; }; 132D2FA4E5F037EC5B17C668 /* AuthInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5E69594651E831F6B39550 /* AuthInterface.swift */; }; + 137BF12EC0FDBB780C48D99B /* KakaoSDKUser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF43922EE1D6125FE8B383ED /* KakaoSDKUser.framework */; }; 1463124D79BBAFE03BC7BF17 /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 62778DFF53ACB46ECC6F5F35 /* NetworkKit.framework */; }; 15945F0A7DFC670E3A6F579E /* AuthDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */; }; 1637E15B361BE0077BB2E4A4 /* AuthSignupResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AF374FFD2C1DCB9C67C232 /* AuthSignupResponse.swift */; }; 16D5D214569544F40FBBDB04 /* AuthTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9479B1142A48D6DA9E15EB /* AuthTests.swift */; }; - 1BABD6D99B96B85A977A088C /* AuthSMSResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7943E1660F0F8C03171DA01B /* AuthSMSResponseDTO.swift */; }; 1F96AE8D6C41A9E6FC6BA978 /* AuthInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = BE8C09C4CE36E3D06B61DAB5 /* AuthInterface.framework */; }; 1FE2762E1914BB12D2471757 /* AuthData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC8AEB8E0082B038CB7521FA /* AuthData.framework */; }; 20967759C2FB3DD4A69AE22C /* AuthMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083CBFE74C9E7F71EDD0C703 /* AuthMain.swift */; }; @@ -30,59 +30,68 @@ 282B5EF203975D1974BBA825 /* AuthDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B7EBA8D7806B48F8D71D29A /* AuthDIContainer.swift */; }; 2A7224C686420CFF1A66C683 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D56B45D644E0B2DBA11EEC /* Moya.framework */; }; 2B882611CD5D55FF9AA4BA30 /* CurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5156C9688647B73261D5AA /* CurationView.swift */; }; + 2D93D0C06F2FDF0903805593 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 78FF525D0E8F54DA8ADC5422 /* Alamofire_Alamofire.bundle */; }; 30FBE074985429C4E16AC952 /* AuthInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE8C09C4CE36E3D06B61DAB5 /* AuthInterface.framework */; }; - 317F10B7A78A02208AD5F199 /* AuthSimpleUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A168642EA52AD1A834F65CA /* AuthSimpleUser.swift */; }; 32D5A7DC8F48CD0FCC017BC4 /* FoundationKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 29FA6C20A6564CB1A65D83B5 /* FoundationKit.framework */; }; 3439C05F4186A8EAEAB3AAC7 /* AuthInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = BE8C09C4CE36E3D06B61DAB5 /* AuthInterface.framework */; }; 38885CC0C2414879F652B0A7 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D55F8F97BF588B8074069DA /* Shared.framework */; }; 394486121B1C9520A5164E43 /* AuthData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = FC8AEB8E0082B038CB7521FA /* AuthData.framework */; }; 3DE41050BD58F53CEBF1CD89 /* SignupUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189DB6C61185D4742A4F68D5 /* SignupUseCaseImpl.swift */; }; + 4305092A6017903397FDA5DD /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 2D55F8F97BF588B8074069DA /* Shared.framework */; }; 452C194C93875A657D1EF472 /* PolicyWebSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CC431E5DC117F84221E3049 /* PolicyWebSheetView.swift */; }; 4AC581D077DF9A536B6119DD /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A03B7D8DBF8FA6DF9A7FAB5E /* PopupView.framework */; }; 54098FD0A269D65E21141F44 /* AuthRecommendedBrand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AEEA4760F10DA275AAD667C /* AuthRecommendedBrand.swift */; }; 57943534CBB1B0733A0580B1 /* OnboardingPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92D4A67D04128BB7B34CC41 /* OnboardingPageView.swift */; }; + 581473F58B2101FA8819F6FD /* KakaoAuthServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE015DFA89E6676D907A335 /* KakaoAuthServiceProtocol.swift */; }; 584FF6C187A388DDE2785C63 /* LoginUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E8500002BC4B6ABD877A90 /* LoginUseCase.swift */; }; 585839CA64514AE531B3B0E1 /* AuthUserDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B432D7D19D2651FD4EA9D0 /* AuthUserDTO.swift */; }; - 63C7E725C2305C1E327EBA3A /* AuthIDCheckResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ED3793EBF1965006A6246AA /* AuthIDCheckResult.swift */; }; 63F1911F5DA70E6FF6B0936C /* AuthDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */; }; 67B7704E819E86BACD4CF144 /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114EA565B42439D2BD31D001 /* LoginRequest.swift */; }; 684614D8E6FDC6F7CF4C413F /* SignupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F194D0253B7B41E31A2318E0 /* SignupViewModel.swift */; }; - 6A6F3F4667ED7D186BCA77C2 /* IDInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C581C211BB1E550A1B7F9F /* IDInputView.swift */; }; 6BAE6A217722795DA8B18F6E /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45A8BB59B621EFC832DCFE0F /* DesignSystem.framework */; }; 6DBDE15A3229AEC6AD04315F /* LoginUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6D3D3E4DD934FD1AB010EE7 /* LoginUseCaseImpl.swift */; }; 70FD0520699A99F87E907143 /* IndustrySurveyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529EEA7B499B7A83B7C62D3A /* IndustrySurveyView.swift */; }; + 713CD4B5400822ACBE3098A1 /* KakaoAuthService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D807F75F499DBD2AF39E92 /* KakaoAuthService.swift */; }; 71A2A19E91125B3B05216EEF /* SignupUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8FAA33147E7CBDF3C9BC71 /* SignupUseCase.swift */; }; - 88D7670D4BE1270B9CEC6115 /* SignupAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83317B7D942AFBFF7BF79908 /* SignupAPIRequest.swift */; }; + 78E4129880FADAC971EDCBA3 /* AuthAgreement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9157EC605745CAD73475CA84 /* AuthAgreement.swift */; }; + 7AF6C54D10C7AC3CAB25F44F /* KakaoSDKCommon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1327587164DBBAA16F3C33DE /* KakaoSDKCommon.framework */; }; 8E1720B8F639A95ABC17313B /* SignupCurationSkeletonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AC2DEAF917CC5E6CAE23A3 /* SignupCurationSkeletonView.swift */; }; + 8E1DE8EEA3B43CEEB1BC3350 /* SocialLoginResultType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 791F16AF341F57533D166B00 /* SocialLoginResultType.swift */; }; + 95708794CC0EFBB17C81A967 /* KakaoSDKUser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF43922EE1D6125FE8B383ED /* KakaoSDKUser.framework */; }; + 9ADF09FF06C78C632CCB3E3F /* KakaoSDKCommon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1327587164DBBAA16F3C33DE /* KakaoSDKCommon.framework */; }; 9D083976CECA423E68F0F099 /* AuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFBFB5E537C38ADF3FC6F51 /* AuthRepository.swift */; }; 9D88DB33AC00BF061BEFF003 /* AuthRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED7D603A82E085B8AD32B04F /* AuthRepositoryImpl.swift */; }; 9ECE5640A650A001E9195A0F /* AuthUserAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5BA7E5065E6BFA71F04B38E /* AuthUserAPI.swift */; }; 9F49D0A2DD12B3C6F2C9D9AA /* AuthBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDE7484E60F831CBAFFBD577 /* AuthBuilder.swift */; }; 9FD0E0B05397F67F37A1530A /* AuthTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5642BA06A94EBFDDB6B192CB /* AuthTesting.framework */; }; + A0136FA014429C88E340055B /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 053F11E926A414E7E0C9D2C3 /* DesignSystem_DesignSystem.bundle */; }; A47F3F9CC80909D5A826ED2E /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6061C08937A7986D4F7D042 /* LoginView.swift */; }; A5D92D5C6F4866C1716747F6 /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29FA6C20A6564CB1A65D83B5 /* FoundationKit.framework */; }; A873D6E66ACC7A15AE540405 /* BirthYearDropdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59EBC0CC5D916C5A4CB83108 /* BirthYearDropdown.swift */; }; + AD16ADE5EA0A857DC8FCA049 /* AuthSocialLoginResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DA3D0897326D379FB89FB89 /* AuthSocialLoginResponseDTO.swift */; }; AD2E02356CD05728AF7F6BED /* FoundationKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 29FA6C20A6564CB1A65D83B5 /* FoundationKit.framework */; }; ADD5AC589E22E51E680E9367 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 45A8BB59B621EFC832DCFE0F /* DesignSystem.framework */; }; - AE4E796AB6754D3972831029 /* AuthSimpleUserDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D73FBD79BD1D75BD7F6D35 /* AuthSimpleUserDTO.swift */; }; + B1B883AD5FA839D4A8A34813 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 053F11E926A414E7E0C9D2C3 /* DesignSystem_DesignSystem.bundle */; }; B1B8CA1ED66CA91DBA0C6606 /* AuthDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */; }; B3BCEF7C74425A532B13BCA1 /* AuthSignupResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65656E0C636D6AF23FD06E9 /* AuthSignupResponseDTO.swift */; }; - B99AFB0451E067C8FE60A309 /* PhoneNumberRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08278EF2ED11A60DB6D330B6 /* PhoneNumberRequest.swift */; }; - BB5132E0726E9AD5CDE5A167 /* AuthSMSResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9606FB084D1C548133A03A /* AuthSMSResponse.swift */; }; + BE76C14172FBC93CFF00C6EB /* SocialSignupRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3738B5D3CB94C1EAE7091C /* SocialSignupRequest.swift */; }; + BF9C7ADABAF6E76DBD66CC18 /* AppleAuthService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D1F0799992DED05F63CE19 /* AppleAuthService.swift */; }; CEECBC8150603B9D9911E035 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 2D55F8F97BF588B8074069DA /* Shared.framework */; }; CFC5F5E41FBB37824529D154 /* CompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BDA675B82B10EC8A13AFB6B /* CompleteView.swift */; }; D417671EFC2BB25A1ED34B9A /* AuthBrandListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89277BD77D124EAB69AE0989 /* AuthBrandListResponseDTO.swift */; }; DAB7DF3408A8935171BD2FAB /* SignupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61AAE20E84CFDA0CD5581B7 /* SignupView.swift */; }; DB7091B9F2506C318356C761 /* AgreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BDDFC6BDACA5DBB3EA0C30 /* AgreeView.swift */; }; - DEC116B8172E6EC0EE96B13D /* PhoneVerificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C9108C9EC4721DDB960586 /* PhoneVerificationView.swift */; }; + E1A5DE4105173FE48B0A8A12 /* KakaoSDKAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46E7D8C72118ED61834F52D6 /* KakaoSDKAuth.framework */; }; + E2D87D4F27F5006602D75147 /* KakaoSDKAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46E7D8C72118ED61834F52D6 /* KakaoSDKAuth.framework */; }; E446254DECC0CB9FABD7CF86 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 62778DFF53ACB46ECC6F5F35 /* NetworkKit.framework */; }; E57A016EEFDE2A1DEF13C80E /* CurationRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07848F750646D4321324EFC6 /* CurationRow.swift */; }; E5BC4A325DD1F4C9FFC406C6 /* ProfileInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEFBC36DB36A7FB5F4EF2146 /* ProfileInputView.swift */; }; E70B49DE0EB688032C6698F5 /* RecommendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF1746A90A2DDFCD5AE9CB3 /* RecommendView.swift */; }; + E8972536C344E7B0BDCDAD2D /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 78FF525D0E8F54DA8ADC5422 /* Alamofire_Alamofire.bundle */; }; + EBFC25633602E81D366CEF7F /* SocialProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC378D97E8C797A1B2CB788B /* SocialProvider.swift */; }; EEFF897EFB63EEF67243F2BF /* AuthTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A1EE55F16E7D24969D6632E /* AuthTesting.swift */; }; F42073A1A98F2AF60F8938C8 /* Auth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8895FC8BB8C3644A2923E77A /* Auth.framework */; }; F7B5E87E9981AE8BBA072E77 /* AuthDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */; }; - FC24FEA6A044D05C84A21BF3 /* SignupPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 809C13866FB7C74A59818EDF /* SignupPopupView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -155,6 +164,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 684EC3987431A3767320D468 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 2D93D0C06F2FDF0903805593 /* Alamofire_Alamofire.bundle in Dependencies */, + A0136FA014429C88E340055B /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 6B0F51A6942BBFE323B15EA1 /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; @@ -213,6 +233,7 @@ files = ( F7B5E87E9981AE8BBA072E77 /* AuthDomain.framework in Dependencies */, 1F96AE8D6C41A9E6FC6BA978 /* AuthInterface.framework in Dependencies */, + 4305092A6017903397FDA5DD /* Shared.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -256,69 +277,72 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 053F11E926A414E7E0C9D2C3 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 05A17C657D4A51BEE81CB99C /* OnboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardView.swift; sourceTree = ""; }; 07848F750646D4321324EFC6 /* CurationRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurationRow.swift; sourceTree = ""; }; - 08278EF2ED11A60DB6D330B6 /* PhoneNumberRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneNumberRequest.swift; sourceTree = ""; }; 083CBFE74C9E7F71EDD0C703 /* AuthMain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthMain.swift; sourceTree = ""; }; 0AEEA4760F10DA275AAD667C /* AuthRecommendedBrand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRecommendedBrand.swift; sourceTree = ""; }; - 0C904E1C986F43E7E3173A68 /* PwInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PwInputView.swift; sourceTree = ""; }; 0CC431E5DC117F84221E3049 /* PolicyWebSheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolicyWebSheetView.swift; sourceTree = ""; }; 10C1F41914414CE45C317D84 /* AuthData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "AuthData-Info.plist"; sourceTree = ""; }; 114EA565B42439D2BD31D001 /* LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginRequest.swift; sourceTree = ""; }; + 1327587164DBBAA16F3C33DE /* KakaoSDKCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KakaoSDKCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 189DB6C61185D4742A4F68D5 /* SignupUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupUseCaseImpl.swift; sourceTree = ""; }; - 18C9108C9EC4721DDB960586 /* PhoneVerificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneVerificationView.swift; sourceTree = ""; }; 1A1EE55F16E7D24969D6632E /* AuthTesting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTesting.swift; sourceTree = ""; }; 252C2F86266EE72217090DE5 /* AuthLoginResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthLoginResponseDTO.swift; sourceTree = ""; }; 27AC2DEAF917CC5E6CAE23A3 /* SignupCurationSkeletonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupCurationSkeletonView.swift; sourceTree = ""; }; 29FA6C20A6564CB1A65D83B5 /* FoundationKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FoundationKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2D55F8F97BF588B8074069DA /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2FDB1F539F81A1BE90F87D4C /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 31D1F0799992DED05F63CE19 /* AppleAuthService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleAuthService.swift; sourceTree = ""; }; 32B432D7D19D2651FD4EA9D0 /* AuthUserDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUserDTO.swift; sourceTree = ""; }; 3B5098B4E6393EB4AD46B5F8 /* AuthTesting-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "AuthTesting-Info.plist"; sourceTree = ""; }; 3D19C06CB9237BDD75BDE6D0 /* AuthUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUser.swift; sourceTree = ""; }; 3DF1746A90A2DDFCD5AE9CB3 /* RecommendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendView.swift; sourceTree = ""; }; 45A8BB59B621EFC832DCFE0F /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 46E7D8C72118ED61834F52D6 /* KakaoSDKAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KakaoSDKAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4DA3D0897326D379FB89FB89 /* AuthSocialLoginResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSocialLoginResponseDTO.swift; sourceTree = ""; }; 4F6F33418EB25913880BECBA /* AuthInterface-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "AuthInterface-Info.plist"; sourceTree = ""; }; 529EEA7B499B7A83B7C62D3A /* IndustrySurveyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndustrySurveyView.swift; sourceTree = ""; }; 5642BA06A94EBFDDB6B192CB /* AuthTesting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthTesting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59EBC0CC5D916C5A4CB83108 /* BirthYearDropdown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BirthYearDropdown.swift; sourceTree = ""; }; 5E5E69594651E831F6B39550 /* AuthInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInterface.swift; sourceTree = ""; }; - 5ED3793EBF1965006A6246AA /* AuthIDCheckResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthIDCheckResult.swift; sourceTree = ""; }; 62778DFF53ACB46ECC6F5F35 /* NetworkKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6B7EBA8D7806B48F8D71D29A /* AuthDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthDIContainer.swift; sourceTree = ""; }; + 6C3738B5D3CB94C1EAE7091C /* SocialSignupRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialSignupRequest.swift; sourceTree = ""; }; 6DFBFB5E537C38ADF3FC6F51 /* AuthRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepository.swift; sourceTree = ""; }; - 7943E1660F0F8C03171DA01B /* AuthSMSResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSMSResponseDTO.swift; sourceTree = ""; }; - 79D73FBD79BD1D75BD7F6D35 /* AuthSimpleUserDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSimpleUserDTO.swift; sourceTree = ""; }; + 78FF525D0E8F54DA8ADC5422 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 791F16AF341F57533D166B00 /* SocialLoginResultType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginResultType.swift; sourceTree = ""; }; 7BDA675B82B10EC8A13AFB6B /* CompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompleteView.swift; sourceTree = ""; }; 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8002CFA53E586CEF850C3B0A /* AuthErrorResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthErrorResponseDTO.swift; sourceTree = ""; }; - 809C13866FB7C74A59818EDF /* SignupPopupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupPopupView.swift; sourceTree = ""; }; - 83317B7D942AFBFF7BF79908 /* SignupAPIRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupAPIRequest.swift; sourceTree = ""; }; 83D56B45D644E0B2DBA11EEC /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8895FC8BB8C3644A2923E77A /* Auth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Auth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 89277BD77D124EAB69AE0989 /* AuthBrandListResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthBrandListResponseDTO.swift; sourceTree = ""; }; + 9157EC605745CAD73475CA84 /* AuthAgreement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthAgreement.swift; sourceTree = ""; }; 95E8500002BC4B6ABD877A90 /* LoginUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginUseCase.swift; sourceTree = ""; }; - 9A168642EA52AD1A834F65CA /* AuthSimpleUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSimpleUser.swift; sourceTree = ""; }; - 9D9606FB084D1C548133A03A /* AuthSMSResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSMSResponse.swift; sourceTree = ""; }; 9F2A7B152CF8BFC2A33B5864 /* SignupFormatStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupFormatStyle.swift; sourceTree = ""; }; A03B7D8DBF8FA6DF9A7FAB5E /* PopupView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PopupView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A6061C08937A7986D4F7D042 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; ADA7DDBBA02C09D5678982D1 /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; - B1C581C211BB1E550A1B7F9F /* IDInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDInputView.swift; sourceTree = ""; }; + B5D807F75F499DBD2AF39E92 /* KakaoAuthService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoAuthService.swift; sourceTree = ""; }; B61AAE20E84CFDA0CD5581B7 /* SignupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupView.swift; sourceTree = ""; }; BE8C09C4CE36E3D06B61DAB5 /* AuthInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AuthInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BEFBC36DB36A7FB5F4EF2146 /* ProfileInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileInputView.swift; sourceTree = ""; }; C857B2C600CA35873D2A9D32 /* Auth-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Auth-Info.plist"; sourceTree = ""; }; + CA0BAEBE3CDD9B85B10AE26D /* AppleAuthServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleAuthServiceProtocol.swift; sourceTree = ""; }; + CF43922EE1D6125FE8B383ED /* KakaoSDKUser.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KakaoSDKUser.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CF8FCFE4AC3B608B5042F210 /* AuthTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AuthTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D7AF374FFD2C1DCB9C67C232 /* AuthSignupResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSignupResponse.swift; sourceTree = ""; }; DA9479B1142A48D6DA9E15EB /* AuthTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTests.swift; sourceTree = ""; }; DB8FAA33147E7CBDF3C9BC71 /* SignupUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupUseCase.swift; sourceTree = ""; }; + DBE015DFA89E6676D907A335 /* KakaoAuthServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoAuthServiceProtocol.swift; sourceTree = ""; }; E1BDDFC6BDACA5DBB3EA0C30 /* AgreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgreeView.swift; sourceTree = ""; }; E5BA7E5065E6BFA71F04B38E /* AuthUserAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUserAPI.swift; sourceTree = ""; }; E65656E0C636D6AF23FD06E9 /* AuthSignupResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSignupResponseDTO.swift; sourceTree = ""; }; E6D3D3E4DD934FD1AB010EE7 /* LoginUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginUseCaseImpl.swift; sourceTree = ""; }; E7179D642D174007438E18BB /* LoginError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginError.swift; sourceTree = ""; }; E92D4A67D04128BB7B34CC41 /* OnboardingPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingPageView.swift; sourceTree = ""; }; + EC378D97E8C797A1B2CB788B /* SocialProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialProvider.swift; sourceTree = ""; }; ED7D603A82E085B8AD32B04F /* AuthRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRepositoryImpl.swift; sourceTree = ""; }; EDE7484E60F831CBAFFBD577 /* AuthBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthBuilder.swift; sourceTree = ""; }; EF08C43BB60D5CD101D7A686 /* AuthTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "AuthTests-Info.plist"; sourceTree = ""; }; @@ -362,6 +386,9 @@ 9FD0E0B05397F67F37A1530A /* AuthTesting.framework in Frameworks */, 6BAE6A217722795DA8B18F6E /* DesignSystem.framework in Frameworks */, A5D92D5C6F4866C1716747F6 /* FoundationKit.framework in Frameworks */, + E2D87D4F27F5006602D75147 /* KakaoSDKAuth.framework in Frameworks */, + 9ADF09FF06C78C632CCB3E3F /* KakaoSDKCommon.framework in Frameworks */, + 95708794CC0EFBB17C81A967 /* KakaoSDKUser.framework in Frameworks */, 122C53001252A72B60454C84 /* Kingfisher.framework in Frameworks */, 2A7224C686420CFF1A66C683 /* Moya.framework in Frameworks */, 1463124D79BBAFE03BC7BF17 /* NetworkKit.framework in Frameworks */, @@ -381,6 +408,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E1A5DE4105173FE48B0A8A12 /* KakaoSDKAuth.framework in Frameworks */, + 7AF6C54D10C7AC3CAB25F44F /* KakaoSDKCommon.framework in Frameworks */, + 137BF12EC0FDBB780C48D99B /* KakaoSDKUser.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -399,13 +429,13 @@ 1F7FCF002E9EA49C9154B97A /* Models */ = { isa = PBXGroup; children = ( - 5ED3793EBF1965006A6246AA /* AuthIDCheckResult.swift */, + 9157EC605745CAD73475CA84 /* AuthAgreement.swift */, 0AEEA4760F10DA275AAD667C /* AuthRecommendedBrand.swift */, D7AF374FFD2C1DCB9C67C232 /* AuthSignupResponse.swift */, - 9A168642EA52AD1A834F65CA /* AuthSimpleUser.swift */, - 9D9606FB084D1C548133A03A /* AuthSMSResponse.swift */, 3D19C06CB9237BDD75BDE6D0 /* AuthUser.swift */, E7179D642D174007438E18BB /* LoginError.swift */, + 791F16AF341F57533D166B00 /* SocialLoginResultType.swift */, + EC378D97E8C797A1B2CB788B /* SocialProvider.swift */, ); path = Models; sourceTree = ""; @@ -448,6 +478,7 @@ CA67E9589C79D55919B4AC98 /* Format */, 1F7FCF002E9EA49C9154B97A /* Models */, 2E50C36B10E667A8B5B249DB /* Repository */, + 67B1B968B12862927CA5D06F /* Service */, E7ADF26634B3AEC468A96EFB /* UseCase */, ); path = Sources; @@ -456,14 +487,19 @@ 47BB2EF37CEDEF87800073AF /* Products */ = { isa = PBXGroup; children = ( + 78FF525D0E8F54DA8ADC5422 /* Alamofire_Alamofire.bundle */, 8895FC8BB8C3644A2923E77A /* Auth.framework */, FC8AEB8E0082B038CB7521FA /* AuthData.framework */, 7C94165A812E44E5FD3BFC7F /* AuthDomain.framework */, BE8C09C4CE36E3D06B61DAB5 /* AuthInterface.framework */, 5642BA06A94EBFDDB6B192CB /* AuthTesting.framework */, CF8FCFE4AC3B608B5042F210 /* AuthTests.xctest */, + 053F11E926A414E7E0C9D2C3 /* DesignSystem_DesignSystem.bundle */, 45A8BB59B621EFC832DCFE0F /* DesignSystem.framework */, 29FA6C20A6564CB1A65D83B5 /* FoundationKit.framework */, + 46E7D8C72118ED61834F52D6 /* KakaoSDKAuth.framework */, + 1327587164DBBAA16F3C33DE /* KakaoSDKCommon.framework */, + CF43922EE1D6125FE8B383ED /* KakaoSDKUser.framework */, 2FDB1F539F81A1BE90F87D4C /* Kingfisher.framework */, 83D56B45D644E0B2DBA11EEC /* Moya.framework */, 62778DFF53ACB46ECC6F5F35 /* NetworkKit.framework */, @@ -527,8 +563,7 @@ 8002CFA53E586CEF850C3B0A /* AuthErrorResponseDTO.swift */, 252C2F86266EE72217090DE5 /* AuthLoginResponseDTO.swift */, E65656E0C636D6AF23FD06E9 /* AuthSignupResponseDTO.swift */, - 79D73FBD79BD1D75BD7F6D35 /* AuthSimpleUserDTO.swift */, - 7943E1660F0F8C03171DA01B /* AuthSMSResponseDTO.swift */, + 4DA3D0897326D379FB89FB89 /* AuthSocialLoginResponseDTO.swift */, 32B432D7D19D2651FD4EA9D0 /* AuthUserDTO.swift */, ); path = DTO; @@ -542,6 +577,15 @@ path = ViewModel; sourceTree = ""; }; + 67B1B968B12862927CA5D06F /* Service */ = { + isa = PBXGroup; + children = ( + CA0BAEBE3CDD9B85B10AE26D /* AppleAuthServiceProtocol.swift */, + DBE015DFA89E6676D907A335 /* KakaoAuthServiceProtocol.swift */, + ); + path = Service; + sourceTree = ""; + }; 6C19D8EF6FBB8C39757E46B1 /* Sources */ = { isa = PBXGroup; children = ( @@ -555,7 +599,6 @@ children = ( 59EBC0CC5D916C5A4CB83108 /* BirthYearDropdown.swift */, 0CC431E5DC117F84221E3049 /* PolicyWebSheetView.swift */, - 809C13866FB7C74A59818EDF /* SignupPopupView.swift */, ); path = Popup; sourceTree = ""; @@ -565,6 +608,7 @@ children = ( D213E4CBC9366CE3FD45FDED /* API */, 61EAB215B4B277EBBEBB30EA /* DTO */, + F0975FF2DD59FA556C7AF3E6 /* Social */, ED7D603A82E085B8AD32B04F /* AuthRepositoryImpl.swift */, ); path = Sources; @@ -589,10 +633,7 @@ children = ( E1BDDFC6BDACA5DBB3EA0C30 /* AgreeView.swift */, 7BDA675B82B10EC8A13AFB6B /* CompleteView.swift */, - B1C581C211BB1E550A1B7F9F /* IDInputView.swift */, - 18C9108C9EC4721DDB960586 /* PhoneVerificationView.swift */, BEFBC36DB36A7FB5F4EF2146 /* ProfileInputView.swift */, - 0C904E1C986F43E7E3173A68 /* PwInputView.swift */, 3DF1746A90A2DDFCD5AE9CB3 /* RecommendView.swift */, ); path = Step; @@ -614,8 +655,7 @@ isa = PBXGroup; children = ( 114EA565B42439D2BD31D001 /* LoginRequest.swift */, - 08278EF2ED11A60DB6D330B6 /* PhoneNumberRequest.swift */, - 83317B7D942AFBFF7BF79908 /* SignupAPIRequest.swift */, + 6C3738B5D3CB94C1EAE7091C /* SocialSignupRequest.swift */, ); path = Encodable; sourceTree = ""; @@ -696,6 +736,15 @@ path = InfoPlists; sourceTree = ""; }; + F0975FF2DD59FA556C7AF3E6 /* Social */ = { + isa = PBXGroup; + children = ( + 31D1F0799992DED05F63CE19 /* AppleAuthService.swift */, + B5D807F75F499DBD2AF39E92 /* KakaoAuthService.swift */, + ); + path = Social; + sourceTree = ""; + }; F801810B5F8B8D58E891B0B5 /* Data */ = { isa = PBXGroup; children = ( @@ -736,6 +785,7 @@ E9C7F24A38551DB28EEA9184 /* Resources */, B6A5B1067558D5212CD51DA8 /* Frameworks */, DFA2E33A5B95A9DDC48D1C33 /* Embed Frameworks */, + 684EC3987431A3767320D468 /* Dependencies */, ); buildRules = ( ); @@ -906,6 +956,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E8972536C344E7B0BDCDAD2D /* Alamofire_Alamofire.bundle in Resources */, + B1B883AD5FA839D4A8A34813 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -924,14 +976,16 @@ buildActionMask = 2147483647; files = ( 11398BE7E7D82516E37D424D /* SignupFormatStyle.swift in Sources */, - 63C7E725C2305C1E327EBA3A /* AuthIDCheckResult.swift in Sources */, + 78E4129880FADAC971EDCBA3 /* AuthAgreement.swift in Sources */, 54098FD0A269D65E21141F44 /* AuthRecommendedBrand.swift in Sources */, - BB5132E0726E9AD5CDE5A167 /* AuthSMSResponse.swift in Sources */, 1637E15B361BE0077BB2E4A4 /* AuthSignupResponse.swift in Sources */, - 317F10B7A78A02208AD5F199 /* AuthSimpleUser.swift in Sources */, 0F56C20E1DA7712315D9E806 /* AuthUser.swift in Sources */, 068F8D60BA7BADAEE244105C /* LoginError.swift in Sources */, + 8E1DE8EEA3B43CEEB1BC3350 /* SocialLoginResultType.swift in Sources */, + EBFC25633602E81D366CEF7F /* SocialProvider.swift in Sources */, 9D083976CECA423E68F0F099 /* AuthRepository.swift in Sources */, + 05B26DCC15BAC48E1F871A86 /* AppleAuthServiceProtocol.swift in Sources */, + 581473F58B2101FA8819F6FD /* KakaoAuthServiceProtocol.swift in Sources */, 584FF6C187A388DDE2785C63 /* LoginUseCase.swift in Sources */, 71A2A19E91125B3B05216EEF /* SignupUseCase.swift in Sources */, ); @@ -955,15 +1009,11 @@ 8E1720B8F639A95ABC17313B /* SignupCurationSkeletonView.swift in Sources */, A873D6E66ACC7A15AE540405 /* BirthYearDropdown.swift in Sources */, 452C194C93875A657D1EF472 /* PolicyWebSheetView.swift in Sources */, - FC24FEA6A044D05C84A21BF3 /* SignupPopupView.swift in Sources */, DAB7DF3408A8935171BD2FAB /* SignupView.swift in Sources */, 684614D8E6FDC6F7CF4C413F /* SignupViewModel.swift in Sources */, DB7091B9F2506C318356C761 /* AgreeView.swift in Sources */, CFC5F5E41FBB37824529D154 /* CompleteView.swift in Sources */, - 6A6F3F4667ED7D186BCA77C2 /* IDInputView.swift in Sources */, - DEC116B8172E6EC0EE96B13D /* PhoneVerificationView.swift in Sources */, E5BC4A325DD1F4C9FFC406C6 /* ProfileInputView.swift in Sources */, - 0C8A59F69E82B238BBACE038 /* PwInputView.swift in Sources */, E70B49DE0EB688032C6698F5 /* RecommendView.swift in Sources */, 6DBDE15A3229AEC6AD04315F /* LoginUseCaseImpl.swift in Sources */, 3DE41050BD58F53CEBF1CD89 /* SignupUseCaseImpl.swift in Sources */, @@ -1000,16 +1050,16 @@ files = ( 9ECE5640A650A001E9195A0F /* AuthUserAPI.swift in Sources */, 67B7704E819E86BACD4CF144 /* LoginRequest.swift in Sources */, - B99AFB0451E067C8FE60A309 /* PhoneNumberRequest.swift in Sources */, - 88D7670D4BE1270B9CEC6115 /* SignupAPIRequest.swift in Sources */, + BE76C14172FBC93CFF00C6EB /* SocialSignupRequest.swift in Sources */, 9D88DB33AC00BF061BEFF003 /* AuthRepositoryImpl.swift in Sources */, D417671EFC2BB25A1ED34B9A /* AuthBrandListResponseDTO.swift in Sources */, 0AAC727B5804E8861378DBA9 /* AuthErrorResponseDTO.swift in Sources */, 0DD4957EB4B1CA41581F98F0 /* AuthLoginResponseDTO.swift in Sources */, - 1BABD6D99B96B85A977A088C /* AuthSMSResponseDTO.swift in Sources */, B3BCEF7C74425A532B13BCA1 /* AuthSignupResponseDTO.swift in Sources */, - AE4E796AB6754D3972831029 /* AuthSimpleUserDTO.swift in Sources */, + AD16ADE5EA0A857DC8FCA049 /* AuthSocialLoginResponseDTO.swift in Sources */, 585839CA64514AE531B3B0E1 /* AuthUserDTO.swift in Sources */, + BF9C7ADABAF6E76DBD66CC18 /* AppleAuthService.swift in Sources */, + 713CD4B5400822ACBE3098A1 /* KakaoAuthService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1572,6 +1622,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.auth.tests; PRODUCT_NAME = AuthTests; SDKROOT = iphoneos; @@ -1600,6 +1654,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.auth.tests; PRODUCT_NAME = AuthTests; SDKROOT = iphoneos; diff --git a/Modules/Features/Auth/Data/Sources/API/AuthUserAPI.swift b/Modules/Features/Auth/Data/Sources/API/AuthUserAPI.swift index c55115b1..9fb0d975 100644 --- a/Modules/Features/Auth/Data/Sources/API/AuthUserAPI.swift +++ b/Modules/Features/Auth/Data/Sources/API/AuthUserAPI.swift @@ -7,65 +7,40 @@ private enum AuthBaseURL { } struct Login: APIRequest { - typealias Response = AuthLoginResponseDTO - let loginId: String - let password: String - var baseURL: URL { AuthBaseURL.users } - var path: String { "/login" } + typealias Response = AuthSocialLoginResponseDTO + let provider: String + let idToken: String + var baseURL: URL { AuthBaseURL.auth } + var path: String { "/social-login" } var method: HTTPMethod { .post } - var task: RequestTask { .jsonBody(LoginRequest(loginId: loginId, password: password)) } + var emitsUnauthorizedEvent: Bool { false } + var task: RequestTask { + .jsonBody(LoginRequest(provider: provider, platform: "IOS", idToken: idToken)) + } } -struct Signup: APIRequest { +struct SocialSignup: APIRequest { typealias Response = AuthSignupResponseDTO - let loginId: String - let password: String - let phoneNumber: String + let signupToken: String let nickname: String let birthYear: String let gender: String - var baseURL: URL { AuthBaseURL.users } - var path: String { "/signup" } + let agreements: [SocialSignupAgreementRequest] + var baseURL: URL { AuthBaseURL.auth } + var path: String { "/social-login/signup" } var method: HTTPMethod { .post } + var emitsUnauthorizedEvent: Bool { false } var task: RequestTask { - .jsonBody(SignupAPIRequest( - loginId: loginId, - password: password, - phoneNumber: phoneNumber, + .jsonBody(SocialSignupRequest( + signupToken: signupToken, nickname: nickname, birthYear: birthYear, - gender: gender + gender: gender, + agreements: agreements )) } } -struct CheckPhoneNumber: APIRequest { - typealias Response = [AuthSimpleUserDTO] - let phoneNumber: String - var baseURL: URL { AuthBaseURL.users } - var path: String { "/check/phoneNumber" } - var method: HTTPMethod { .get } - var task: RequestTask { .query(["phoneNumber": phoneNumber]) } -} - -struct CheckIDDup: APIRequest { - typealias Response = AuthSimpleUserDTO - let loginId: String - var baseURL: URL { AuthBaseURL.users } - var path: String { "/check/loginId" } - var method: HTTPMethod { .get } - var task: RequestTask { .query(["loginId": loginId]) } -} - -struct AuthSMS: APIRequest { - typealias Response = AuthSMSResponseDTO - let phoneNumber: String - var baseURL: URL { AuthBaseURL.auth } - var path: String { "/SMS" } - var method: HTTPMethod { .post } - var task: RequestTask { .jsonBody(PhoneNumberRequest(phoneNumber: phoneNumber)) } -} - struct PreInvestigate: APIRequest { typealias Response = AuthRecommendedBrandListResponseDTO let industryId: String diff --git a/Modules/Features/Auth/Data/Sources/API/Encodable/LoginRequest.swift b/Modules/Features/Auth/Data/Sources/API/Encodable/LoginRequest.swift index 350c3fdb..0608b41b 100644 --- a/Modules/Features/Auth/Data/Sources/API/Encodable/LoginRequest.swift +++ b/Modules/Features/Auth/Data/Sources/API/Encodable/LoginRequest.swift @@ -1,4 +1,5 @@ struct LoginRequest: Encodable, Sendable { - let loginId: String - let password: String + let provider: String + let platform: String + let idToken: String } diff --git a/Modules/Features/Auth/Data/Sources/API/Encodable/PhoneNumberRequest.swift b/Modules/Features/Auth/Data/Sources/API/Encodable/PhoneNumberRequest.swift deleted file mode 100644 index 432ec8e9..00000000 --- a/Modules/Features/Auth/Data/Sources/API/Encodable/PhoneNumberRequest.swift +++ /dev/null @@ -1,3 +0,0 @@ -struct PhoneNumberRequest: Encodable, Sendable { - let phoneNumber: String -} diff --git a/Modules/Features/Auth/Data/Sources/API/Encodable/SignupAPIRequest.swift b/Modules/Features/Auth/Data/Sources/API/Encodable/SignupAPIRequest.swift deleted file mode 100644 index 65922d1b..00000000 --- a/Modules/Features/Auth/Data/Sources/API/Encodable/SignupAPIRequest.swift +++ /dev/null @@ -1,8 +0,0 @@ -struct SignupAPIRequest: Encodable, Sendable { - let loginId: String - let password: String - let phoneNumber: String - let nickname: String - let birthYear: String - let gender: String -} diff --git a/Modules/Features/Auth/Data/Sources/API/Encodable/SocialSignupRequest.swift b/Modules/Features/Auth/Data/Sources/API/Encodable/SocialSignupRequest.swift new file mode 100644 index 00000000..d8c8dec5 --- /dev/null +++ b/Modules/Features/Auth/Data/Sources/API/Encodable/SocialSignupRequest.swift @@ -0,0 +1,12 @@ +struct SocialSignupAgreementRequest: Encodable, Sendable { + let type: String + let agreed: Bool +} + +struct SocialSignupRequest: Encodable, Sendable { + let signupToken: String + let nickname: String + let birthYear: String + let gender: String + let agreements: [SocialSignupAgreementRequest] +} diff --git a/Modules/Features/Auth/Data/Sources/AuthRepositoryImpl.swift b/Modules/Features/Auth/Data/Sources/AuthRepositoryImpl.swift index d80cb25a..f47ed469 100644 --- a/Modules/Features/Auth/Data/Sources/AuthRepositoryImpl.swift +++ b/Modules/Features/Auth/Data/Sources/AuthRepositoryImpl.swift @@ -18,54 +18,45 @@ public final class AuthRepositoryImpl: AuthRepository { self.userInfoStore = userInfoStore } - public func login(loginId: String, password: String) async throws -> (AuthUser, String) { - let user: AuthUser - let token: String + public func login(provider: SocialProvider, idToken: String) async throws -> SocialLoginResultType { do { let response = try await network.request( - Login(loginId: loginId, password: password) + Login(provider: provider.rawValue, idToken: idToken) ) - user = response.user.toDomain() - token = response.accessToken - } catch let error as NetworkError { - if case .serverError(let statusCode, let message) = error, statusCode == 400 { - let errorMessage = message ?? "" - if errorMessage.contains("비밀번호") { - throw LoginError.invalidPassword - } else if errorMessage.contains("계정") { - throw LoginError.accountNotFound + let result = try response.toDomain() + + if case let .registered(user, accessToken) = result { + // Keychain 저장 실패 시 로그인 실패로 처리 — 다음 실행 때 조용히 로그아웃되는 것 방지. + guard tokenStorage.saveAccessToken(accessToken) else { + throw LoginError.tokenPersistenceFailed } + persistLocalUser(from: user) } - throw LoginError.networkError(error) + + return result + } catch let error as LoginError { + throw error } catch { throw LoginError.networkError(error) } - - // Keychain 저장 실패 시 로그인 실패로 처리 — 다음 실행 때 조용히 로그아웃되는 것 방지. - guard tokenStorage.saveAccessToken(token) else { - throw LoginError.tokenPersistenceFailed - } - persistLocalUser(from: user) - - return (user, token) } public func signup( - loginId: String, - password: String, - phoneNumber: String, + signupToken: String, nickname: String, birthYear: String, - gender: String + gender: String, + agreements: [AuthAgreement] ) async throws -> AuthSignupResponse { let response = try await network.request( - Signup( - loginId: loginId, - password: password, - phoneNumber: phoneNumber, + SocialSignup( + signupToken: signupToken, nickname: nickname, birthYear: birthYear, - gender: gender + gender: gender, + agreements: agreements.map { + SocialSignupAgreementRequest(type: $0.type.rawValue, agreed: $0.agreed) + } ) ) let domain = response.toDomain() @@ -78,42 +69,6 @@ public final class AuthRepositoryImpl: AuthRepository { return domain } - public func checkPhoneNumber(_ phoneNumber: String) async throws -> [AuthSimpleUser] { - do { - let response = try await network.request( - CheckPhoneNumber(phoneNumber: phoneNumber) - ) - return response.map { $0.toDomain() } - } catch let error as NetworkError { - if case .serverError(let statusCode, _) = error, statusCode == 400 { - return [] - } else { - throw error - } - } catch { - throw error - } - } - - public func checkIDDup(_ loginId: String) async throws -> AuthIDCheckResult { - let result = try await network.checkRequest( - CheckIDDup(loginId: loginId) - ) - switch result { - case .exists(let dto): - return .exists(dto.toDomain()) - case .notFound: - return .notFound - } - } - - public func authSMS(phoneNumber: String) async throws -> AuthSMSResponse { - let response = try await network.request( - AuthSMS(phoneNumber: phoneNumber) - ) - return response.toDomain() - } - public func preInvestigate( industryId: String, interestIds: [String] @@ -132,8 +87,8 @@ public final class AuthRepositoryImpl: AuthRepository { private func persistLocalUser(from user: AuthUser) { let userInfo = UserInfo( id: user.id, - loginId: user.loginId, - phoneNumber: user.phoneNumber, + loginId: "", + phoneNumber: "", subscribeEmail: user.subscribeEmail, nickname: user.nickname, birthYear: user.birthYear, diff --git a/Modules/Features/Auth/Data/Sources/DTO/AuthSMSResponseDTO.swift b/Modules/Features/Auth/Data/Sources/DTO/AuthSMSResponseDTO.swift deleted file mode 100644 index 79af09dd..00000000 --- a/Modules/Features/Auth/Data/Sources/DTO/AuthSMSResponseDTO.swift +++ /dev/null @@ -1,9 +0,0 @@ -import AuthDomain - -struct AuthSMSResponseDTO: Decodable, Sendable { - let code: Int - - func toDomain() -> AuthSMSResponse { - return AuthSMSResponse(code: code) - } -} diff --git a/Modules/Features/Auth/Data/Sources/DTO/AuthSimpleUserDTO.swift b/Modules/Features/Auth/Data/Sources/DTO/AuthSimpleUserDTO.swift deleted file mode 100644 index 162b8b2c..00000000 --- a/Modules/Features/Auth/Data/Sources/DTO/AuthSimpleUserDTO.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation -import AuthDomain - -struct AuthSimpleUserDTO: Decodable, Sendable { - let id: Int - let loginId: String - let phoneNumber: String - let createdAt: String - - func toDomain() -> AuthSimpleUser { - return AuthSimpleUser( - id: id, - loginId: loginId, - phoneNumber: phoneNumber, - createdAt: createdAt - ) - } -} diff --git a/Modules/Features/Auth/Data/Sources/DTO/AuthSocialLoginResponseDTO.swift b/Modules/Features/Auth/Data/Sources/DTO/AuthSocialLoginResponseDTO.swift new file mode 100644 index 00000000..3b3bc8b0 --- /dev/null +++ b/Modules/Features/Auth/Data/Sources/DTO/AuthSocialLoginResponseDTO.swift @@ -0,0 +1,36 @@ +import Foundation +import AuthDomain + +struct AuthSocialProfileDTO: Decodable, Sendable { + let provider: String? + let providerUserId: String? + let email: String? + let nickname: String? +} + +struct AuthSocialLoginResponseDTO: Decodable, Sendable { + let isRegistered: Bool + let accessToken: String? + let user: AuthUserDTO? + let signupToken: String? + let profile: AuthSocialProfileDTO? + + func toDomain() throws -> SocialLoginResultType { + if isRegistered { + guard let user, let accessToken else { + throw AuthSocialLoginDecodingError.missingRegisteredFields + } + return .registered(user.toDomain(), accessToken: accessToken) + } else { + guard let signupToken else { + throw AuthSocialLoginDecodingError.missingSignupToken + } + return .newUser(signupToken: signupToken, suggestedNickname: profile?.nickname) + } + } +} + +enum AuthSocialLoginDecodingError: Error { + case missingRegisteredFields + case missingSignupToken +} diff --git a/Modules/Features/Auth/Data/Sources/DTO/AuthUserDTO.swift b/Modules/Features/Auth/Data/Sources/DTO/AuthUserDTO.swift index f37ca7d4..ffcc58d6 100644 --- a/Modules/Features/Auth/Data/Sources/DTO/AuthUserDTO.swift +++ b/Modules/Features/Auth/Data/Sources/DTO/AuthUserDTO.swift @@ -18,8 +18,6 @@ struct AuthInterestDTO: Decodable, Sendable { struct AuthUserDTO: Decodable, Sendable { let id: Int - let loginId: String - let phoneNumber: String let subscribeEmail: String? let nickname: String let birthYear: String @@ -31,8 +29,6 @@ struct AuthUserDTO: Decodable, Sendable { func toDomain() -> AuthUser { return AuthUser( id: id, - loginId: loginId, - phoneNumber: phoneNumber, subscribeEmail: subscribeEmail, nickname: nickname, birthYear: birthYear, diff --git a/Modules/Features/Auth/Data/Sources/Social/AppleAuthService.swift b/Modules/Features/Auth/Data/Sources/Social/AppleAuthService.swift new file mode 100644 index 00000000..80b8d5da --- /dev/null +++ b/Modules/Features/Auth/Data/Sources/Social/AppleAuthService.swift @@ -0,0 +1,95 @@ +import Foundation +import UIKit +import AuthDomain +import AuthenticationServices + +@MainActor +public struct AppleAuthService: AppleAuthServiceProtocol { + public init() {} + + public func fetchIDToken() async throws -> String { + try await withCheckedThrowingContinuation { continuation in + // manager를 completion 클로저에서 강하게 잡아 콜백 시점까지 생존시킴 + let manager = AppleSignInManager() + manager.request { result in + _ = manager + switch result { + case .success(let authorization): + if let idToken = Self.idToken(from: authorization) { + continuation.resume(returning: idToken) + } else { + continuation.resume(throwing: LoginError.missingIDToken) + } + case .failure(let error): + continuation.resume(throwing: Self.map(error)) + } + } + } + } + + private static func idToken(from authorization: ASAuthorization) -> String? { + guard + let credential = authorization.credential as? ASAuthorizationAppleIDCredential, + let tokenData = credential.identityToken + else { return nil } + return String(data: tokenData, encoding: .utf8) + } + + private static func map(_ error: Error) -> LoginError { + if (error as? ASAuthorizationError)?.code == .canceled { + return .cancelled + } + return .networkError(error) + } +} + +/// ASAuthorizationController를 async로 감싸기 위한 델리게이트 래퍼 +private final class AppleSignInManager: NSObject { + private var completion: ((Result) -> Void)? + private var controller: ASAuthorizationController? + + func request(_ completion: @escaping (Result) -> Void) { + self.completion = completion + let request = ASAuthorizationAppleIDProvider().createRequest() + request.requestedScopes = [.fullName, .email] + let controller = ASAuthorizationController(authorizationRequests: [request]) + controller.delegate = self + controller.presentationContextProvider = self + self.controller = controller + controller.performRequests() + } + + private func finish(_ result: Result) { + completion?(result) + completion = nil + controller = nil + } +} + +extension AppleSignInManager: ASAuthorizationControllerDelegate { + func authorizationController( + controller: ASAuthorizationController, + didCompleteWithAuthorization authorization: ASAuthorization + ) { + finish(.success(authorization)) + } + + func authorizationController( + controller: ASAuthorizationController, + didCompleteWithError error: Error + ) { + finish(.failure(error)) + } +} + +extension AppleSignInManager: ASAuthorizationControllerPresentationContextProviding { + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + // ponytail: 델리게이트는 메인 스레드 콜백 — assumeIsolated로 keyWindow 조회 + MainActor.assumeIsolated { + UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .flatMap(\.windows) + .first(where: \.isKeyWindow) ?? ASPresentationAnchor() + } + } +} diff --git a/Modules/Features/Auth/Data/Sources/Social/KakaoAuthService.swift b/Modules/Features/Auth/Data/Sources/Social/KakaoAuthService.swift new file mode 100644 index 00000000..3464af18 --- /dev/null +++ b/Modules/Features/Auth/Data/Sources/Social/KakaoAuthService.swift @@ -0,0 +1,39 @@ +import Foundation +import AuthDomain +import KakaoSDKAuth +import KakaoSDKUser +import KakaoSDKCommon + +@MainActor +public struct KakaoAuthService: KakaoAuthServiceProtocol { + public init() {} + + public func fetchIDToken() async throws -> String { + try await withCheckedThrowingContinuation { continuation in + let completion: (OAuthToken?, Error?) -> Void = { token, error in + if let error { + continuation.resume(throwing: Self.map(error)) + } else if let idToken = token?.idToken { + continuation.resume(returning: idToken) + } else { + continuation.resume(throwing: LoginError.missingIDToken) + } + } + + if UserApi.isKakaoTalkLoginAvailable() { + UserApi.shared.loginWithKakaoTalk(completion: completion) + } else { + UserApi.shared.loginWithKakaoAccount(completion: completion) + } + } + } + + private static func map(_ error: Error) -> LoginError { + if let sdkError = error as? SdkError, + case .ClientFailed(let reason, _) = sdkError, + reason == .Cancelled { + return .cancelled + } + return .networkError(error) + } +} diff --git a/Modules/Features/Auth/Domain/Sources/Models/AuthAgreement.swift b/Modules/Features/Auth/Domain/Sources/Models/AuthAgreement.swift new file mode 100644 index 00000000..5640df59 --- /dev/null +++ b/Modules/Features/Auth/Domain/Sources/Models/AuthAgreement.swift @@ -0,0 +1,18 @@ +import Foundation + +public struct AuthAgreement: Sendable { + public enum AgreementType: String, Sendable { + case ageConfirmationOver14 = "AGE_CONFIRMATION_OVER_14" + case termsOfService = "TERMS_OF_SERVICE" + case personalInformation = "PERSONAL_INFORMATION_COLLECTION_AND_USE" + case marketing = "MARKETING_INFORMATION_RECEIPT" + } + + public let type: AgreementType + public let agreed: Bool + + public init(type: AgreementType, agreed: Bool) { + self.type = type + self.agreed = agreed + } +} diff --git a/Modules/Features/Auth/Domain/Sources/Models/AuthIDCheckResult.swift b/Modules/Features/Auth/Domain/Sources/Models/AuthIDCheckResult.swift deleted file mode 100644 index 094bd41c..00000000 --- a/Modules/Features/Auth/Domain/Sources/Models/AuthIDCheckResult.swift +++ /dev/null @@ -1,4 +0,0 @@ -public enum AuthIDCheckResult { - case exists(AuthSimpleUser) - case notFound -} diff --git a/Modules/Features/Auth/Domain/Sources/Models/AuthSMSResponse.swift b/Modules/Features/Auth/Domain/Sources/Models/AuthSMSResponse.swift deleted file mode 100644 index d096f36c..00000000 --- a/Modules/Features/Auth/Domain/Sources/Models/AuthSMSResponse.swift +++ /dev/null @@ -1,7 +0,0 @@ -public struct AuthSMSResponse { - public let code: Int - - public init(code: Int) { - self.code = code - } -} diff --git a/Modules/Features/Auth/Domain/Sources/Models/AuthSimpleUser.swift b/Modules/Features/Auth/Domain/Sources/Models/AuthSimpleUser.swift deleted file mode 100644 index 6c6e7d9e..00000000 --- a/Modules/Features/Auth/Domain/Sources/Models/AuthSimpleUser.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation -import FoundationKit - -public struct AuthSimpleUser: Identifiable { - public let id: Int - public let loginId: String - public let phoneNumber: String - public let createdAt: String - - public var maskedLoginId: String { - let prefix = loginId.prefix(4) - let starCount = max(0, loginId.count - 4) - let stars = String(repeating: "*", count: starCount) - return "\(prefix)\(stars)" - } - - public var formattedCreatedAt: String { - guard let date = createdAt.newdokISODate else { - return createdAt - } - return "\(date.newdokJoinDateText) 가입" - } - - public init( - id: Int, - loginId: String, - phoneNumber: String, - createdAt: String - ) { - self.id = id - self.loginId = loginId - self.phoneNumber = phoneNumber - self.createdAt = createdAt - } -} diff --git a/Modules/Features/Auth/Domain/Sources/Models/AuthUser.swift b/Modules/Features/Auth/Domain/Sources/Models/AuthUser.swift index 9dc8be6a..e784b7e0 100644 --- a/Modules/Features/Auth/Domain/Sources/Models/AuthUser.swift +++ b/Modules/Features/Auth/Domain/Sources/Models/AuthUser.swift @@ -2,8 +2,6 @@ import Foundation public struct AuthUser { public let id: Int - public let loginId: String - public let phoneNumber: String public let subscribeEmail: String? public let nickname: String public let birthYear: String @@ -14,8 +12,6 @@ public struct AuthUser { public init( id: Int, - loginId: String, - phoneNumber: String, subscribeEmail: String?, nickname: String, birthYear: String, @@ -25,8 +21,6 @@ public struct AuthUser { interestIds: [Int] ) { self.id = id - self.loginId = loginId - self.phoneNumber = phoneNumber self.subscribeEmail = subscribeEmail self.nickname = nickname self.birthYear = birthYear diff --git a/Modules/Features/Auth/Domain/Sources/Models/LoginError.swift b/Modules/Features/Auth/Domain/Sources/Models/LoginError.swift index f19381f3..82d663e8 100644 --- a/Modules/Features/Auth/Domain/Sources/Models/LoginError.swift +++ b/Modules/Features/Auth/Domain/Sources/Models/LoginError.swift @@ -1,17 +1,19 @@ import Foundation public enum LoginError: Error, LocalizedError { - case invalidPassword - case accountNotFound + /// 사용자가 소셜 로그인 동의/인증을 취소함 + case cancelled + /// 소셜 SDK에서 idToken을 받지 못함 + case missingIDToken case networkError(Error) case tokenPersistenceFailed public var errorDescription: String? { switch self { - case .invalidPassword: - return "비밀번호가 일치하지 않습니다" - case .accountNotFound: - return "등록되지 않은 계정이거나, 아이디를 다시 확인해주세요" + case .cancelled: + return "로그인이 취소되었습니다" + case .missingIDToken: + return "소셜 로그인 정보를 가져오지 못했습니다" case .networkError(let error): return "네트워크 오류: \(error.localizedDescription)" case .tokenPersistenceFailed: diff --git a/Modules/Features/Auth/Domain/Sources/Models/SocialLoginResultType.swift b/Modules/Features/Auth/Domain/Sources/Models/SocialLoginResultType.swift new file mode 100644 index 00000000..6fba5b68 --- /dev/null +++ b/Modules/Features/Auth/Domain/Sources/Models/SocialLoginResultType.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum SocialLoginResultType: Sendable { + case registered(AuthUser, accessToken: String) + case newUser(signupToken: String, suggestedNickname: String?) +} diff --git a/Modules/Features/Auth/Domain/Sources/Models/SocialProvider.swift b/Modules/Features/Auth/Domain/Sources/Models/SocialProvider.swift new file mode 100644 index 00000000..ab0e1aca --- /dev/null +++ b/Modules/Features/Auth/Domain/Sources/Models/SocialProvider.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum SocialProvider: String, Sendable { + case kakao = "KAKAO" + case apple = "APPLE" +} diff --git a/Modules/Features/Auth/Domain/Sources/Repository/AuthRepository.swift b/Modules/Features/Auth/Domain/Sources/Repository/AuthRepository.swift index 7e1d34e0..bb881d82 100644 --- a/Modules/Features/Auth/Domain/Sources/Repository/AuthRepository.swift +++ b/Modules/Features/Auth/Domain/Sources/Repository/AuthRepository.swift @@ -1,18 +1,14 @@ import Foundation public protocol AuthRepository: Sendable { - func login(loginId: String, password: String) async throws -> (AuthUser, String) + func login(provider: SocialProvider, idToken: String) async throws -> SocialLoginResultType func signup( - loginId: String, - password: String, - phoneNumber: String, + signupToken: String, nickname: String, birthYear: String, - gender: String + gender: String, + agreements: [AuthAgreement] ) async throws -> AuthSignupResponse - func checkPhoneNumber(_ phoneNumber: String) async throws -> [AuthSimpleUser] - func checkIDDup(_ loginId: String) async throws -> AuthIDCheckResult - func authSMS(phoneNumber: String) async throws -> AuthSMSResponse func preInvestigate(industryId: String, interestIds: [String]) async throws -> [AuthRecommendedBrand] func signOut() async } diff --git a/Modules/Features/Auth/Domain/Sources/Service/AppleAuthServiceProtocol.swift b/Modules/Features/Auth/Domain/Sources/Service/AppleAuthServiceProtocol.swift new file mode 100644 index 00000000..b3f187c1 --- /dev/null +++ b/Modules/Features/Auth/Domain/Sources/Service/AppleAuthServiceProtocol.swift @@ -0,0 +1,6 @@ +import Foundation + +@MainActor +public protocol AppleAuthServiceProtocol: Sendable { + func fetchIDToken() async throws -> String +} diff --git a/Modules/Features/Auth/Domain/Sources/Service/KakaoAuthServiceProtocol.swift b/Modules/Features/Auth/Domain/Sources/Service/KakaoAuthServiceProtocol.swift new file mode 100644 index 00000000..15a27dd7 --- /dev/null +++ b/Modules/Features/Auth/Domain/Sources/Service/KakaoAuthServiceProtocol.swift @@ -0,0 +1,6 @@ +import Foundation + +@MainActor +public protocol KakaoAuthServiceProtocol: Sendable { + func fetchIDToken() async throws -> String +} diff --git a/Modules/Features/Auth/Domain/Sources/UseCase/LoginUseCase.swift b/Modules/Features/Auth/Domain/Sources/UseCase/LoginUseCase.swift index c07819ee..ee16182c 100644 --- a/Modules/Features/Auth/Domain/Sources/UseCase/LoginUseCase.swift +++ b/Modules/Features/Auth/Domain/Sources/UseCase/LoginUseCase.swift @@ -1,5 +1,5 @@ import Foundation public protocol LoginUseCase: Sendable { - func execute(loginId: String, password: String) async throws -> AuthUser + func execute(provider: SocialProvider, idToken: String) async throws -> SocialLoginResultType } diff --git a/Modules/Features/Auth/Domain/Sources/UseCase/SignupUseCase.swift b/Modules/Features/Auth/Domain/Sources/UseCase/SignupUseCase.swift index 26811213..c5f96b73 100644 --- a/Modules/Features/Auth/Domain/Sources/UseCase/SignupUseCase.swift +++ b/Modules/Features/Auth/Domain/Sources/UseCase/SignupUseCase.swift @@ -1,27 +1,24 @@ import Foundation public struct AuthSignupRequest { - public let loginId: String - public let password: String - public let phoneNumber: String + public let signupToken: String public let nickname: String public let birthYear: String public let gender: String + public let agreements: [AuthAgreement] public init( - loginId: String, - password: String, - phoneNumber: String, + signupToken: String, nickname: String, birthYear: String, - gender: String + gender: String, + agreements: [AuthAgreement] ) { - self.loginId = loginId - self.password = password - self.phoneNumber = phoneNumber + self.signupToken = signupToken self.nickname = nickname self.birthYear = birthYear self.gender = gender + self.agreements = agreements } } diff --git a/Modules/Features/Auth/Interface/Sources/AuthInterface.swift b/Modules/Features/Auth/Interface/Sources/AuthInterface.swift index 64859cc4..0e0c1d14 100644 --- a/Modules/Features/Auth/Interface/Sources/AuthInterface.swift +++ b/Modules/Features/Auth/Interface/Sources/AuthInterface.swift @@ -12,10 +12,13 @@ public protocol AuthBuildable { onBack: @escaping () -> Void, onRecovery: @escaping () -> Void, onSignup: @escaping () -> Void, + onNeedSignup: @escaping (String, String?) -> Void, onAuthenticated: @escaping () -> Void ) -> AnyView func makeSignupView( + signupToken: String, + nickname: String?, onBack: @escaping () -> Void, onLogin: @escaping () -> Void, onRecovery: @escaping () -> Void, diff --git a/Modules/Features/Auth/Project.swift b/Modules/Features/Auth/Project.swift index 2acfb4a6..ceb60c9a 100644 --- a/Modules/Features/Auth/Project.swift +++ b/Modules/Features/Auth/Project.swift @@ -4,7 +4,11 @@ import ProjectDescriptionHelpers let project = Project.feature( name: "Auth", domainDependencies: [.foundationKit], - dataDependencies: [], + dataDependencies: [ + .external(name: "KakaoSDKCommon"), + .external(name: "KakaoSDKAuth"), + .external(name: "KakaoSDKUser") + ], featureDependencies: [.foundationKit, .featureData("Auth"), .networkKit], testDependencies: [.foundationKit], hasInterface: true diff --git a/Modules/Features/Auth/Sources/AuthBuilder.swift b/Modules/Features/Auth/Sources/AuthBuilder.swift index efbe5666..0c0be9e7 100644 --- a/Modules/Features/Auth/Sources/AuthBuilder.swift +++ b/Modules/Features/Auth/Sources/AuthBuilder.swift @@ -42,6 +42,7 @@ public struct AuthBuilder: AuthBuildable { onBack: @escaping () -> Void, onRecovery: @escaping () -> Void, onSignup: @escaping () -> Void, + onNeedSignup: @escaping (String, String?) -> Void, onAuthenticated: @escaping () -> Void ) -> AnyView { AnyView( @@ -49,14 +50,15 @@ public struct AuthBuilder: AuthBuildable { viewModel: container.makeLoginViewModel(), canGoBack: canGoBack, onBack: onBack, - onRecovery: onRecovery, - onSignup: onSignup, + onNeedSignup: onNeedSignup, onAuthenticated: onAuthenticated ) ) } public func makeSignupView( + signupToken: String, + nickname: String?, onBack: @escaping () -> Void, onLogin: @escaping () -> Void, onRecovery: @escaping () -> Void, @@ -64,7 +66,7 @@ public struct AuthBuilder: AuthBuildable { ) -> AnyView { AnyView( SignupView( - viewModel: container.makeSignupViewModel(), + viewModel: container.makeSignupViewModel(signupToken: signupToken, nickname: nickname), onBack: onBack, onLogin: onLogin, onRecovery: onRecovery, diff --git a/Modules/Features/Auth/Sources/AuthDIContainer.swift b/Modules/Features/Auth/Sources/AuthDIContainer.swift index 900a141c..5f8cea03 100644 --- a/Modules/Features/Auth/Sources/AuthDIContainer.swift +++ b/Modules/Features/Auth/Sources/AuthDIContainer.swift @@ -36,14 +36,18 @@ final class AuthDIContainer { let repository = makeRepository() return LoginViewModel( loginUseCase: LoginUseCaseImpl(authRepository: repository), + kakaoAuthService: KakaoAuthService(), + appleAuthService: AppleAuthService(), tokenStorage: tokenStorage, appState: appState ) } - func makeSignupViewModel() -> SignupViewModel { + func makeSignupViewModel(signupToken: String, nickname: String?) -> SignupViewModel { let repository = makeRepository() return SignupViewModel( + signupToken: signupToken, + suggestedNickname: nickname, authRepository: repository, signupUseCase: SignupUseCaseImpl(authRepository: repository), userInfoStore: userInfoStore, diff --git a/Modules/Features/Auth/Sources/Login/View/LoginView.swift b/Modules/Features/Auth/Sources/Login/View/LoginView.swift index 6a183b8d..a8e1d6fe 100644 --- a/Modules/Features/Auth/Sources/Login/View/LoginView.swift +++ b/Modules/Features/Auth/Sources/Login/View/LoginView.swift @@ -13,137 +13,58 @@ import PopupView public struct LoginView: View { @State private var viewModel: LoginViewModel - @FocusState private var isIdFocused: Bool - @FocusState private var isPwdFocused: Bool - @State private var showHomeView = false @State private var showToast: Bool = false @State private var toastMessage: String = "" - + private let canGoBack: Bool private let onBack: () -> Void - private let onRecovery: () -> Void - private let onSignup: () -> Void + private let onNeedSignup: (String, String?) -> Void private let onAuthenticated: () -> Void public init( viewModel: LoginViewModel, canGoBack: Bool, onBack: @escaping () -> Void, - onRecovery: @escaping () -> Void, - onSignup: @escaping () -> Void, + onNeedSignup: @escaping (String, String?) -> Void, onAuthenticated: @escaping () -> Void ) { self.viewModel = viewModel self.canGoBack = canGoBack self.onBack = onBack - self.onRecovery = onRecovery - self.onSignup = onSignup + self.onNeedSignup = onNeedSignup self.onAuthenticated = onAuthenticated } public var body: some View { - ZStack { - VStack { - HStack { - Image(asset: DesignSystemAsset.logo) - .frame(alignment: .leading) - .padding(.leading, 28) - Spacer() - } - .padding(.bottom, 24) - - VStack(alignment: .leading) { - Text("아이디") - .font(.hanSansNeo(14, .medium)) + VStack { + Spacer() - TextField("아이디를 입력하세요", text: $viewModel.loginId) - .font(.hanSansNeo(14, .medium)) - .frame(height: 56) - .customTextFieldStyle(isError: viewModel.isLoginIdError, isFocused: $isIdFocused) - .focused($isIdFocused) - Text(viewModel.isLoginIdError ? (viewModel.errorMessage ?? "") : " ") - .font(.hanSansNeo(12, .medium)) - .foregroundStyle(Color.errorNormal) + Image(asset: DesignSystemAsset.logo) + .resizable() + .scaledToFit() + .frame(height: 48) - Text("비밀번호") - .font(.hanSansNeo(14, .medium)) - .padding(.top, 16) + Spacer() + Spacer() - Group { - if viewModel.isSecurePassword { - SecureField("비밀번호를 입력해주세요", text: $viewModel.password) - .focused($isPwdFocused) - } else { - TextField("비밀번호를 입력해주세요", text: $viewModel.password) - .focused($isPwdFocused) + VStack(spacing: 12) { + kakaoButton + .overlay(alignment: .top) { + startBadge.offset(y: -30) } - } - .font(.hanSansNeo(14, .medium)) - .modifier( - PasswordFieldModifier( - isSecure: $viewModel.isSecurePassword, - isFocused: $isPwdFocused, - isError: viewModel.isPasswordError - ) - ) - Text(viewModel.isPasswordError ? (viewModel.errorMessage ?? "") : " ") - .font(.hanSansNeo(12, .medium)) - .foregroundStyle(Color.errorNormal) - HStack { - Spacer() - Button("아이디/비밀번호 찾기") { - onRecovery() - } - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - } - .padding(.top, 10) + appleButton - Spacer() - - Button { - viewModel.login { - onAuthenticated() - } - } label: { - Text("로그인") - .font(.hanSansNeo(16, .bold)) - .disabled(!viewModel.isLoginEnabled) - .frame(maxWidth: .infinity) - .frame(height: 48) - .background(viewModel.isLoginEnabled ? Color.primaryNormal : Color.lineNeutral) - .foregroundColor(viewModel.isLoginEnabled ? .white : Color.captionDisabled) - .cornerRadius(4) - .contentShape(Rectangle()) + Button("비회원으로 이용하기") { + viewModel.loginAsGuest() + onAuthenticated() } - .disabled(!viewModel.isLoginEnabled || viewModel.isLoading) - - HStack { - Button("비회원으로 이용하기") { - viewModel.loginAsGuest() - onAuthenticated() - } - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - .padding(.leading, 80) - - Text("|") - .foregroundStyle(Color.lineAlternative) - - Button("회원가입") { - onSignup() - } - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.primaryNormal) - } - .padding(.bottom, 56) + .font(.hanSansNeo(14, .medium)) + .foregroundStyle(Color.captionNeutral) + .padding(.top, 8) } .padding(.horizontal, 24) - } - } - .safeAreaInset(edge: .top, spacing: 0) { - Color.clear.frame(height: 20) + .padding(.bottom, 56) } .ignoresSafeArea(.keyboard) .navigationBarTitleDisplayMode(.inline) @@ -168,17 +89,9 @@ public struct LoginView: View { .toolbar { ToolbarItem(placement: .navigationBarLeading) { if canGoBack { - BackButton(action: { - onBack() - }) + BackButton(action: { onBack() }) } } - - ToolbarItem(placement: .principal) { - Text("로그인") - .font(.hanSansNeo(16, .bold)) - .foregroundStyle(Color.captionHeavy) - } } .serverErrorPopup( error: $viewModel.currentError, @@ -186,4 +99,85 @@ public struct LoginView: View { onRetry: {} ) } + + private var kakaoButton: some View { + socialButton( + title: "카카오로 계속하기", + background: Color(red: 254 / 255, green: 229 / 255, blue: 0), + foreground: Color.black.opacity(0.85) + ) { + Image(asset: DesignSystemAsset.kakaoBubble) + .renderingMode(.template) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + .foregroundColor(Color.black.opacity(0.85)) + } action: { + viewModel.loginWithKakao { + onAuthenticated() + } onNeedSignup: { signupToken, nickname in + onNeedSignup(signupToken, nickname) + } + } + } + + private var appleButton: some View { + socialButton( + title: "Apple로 계속하기", + background: .black, + foreground: .white + ) { + Image(systemName: "apple.logo") + .font(.system(size: 20)) + .foregroundColor(.white) + } action: { + viewModel.loginWithApple { + onAuthenticated() + } onNeedSignup: { signupToken, nickname in + onNeedSignup(signupToken, nickname) + } + } + } + + private func socialButton( + title: String, + background: Color, + foreground: Color, + @ViewBuilder icon: () -> some View, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + ZStack { + Text(title) + .font(.hanSansNeo(16, .bold)) + .foregroundColor(foreground) + HStack { + icon() + Spacer() + } + .padding(.leading, 20) + } + .frame(maxWidth: .infinity) + .frame(height: 56) + .background(background) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .contentShape(Rectangle()) + } + .disabled(viewModel.isLoading) + } + + private var startBadge: some View { + VStack(spacing: 0) { + Text("3초만에 시작하기") + .font(.hanSansNeo(12, .bold)) + .foregroundStyle(.white) + .padding(.horizontal, 12) + .padding(.vertical, 6) + .background(Color(hex: "FB4F4F"), in: Capsule()) + Image(systemName: "arrowtriangle.down.fill") + .font(.system(size: 10)) + .foregroundStyle(Color(hex: "FB4F4F")) + .offset(y: -2) + } + } } diff --git a/Modules/Features/Auth/Sources/Login/View/ViewModel/LoginViewModel.swift b/Modules/Features/Auth/Sources/Login/View/ViewModel/LoginViewModel.swift index 87454234..fe4ec4e6 100644 --- a/Modules/Features/Auth/Sources/Login/View/ViewModel/LoginViewModel.swift +++ b/Modules/Features/Auth/Sources/Login/View/ViewModel/LoginViewModel.swift @@ -13,88 +13,108 @@ import Observation @MainActor public final class LoginViewModel: ErrorHandling { private let loginUseCase: LoginUseCase + private let kakaoAuthService: KakaoAuthServiceProtocol + private let appleAuthService: AppleAuthServiceProtocol private let tokenStorage: TokenStorageProtocol private let appState: AppState - public var loginId: String - public var password: String - public var isUserIdValid: Bool - public var isUserPwdValid: Bool - public var errorMessage: String? public var isLoading: Bool - public var isSecurePassword: Bool = true - public var user: AuthUser? - public var isLoginIdError: Bool = false - public var isPasswordError: Bool = false public var currentError: AppError? public init( loginUseCase: LoginUseCase, + kakaoAuthService: KakaoAuthServiceProtocol, + appleAuthService: AppleAuthServiceProtocol, tokenStorage: TokenStorageProtocol, appState: AppState ) { self.loginUseCase = loginUseCase + self.kakaoAuthService = kakaoAuthService + self.appleAuthService = appleAuthService self.tokenStorage = tokenStorage self.appState = appState - self.loginId = "" - self.password = "" - self.isUserIdValid = false - self.isUserPwdValid = false self.isLoading = false - self.errorMessage = nil } - public func login(onSuccess: @escaping () -> Void) { + /// 카카오 로그인: SDK로 idToken 획득 후 서버 로그인 + public func loginWithKakao( + onLoggedIn: @escaping () -> Void, + onNeedSignup: @escaping (_ signupToken: String, _ suggestedNickname: String?) -> Void + ) { guard !isLoading else { return } isLoading = true Task { - defer { isLoading = false } - do { - _ = try await loginUseCase.execute(loginId: loginId, password: password) + let idToken = try await kakaoAuthService.fetchIDToken() + try await authenticate( + provider: .kakao, + idToken: idToken, + onLoggedIn: onLoggedIn, + onNeedSignup: onNeedSignup + ) + } catch { + isLoading = false + handle(error) + } + } + } - errorMessage = nil - isLoginIdError = false - isPasswordError = false + /// 애플 로그인: 서비스로 idToken 획득 후 서버 로그인 (카카오와 동일 흐름) + public func loginWithApple( + onLoggedIn: @escaping () -> Void, + onNeedSignup: @escaping (_ signupToken: String, _ suggestedNickname: String?) -> Void + ) { + guard !isLoading else { return } + isLoading = true - appState.login() - onSuccess() - } catch let error as LoginError { - handleLoginError(error) + Task { + do { + let idToken = try await appleAuthService.fetchIDToken() + try await authenticate( + provider: .apple, + idToken: idToken, + onLoggedIn: onLoggedIn, + onNeedSignup: onNeedSignup + ) } catch { - errorMessage = "로그인에 실패했습니다" - isPasswordError = false - isLoginIdError = false - handleError(error, feature: "login", operation: "login") + isLoading = false + handle(error) } } } - private func handleLoginError(_ error: LoginError) { - switch error { - case .invalidPassword: - errorMessage = error.localizedDescription - isPasswordError = true - isLoginIdError = false - case .accountNotFound: - errorMessage = error.localizedDescription - isLoginIdError = true - isPasswordError = false - case .networkError(let underlying): - isPasswordError = false - isLoginIdError = false - handleError(underlying, feature: "login", operation: "login") - return - case .tokenPersistenceFailed: - isPasswordError = false - isLoginIdError = false + private func authenticate( + provider: SocialProvider, + idToken: String, + onLoggedIn: @escaping () -> Void, + onNeedSignup: @escaping (_ signupToken: String, _ suggestedNickname: String?) -> Void + ) async throws { + defer { isLoading = false } + let result = try await loginUseCase.execute(provider: provider, idToken: idToken) + currentError = nil + + switch result { + case .registered: + appState.login() + onLoggedIn() + case let .newUser(signupToken, suggestedNickname): + onNeedSignup(signupToken, suggestedNickname) } - currentError = .userMessage(error.localizedDescription) } - public var isLoginEnabled: Bool { - !loginId.isEmpty && !password.isEmpty + private func handle(_ error: Error) { + switch error { + case LoginError.cancelled: + // 사용자가 취소 — 조용히 무시 + break + case LoginError.missingIDToken: + currentError = .userMessage(LoginError.missingIDToken.localizedDescription) + case LoginError.networkError(let underlying): + handleError(underlying, feature: "login", operation: "socialLogin") + default: + handleError(error, feature: "login", operation: "socialLogin") + } } public func loginAsGuest() { diff --git a/Modules/Features/Auth/Sources/Signup/Curation/CurationView.swift b/Modules/Features/Auth/Sources/Signup/Curation/CurationView.swift index 43cf0539..4fae6c83 100644 --- a/Modules/Features/Auth/Sources/Signup/Curation/CurationView.swift +++ b/Modules/Features/Auth/Sources/Signup/Curation/CurationView.swift @@ -56,7 +56,6 @@ private extension CurationView { .scrollIndicators(.hidden) Button { - viewModel.reset() onAuthenticated() } label: { Text("메인으로") diff --git a/Modules/Features/Auth/Sources/Signup/Popup/SignupPopupView.swift b/Modules/Features/Auth/Sources/Signup/Popup/SignupPopupView.swift deleted file mode 100644 index f80386a9..00000000 --- a/Modules/Features/Auth/Sources/Signup/Popup/SignupPopupView.swift +++ /dev/null @@ -1,119 +0,0 @@ -// -// SignupPopupView.swift -// Signup -// -// Created by 권민재 on 4/7/25. -// Copyright © 2025 Newdok. All rights reserved. -// - -import SwiftUI -import AuthDomain -import DesignSystem - -public struct SignupPopupView: View { - var infos: [AuthSimpleUser] - var onClose: () -> Void - var onLogin: () -> Void - var onRecovery: () -> Void - - public var body: some View { - VStack(spacing: 0) { - Image(asset: DesignSystemAsset.warning) - .resizable() - .frame(width: 80, height: 80) - .padding(.top, 20) - .padding(.bottom, 6) - - Text("이미 가입된 정보입니다.") - .font(.hanSansNeo(18, .bold)) - - Text("한 번호로 최대 3개의\n계정을 만들 수 있어요.") - .font(.hanSansNeo(14, .regular)) - .foregroundStyle(Color.captionBody) - .multilineTextAlignment(.center) - .padding(.top, 6) - - VStack(alignment: .leading) { - ForEach(0..? - private var verificationTask: Task? - private var idCheckTask: Task? private var interestsTask: Task? private var signupTask: Task? - // MARK: password - public var password: String = "" - public var checkedPassword: String = "" - - // MARK: profile + // MARK: - Profile public var nickname: String = "" public var birthYear: String = "" public var gender: String = "" + // MARK: - Agreements + public var agreeOver14: Bool = false + public var agreeService: Bool = false + public var agreePersonalInfo: Bool = false + public var agreeMarketing: Bool = false + public var user: AuthUser? - // MARK: Investigate + // MARK: - Investigate public var myIndustry: String = "" public var selectedInterests: Set = [] public var recommendedPost: [AuthRecommendedBrand] = [] public var isCurationLoading = false public init( + signupToken: String, + suggestedNickname: String?, authRepository: AuthRepository, signupUseCase: SignupUseCase, userInfoStore: UserInfoStoreProtocol, selectableItemStore: SelectableItemStoreProtocol, appState: AppState ) { + self.signupToken = signupToken + self.nickname = suggestedNickname ?? "" self.authRepository = authRepository self.signupUseCase = signupUseCase self.userInfoStore = userInfoStore @@ -122,179 +70,12 @@ public final class SignupViewModel: ErrorHandling { public func goToNextStep() { if let next = SignupStep(rawValue: currentStep.rawValue + 1) { currentStep = next - resendFailureCount = 0 - stopTimer() - isRequestSent = false - timerRemaining = 180 - showError = false - skipUserCheck = false - shouldFocusVerificationCode = false } } public func goToPreviousStep() { if let prev = SignupStep(rawValue: currentStep.rawValue - 1) { currentStep = prev - resendFailureCount = 0 - stopTimer() - isRequestSent = false - timerRemaining = 180 - showError = false - skipUserCheck = false - shouldFocusVerificationCode = false - } - } - - public func resetVerificationState() { - stopTimer() - isShowPopup = false - isRequestSent = false - timerRemaining = 180 - showError = false - enteredVerificationCode = "" - resendFailureCount = 0 - verificationCode = "" - skipUserCheck = false - shouldFocusVerificationCode = false - } - - // MARK: - 인증코드 전송 (초기/재전송 공통) - public func sendVerificationCode(skipCheck: Bool = false) { - #if DEBUG - enteredVerificationCode = "" - showError = false - timerRemaining = 180 - isRequestSent = true - startTimer() - shouldFocusVerificationCode = true - verificationCode = "121212" - #else - guard resendFailureCount < 3 else { - isShowPopup = true - return - } - - if isRequestSent { - resendFailureCount += 1 - } - verificationTask?.cancel() - verificationTask = Task { - do { - isLoading = true - userList = [] - isShowUserList = false - errorMessage = nil - enteredVerificationCode = "" - showError = false - timerRemaining = 180 - - if !skipCheck && !skipUserCheck { - let users = try await authRepository.checkPhoneNumber(phoneNumber) - if !users.isEmpty { - userList = users - isShowUserList = true - showAlreadyRegisteredAlert = true - isLoading = false - return - } - } - - let result = try await authRepository.authSMS(phoneNumber: phoneNumber) - verificationCode = String(result.code) - await MainActor.run { - isRequestSent = true - startTimer() - shouldFocusVerificationCode = true - } - } catch { - handleError(error, feature: "signup", operation: "sendVerificationCode") - errorMessage = currentError?.userFacingMessage - resendFailureCount += 1 - } - isLoading = false - } - #endif - } - - // MARK: - 인증번호 검증 - func verifyCode() -> Bool { - guard isRequestSent else { return false } - if timerRemaining <= 0 { - showError = true - return false - } - - #if DEBUG - if enteredVerificationCode == "121212" { - stopTimer() - resendFailureCount = 0 - showError = false - return true - } - #endif - - if enteredVerificationCode == verificationCode { - stopTimer() - resendFailureCount = 0 - showError = false - return true - } else { - showError = true - return false - } - } - - // MARK: - Timer - private func startTimer() { - stopTimer() - isTimerActive = true - timerTask = Task { [weak self] in - while !Task.isCancelled { - guard let vm = self, vm.timerRemaining > 0 else { break } - do { - try await Task.sleep(for: .seconds(1)) - } catch { - break - } - if Task.isCancelled { break } - vm.timerRemaining -= 1 - } - if let vm = self, vm.timerRemaining <= 0 { - vm.isTimerActive = false - vm.showError = true - } - } - } - - private func stopTimer() { - isTimerActive = false - timerTask?.cancel() - timerTask = nil - } - - // MARK: - ID Dup Check - public func checkIDDup() { - guard SignupFormatStyle.validateID(loginID) == nil else { - isIDAvailable = nil - return - } - - isIDAvailable = nil - idCheckTask?.cancel() - idCheckTask = Task { @MainActor in - do { - let result = try await authRepository.checkIDDup(loginID) - switch result { - case .exists: - isIDAvailable = false - case .notFound: - isIDAvailable = true - } - } catch { - guard !Task.isCancelled else { return } - isIDAvailable = nil - handleError(error, feature: "signup", operation: "checkIDDup") - } } } @@ -358,12 +139,16 @@ public final class SignupViewModel: ErrorHandling { signupTask = Task { do { let request = AuthSignupRequest( - loginId: loginID, - password: password, - phoneNumber: phoneNumber, + signupToken: signupToken, nickname: nickname, birthYear: birthYear, - gender: gender + gender: gender, + agreements: [ + AuthAgreement(type: .ageConfirmationOver14, agreed: agreeOver14), + AuthAgreement(type: .termsOfService, agreed: agreeService), + AuthAgreement(type: .personalInformation, agreed: agreePersonalInfo), + AuthAgreement(type: .marketing, agreed: agreeMarketing) + ] ) let resultUser = try await signupUseCase.execute(request: request) @@ -380,40 +165,4 @@ public final class SignupViewModel: ErrorHandling { } } } - - // MARK: - 초기화 메서드 - public func reset() { - currentStep = .phoneVerification - - phoneNumber = "" - enteredVerificationCode = "" - verificationCode = "" - resendFailureCount = 0 - - loginID = "" - isIDAvailable = nil - password = "" - nickname = "" - birthYear = "" - gender = "" - - user = nil - recommendedPost = [] - selectedInterests.removeAll() - myIndustry = "" - - errorMessage = nil - showError = false - isLoading = false - isRequestSent = false - timerRemaining = 180 - isShowPopup = false - - stopTimer() - verificationTask?.cancel() - idCheckTask?.cancel() - interestsTask?.cancel() - signupTask?.cancel() - isCurationLoading = false - } } diff --git a/Modules/Features/Auth/Sources/Signup/Step/AgreeView.swift b/Modules/Features/Auth/Sources/Signup/Step/AgreeView.swift index 275f37b8..e0e68d8a 100644 --- a/Modules/Features/Auth/Sources/Signup/Step/AgreeView.swift +++ b/Modules/Features/Auth/Sources/Signup/Step/AgreeView.swift @@ -10,11 +10,6 @@ import DesignSystem import WebKit public struct AgreeView: View { - @State private var isOver14 = false - @State private var serviceAgreement = false - @State private var personalInfoAgreement = false - @State private var marketingAgreement = false - @State private var showSheet = false @State private var sheetType: SheetType? @@ -33,31 +28,31 @@ public struct AgreeView: View { VStack(spacing: 16) { // 버튼 없는 행 - SimpleAgreementRow(title: "만 14세 이상 확인", required: true, isChecked: $isOver14) - + SimpleAgreementRow(title: "만 14세 이상 확인", required: true, isChecked: $viewModel.agreeOver14) + // 버튼 있는 행 TappableAgreementRow( mainText: "서비스 이용", required: true, - isChecked: $serviceAgreement, + isChecked: $viewModel.agreeService, onTextTap: { sheetType = .terms showSheet = true } ) - + TappableAgreementRow( mainText: "개인정보 수집 및 이용", required: true, - isChecked: $personalInfoAgreement, + isChecked: $viewModel.agreePersonalInfo, onTextTap: { sheetType = .privacy showSheet = true } ) - + // 버튼 없는 행 - SimpleAgreementRow(title: "마케팅 활용/광고성 정보 수신", required: false, isChecked: $marketingAgreement) + SimpleAgreementRow(title: "마케팅 활용/광고성 정보 수신", required: false, isChecked: $viewModel.agreeMarketing) } .padding(.top, 8) .padding(.horizontal, 24) @@ -71,11 +66,11 @@ public struct AgreeView: View { .font(.hanSansNeo(16, .medium)) Spacer() Button { - let toggle = !(isOver14 && serviceAgreement && personalInfoAgreement && marketingAgreement) - isOver14 = toggle - serviceAgreement = toggle - personalInfoAgreement = toggle - marketingAgreement = toggle + let toggle = !isAllAgreed + viewModel.agreeOver14 = toggle + viewModel.agreeService = toggle + viewModel.agreePersonalInfo = toggle + viewModel.agreeMarketing = toggle } label: { Image(asset: isAllAgreed ? DesignSystemAsset.allcheck : DesignSystemAsset.uncheck) .frame(width: 44, height: 44) @@ -128,11 +123,11 @@ public struct AgreeView: View { } private var isSignUpEnabled: Bool { - isOver14 && serviceAgreement && personalInfoAgreement + viewModel.agreeOver14 && viewModel.agreeService && viewModel.agreePersonalInfo } private var isAllAgreed: Bool { - isOver14 && serviceAgreement && personalInfoAgreement && marketingAgreement + viewModel.agreeOver14 && viewModel.agreeService && viewModel.agreePersonalInfo && viewModel.agreeMarketing } enum SheetType { diff --git a/Modules/Features/Auth/Sources/Signup/Step/IDInputView.swift b/Modules/Features/Auth/Sources/Signup/Step/IDInputView.swift deleted file mode 100644 index c4510193..00000000 --- a/Modules/Features/Auth/Sources/Signup/Step/IDInputView.swift +++ /dev/null @@ -1,99 +0,0 @@ -// -// IDInputView.swift -// Newdok -// -// Created by 권민재 on 2/20/25. -// - -import SwiftUI -import DesignSystem - - -public struct IDInputView: View { - @FocusState private var isIDFocused: Bool - @Bindable private var viewModel: SignupViewModel - - public init(viewModel: SignupViewModel) { - self.viewModel = viewModel - } - - public var body: some View { - ZStack(alignment: .bottom) { - ScrollView { - VStack(alignment: .leading, spacing: 0) { - Text("아이디를\n입력해주세요.") - .font(.hanSansNeo(20, .bold)) - .padding(.top, 24) - - Text("아이디") - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - .padding(.top, 42) - .padding(.bottom, 8) - - HStack { - TextField("6~12자,영문/숫자 조합", text: $viewModel.loginID) - .font(.hanSansNeo(14, .medium)) - .customTextFieldStyle(isError: viewModel.isIDErrorState, isFocused: $isIDFocused) - .frame(height: 56) - .focused($isIDFocused) - - Button("중복확인") { - viewModel.checkIDDup() - } - .font(.hanSansNeo(14, .bold)) - .frame(width: 94, height: 48) - .foregroundStyle(viewModel.isIDCheckEnabled ? Color.primaryNormal : Color.captionDisabled) - .overlay { - RoundedRectangle(cornerRadius: 4) - .stroke(viewModel.isIDCheckEnabled ? Color.primaryNormal : Color.captionDisabled, lineWidth: 1) - } - .disabled(!viewModel.isIDCheckEnabled) - } - - if let message = viewModel.idValidationMessage { - Text(message.text) - .font(.hanSansNeo(12, .medium)) - .foregroundStyle(message.color) - .padding(.top, 8) - } - - Spacer().frame(height: 100) - } - .padding(.horizontal, 24) - } - - .ignoresSafeArea(.keyboard) - - Button(action: { - viewModel.goToNextStep() - }) { - Text("다음") - .font(.hanSansNeo(14, .bold)) - .frame(height: 48) - .frame(maxWidth: .infinity) - .background(viewModel.isIDAvailable == true ? Color.primaryNormal : Color.lineNeutral) - .foregroundColor(.white) - .cornerRadius(4) - } - .disabled(viewModel.isIDAvailable != true) - .padding(.horizontal, 24) - .padding(.bottom, 20) - } - .scrollDisabled(true) - .toolbar { - ToolbarItemGroup(placement: .keyboard) { - Spacer() - Button("Done") { - isIDFocused = false - } - .foregroundStyle(Color.primaryNormal) - .font(.hanSansNeo(17, .medium)) - } - } - } -} - -// #Preview { -// IDInputView(nextStep: {}) -// } diff --git a/Modules/Features/Auth/Sources/Signup/Step/PhoneVerificationView.swift b/Modules/Features/Auth/Sources/Signup/Step/PhoneVerificationView.swift deleted file mode 100644 index 471fbaf8..00000000 --- a/Modules/Features/Auth/Sources/Signup/Step/PhoneVerificationView.swift +++ /dev/null @@ -1,248 +0,0 @@ -// -// PhoneVerificationView.swift -// Newdok -// -// Created by 권민재 on 2/18/25. -// -import SwiftUI - -import DesignSystem -import Shared -import FoundationKit -import PopupView -import AuthDomain - -public struct PhoneVerificationView: View { - @FocusState private var isPhoneFieldFocused: Bool - @FocusState private var isVerificationCodeFocused: Bool - - @Bindable private var viewModel: SignupViewModel - private let onLogin: () -> Void - private let onRecovery: () -> Void - - public init( - viewModel: SignupViewModel, - onLogin: @escaping () -> Void, - onRecovery: @escaping () -> Void - ) { - self.viewModel = viewModel - self.onLogin = onLogin - self.onRecovery = onRecovery - } - - public var body: some View { - ZStack(alignment: .bottom) { - ScrollView(.vertical, showsIndicators: false) { - VStack(alignment: .leading, spacing: 0) { - Text("본인 확인을 위해\n휴대폰 번호를 입력해주세요.") - .font(.hanSansNeo(20, .bold)) - .padding(.leading, 24) - .padding(.top, 24) - - Text("휴대폰 번호") - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - .padding(.top, 42) - .padding(.leading, 28) - .padding(.bottom, 8) - - HStack(spacing: 8) { - HStack { - Image(asset: DesignSystemAsset.phone) - .renderingMode(.template) - .foregroundStyle(isPhoneFieldFocused ? Color.captionStrong : Color.captionAssistive) - .padding(.leading, 20) - - TextField("-구분 없이 입력", text: $viewModel.phoneNumber) - .font(.hanSansNeo(14, .medium)) - .keyboardType(.numberPad) - .focused($isPhoneFieldFocused) - .padding(.vertical, 12) - .padding(.horizontal, 8) - .onChange(of: viewModel.phoneNumber) { _, newValue in - viewModel.phoneNumber = newValue.newdokDigitsOnly(limit: 11) - } - } - .frame(height: 48) - .background(Color.white) - .overlay( - RoundedRectangle(cornerRadius: 4) - .stroke(isPhoneFieldFocused ? Color.primaryNormal : Color.lineAlternative, lineWidth: 1) - ) - - // 일반적인 인증 요청/재전송 버튼 (항상 표시) - Button(viewModel.isRequestSent ? "재전송" : "인증 요청") { - viewModel.enteredVerificationCode = "" - viewModel.showError = false - // 재전송인 경우 skipCheck: true로 호출 - if viewModel.isRequestSent { - viewModel.sendVerificationCode(skipCheck: true) - } else { - viewModel.sendVerificationCode() - } - } - .font(.hanSansNeo(14, .bold)) - .foregroundStyle(!viewModel.isPhoneNumberValid ? Color.grayLight : Color.primaryNormal) - .disabled(!viewModel.isPhoneNumberValid) - .frame(width: 94, height: 48) - .overlay( - RoundedRectangle(cornerRadius: 4) - .stroke(!viewModel.isPhoneNumberValid ? Color.captionDisabled : Color.primaryNormal, lineWidth: 1) - ) - } - .padding(.horizontal, 24) - - if viewModel.isRequestSent { - VStack(alignment: .leading) { - Text("인증번호") - .font(.hanSansNeo(14, .medium)) - .padding(.leading, 24) - .padding(.top, 24) - - HStack { - HStack { - Image(asset: DesignSystemAsset.lineLock) - .renderingMode(.template) - .foregroundStyle(isVerificationCodeFocused ? Color.captionStrong : Color.captionAssistive) - TextField("6자리 숫자 입력", text: $viewModel.enteredVerificationCode) - .keyboardType(.numberPad) - .font(.hanSansNeo(14, .medium)) - .focused($isVerificationCodeFocused) - .onChange(of: viewModel.enteredVerificationCode) { _, newValue in - viewModel.enteredVerificationCode = newValue.newdokDigitsOnly(limit: 6) - } - } - .padding(.horizontal, 16) - .frame(height: 50) - - Text(viewModel.timerRemaining > 0 ? NewdokVerificationTimerFormatStyle().format(viewModel.timerRemaining) : "만료됨") - .foregroundStyle(Color.captionStrong) - .font(.hanSansNeo(12, .medium)) - .padding(.trailing, 10) - } - .background(viewModel.showError || viewModel.timerRemaining <= 0 ? Color.red.opacity(0.1) : .white) - .overlay( - RoundedRectangle(cornerRadius: 5) - .stroke(viewModel.showError || viewModel.timerRemaining <= 0 ? .red : (isVerificationCodeFocused ? Color.primaryNormal : Color.lineAlternative), lineWidth: 1) - ) - .padding(.horizontal, 24) - - Text(viewModel.timerRemaining <= 0 ? "인증번호를 재전송해주세요." : (viewModel.showError ? "인증번호를 다시 확인해주세요." : "문자가 오지 않는다면 '재전송'을 눌러주세요.")) - .font(.hanSansNeo(12, .medium)) - .foregroundStyle(viewModel.timerRemaining <= 0 || viewModel.showError ? .red : Color.captionBody) - .padding(.leading, 24) - .padding(.top, 6) - } - } - - Spacer().frame(height: 100) - } - } - .toolbar { - ToolbarItemGroup(placement: .keyboard) { - Spacer() - Button("Done") { - isPhoneFieldFocused = false - isVerificationCodeFocused = false - } - .foregroundStyle(Color.primaryNormal) - .font(.hanSansNeo(17, .medium)) - } - } - - .onChange(of: viewModel.shouldFocusVerificationCode) { _, shouldFocus in - if shouldFocus { - // UI 업데이트 완료를 위한 약간의 지연 - Task { - try await Task.sleep(for: .seconds(0.1)) - isVerificationCodeFocused = true - } - viewModel.shouldFocusVerificationCode = false // 상태 리셋 - } - } - - if viewModel.isRequestSent { - Button(action: { - if viewModel.verifyCode() { - viewModel.goToNextStep() - } - }) { - Text("다음") - .font(.hanSansNeo(14, .bold)) - .frame(height: 48) - .frame(maxWidth: .infinity) - .background((viewModel.enteredVerificationCode.count < 6 || viewModel.timerRemaining <= 0) ? Color.lineNeutral : Color.primaryNormal) - .foregroundColor(.white) - .cornerRadius(4) - } - .disabled(viewModel.enteredVerificationCode.count < 6 || viewModel.timerRemaining <= 0) - .padding(.horizontal, 24) - .padding(.bottom, 20) - .contentShape(Rectangle()) - } - } - .scrollDisabled(true) - .ignoresSafeArea(.keyboard) - .onAppear { - // 화면 진입 시 휴대폰 번호 입력 필드로 포커스 - isPhoneFieldFocused = true - } - .popup(isPresented: $viewModel.isShowUserList) { - SignupPopupView( - infos: viewModel.userList, - onClose: { - viewModel.isShowUserList = false - // 기존 사용자가 3명 미만일 때만 계속 진행 - if viewModel.userList.count < 3 { - viewModel.skipUserCheck = true - viewModel.sendVerificationCode(skipCheck: true) - } - }, - onLogin: { - viewModel.isShowUserList = false - onLogin() - }, - onRecovery: { - viewModel.isShowUserList = false - onRecovery() - } - ) - } customize: { - $0 - .type(.default) - .position(.center) - .animation(.easeInOut) - .closeOnTapOutside(false) - .closeOnTap(false) - .allowTapThroughBG(false) - .backgroundColor(Color.bgPopupDim.opacity(0.6)) - } - - .popup(isPresented: $viewModel.isShowPopup) { - AuthFailView(onClose: { - viewModel.resetVerificationState() - }) - } customize: { - $0 - .type(.default) - .position(.center) - .animation(.easeInOut) - .closeOnTapOutside(false) - .closeOnTap(false) - .allowTapThroughBG(false) - .backgroundColor(Color.bgPopupDim.opacity(0.6)) - } - } - -} - -struct PrimaryButtonStyle: ButtonStyle { - func makeBody(configuration: Configuration) -> some View { - configuration.label - .frame(maxWidth: .infinity) - .background(configuration.isPressed ? .gray : .primaryNormal) - .font(.hanSansNeo(14, .medium)) - .foregroundColor(.white) - .cornerRadius(8) - } -} diff --git a/Modules/Features/Auth/Sources/Signup/Step/PwInputView.swift b/Modules/Features/Auth/Sources/Signup/Step/PwInputView.swift deleted file mode 100644 index c33130d5..00000000 --- a/Modules/Features/Auth/Sources/Signup/Step/PwInputView.swift +++ /dev/null @@ -1,164 +0,0 @@ -// -// PwInputView.swift -// Newdok -// -// Created by 권민재 on 2/20/25. -// - -import SwiftUI -import DesignSystem -import AuthDomain -import FoundationKit - -public struct PwInputView: View { - @State private var isSecurePassword: Bool = true - @State private var isSecureConfirmPassword: Bool = true - - @FocusState private var isPasswordFocused: Bool - @FocusState private var isConfirmPasswordFocused: Bool - - @Bindable private var viewModel: SignupViewModel - - public init(viewModel: SignupViewModel) { - self.viewModel = viewModel - } - - public var body: some View { - ZStack(alignment: .bottom) { - ScrollView { - VStack(alignment: .leading) { - Text("비밀번호를\n입력해주세요.") - .font(.hanSansNeo(20, .bold)) - .padding(.top, 24) - - // MARK: - 비밀번호 - Text("비밀번호") - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - .padding(.top, 42) - - Group { - if isSecurePassword { - SecureField("8자 이상, 영문/숫자 조합", text: $viewModel.password) - .font(.hanSansNeo(14, .medium)) - } else { - TextField("8자 이상, 영문/숫자 조합", text: $viewModel.password) - .font(.hanSansNeo(14, .medium)) - } - } - .modifier( - PasswordFieldModifier( - isSecure: $isSecurePassword, - isFocused: $isPasswordFocused, - isError: viewModel.isPasswordInputError - ) - ) - .focused($isPasswordFocused) - - if let message = viewModel.passwordValidationMessage { - Text(message) - .font(.hanSansNeo(12, .medium)) - .foregroundColor(.red) - .padding(.top, 4) - } - - // MARK: - 비밀번호 확인 - Text("비밀번호 확인") - .font(.hanSansNeo(14, .medium)) - .foregroundStyle(Color.captionNeutral) - .padding(.top, 22) - - Group { - if isSecureConfirmPassword { - SecureField("8자 이상, 영문/숫자 조합", text: $viewModel.checkedPassword) - .font(.hanSansNeo(14, .medium)) - } else { - TextField("8자 이상, 영문/숫자 조합", text: $viewModel.checkedPassword) - .font(.hanSansNeo(14, .medium)) - } - } - .modifier( - PasswordFieldModifier( - isSecure: $isSecureConfirmPassword, - isFocused: $isConfirmPasswordFocused, - isError: viewModel.isConfirmPasswordError - ) - ) - .focused($isConfirmPasswordFocused) - - if viewModel.isConfirmPasswordError { - Text("비밀번호가 일치하지 않습니다.") - .font(.hanSansNeo(12, .medium)) - .foregroundColor(.red) - .padding(.top, 4) - } - - Spacer().frame(height: 100) - } - .padding(.horizontal, 24) - } - .ignoresSafeArea(.keyboard) - - - // MARK: - 다음 버튼 - Button(action: { - viewModel.goToNextStep() - }) { - Text("다음") - .font(.hanSansNeo(14, .bold)) - .frame(height: 48) - .frame(maxWidth: .infinity) - .background(viewModel.isPasswordConfirmed ? Color.primaryNormal : Color.lineNeutral) - .cornerRadius(4) - .foregroundColor(.white) - .contentShape(Rectangle()) - } - .padding(.horizontal, 24) - .padding(.bottom, 20) - .disabled(!viewModel.isPasswordConfirmed) - } - .scrollDisabled(true) - .toolbar { - ToolbarItemGroup(placement: .keyboard) { - Spacer() - Button("Done") { - isPasswordFocused = false - isConfirmPasswordFocused = false - } - .foregroundStyle(Color.primaryNormal) - .font(.hanSansNeo(17, .medium)) - } - } - } -} - -extension SignupViewModel { - var isPasswordValid: Bool { - SignupFormatStyle.validatePassword(password) == nil - } - - var isPasswordConfirmed: Bool { - isPasswordValid && password == checkedPassword - } - - var passwordsMismatch: Bool { - !checkedPassword.isEmpty && password != checkedPassword - } - - var isPasswordInputError: Bool { - !password.isEmpty && !isPasswordValid - } - - var isConfirmPasswordError: Bool { - !checkedPassword.isEmpty && password != checkedPassword - } - - var passwordValidationError: PasswordValidationError? { - guard !password.isEmpty else { return nil } - return SignupFormatStyle.validatePassword(password) - } - - var passwordValidationMessage: String? { - passwordValidationError?.message - } -} diff --git a/Modules/Features/Auth/Sources/UseCase/LoginUseCaseImpl.swift b/Modules/Features/Auth/Sources/UseCase/LoginUseCaseImpl.swift index 7ab93934..9de5c531 100644 --- a/Modules/Features/Auth/Sources/UseCase/LoginUseCaseImpl.swift +++ b/Modules/Features/Auth/Sources/UseCase/LoginUseCaseImpl.swift @@ -1,10 +1,3 @@ -// -// LoginUseCaseImpl.swift -// Domain -// -// Created by 권민재 on 2/14/26. -// - import Foundation import AuthDomain import Shared @@ -16,8 +9,7 @@ public final class LoginUseCaseImpl: LoginUseCase { self.authRepository = authRepository } - public func execute(loginId: String, password: String) async throws -> AuthUser { - let (user, _) = try await authRepository.login(loginId: loginId, password: password) - return user + public func execute(provider: SocialProvider, idToken: String) async throws -> SocialLoginResultType { + try await authRepository.login(provider: provider, idToken: idToken) } } diff --git a/Modules/Features/Auth/Sources/UseCase/SignupUseCaseImpl.swift b/Modules/Features/Auth/Sources/UseCase/SignupUseCaseImpl.swift index a6d1f7c5..063ecd5e 100644 --- a/Modules/Features/Auth/Sources/UseCase/SignupUseCaseImpl.swift +++ b/Modules/Features/Auth/Sources/UseCase/SignupUseCaseImpl.swift @@ -13,22 +13,13 @@ public final class SignupUseCaseImpl: SignupUseCase { let trimmedNickname = request.nickname.trimmingCharacters(in: .whitespacesAndNewlines) let result = try await authRepository.signup( - loginId: request.loginId, - password: request.password, - phoneNumber: request.phoneNumber, + signupToken: request.signupToken, nickname: trimmedNickname, birthYear: request.birthYear, - gender: request.gender + gender: request.gender, + agreements: request.agreements ) - do { - let (user, _) = try await authRepository.login( - loginId: request.loginId, - password: request.password - ) - return user - } catch { - return result.user - } + return result.user } } diff --git a/Modules/Features/Auth/Testing/Sources/AuthTesting.swift b/Modules/Features/Auth/Testing/Sources/AuthTesting.swift index 0e5241f4..333f556a 100644 --- a/Modules/Features/Auth/Testing/Sources/AuthTesting.swift +++ b/Modules/Features/Auth/Testing/Sources/AuthTesting.swift @@ -2,21 +2,46 @@ import Foundation import AuthDomain public final class MockLoginUseCase: LoginUseCase, @unchecked Sendable { - public var result: Result = .success( - AuthUser(id: 1, loginId: "test", phoneNumber: "010", subscribeEmail: nil, - nickname: "테스터", birthYear: "2000", gender: "M", - createdAt: "2025-01-01", industryId: nil, interestIds: []) + public var result: Result = .success( + .registered( + AuthUser(id: 1, subscribeEmail: nil, + nickname: "테스터", birthYear: "2000", gender: "남자", + createdAt: "2025-01-01", industryId: nil, interestIds: []), + accessToken: "mock-access-token" + ) ) - public private(set) var executedLoginId: String? - public private(set) var executedPassword: String? + public private(set) var executedProvider: SocialProvider? + public private(set) var executedIDToken: String? public private(set) var executeCallCount = 0 public init() {} - public func execute(loginId: String, password: String) async throws -> AuthUser { + public func execute(provider: SocialProvider, idToken: String) async throws -> SocialLoginResultType { executeCallCount += 1 - executedLoginId = loginId - executedPassword = password + executedProvider = provider + executedIDToken = idToken return try result.get() } } + +@MainActor +public final class MockKakaoAuthService: KakaoAuthServiceProtocol { + public var result: Result = .success("mock-id-token") + + public nonisolated init() {} + + public func fetchIDToken() async throws -> String { + try result.get() + } +} + +@MainActor +public final class MockAppleAuthService: AppleAuthServiceProtocol { + public var result: Result = .success("apple-id-token") + + public nonisolated init() {} + + public func fetchIDToken() async throws -> String { + try result.get() + } +} diff --git a/Modules/Features/Auth/Tests/AuthTests.swift b/Modules/Features/Auth/Tests/AuthTests.swift index 33e40567..7c28415f 100644 --- a/Modules/Features/Auth/Tests/AuthTests.swift +++ b/Modules/Features/Auth/Tests/AuthTests.swift @@ -1,4 +1,5 @@ import Testing +import Foundation import Shared import FoundationKit @testable import Auth @@ -279,51 +280,26 @@ private final class StubTokenStorage: TokenStorageProtocol, @unchecked Sendable @MainActor struct LoginViewModelTests { private func makeSUT( - loginUseCase: MockLoginUseCase = .init() - ) -> (vm: LoginViewModel, login: MockLoginUseCase, tokenStorage: StubTokenStorage) { + loginUseCase: MockLoginUseCase = .init(), + kakaoAuthService: MockKakaoAuthService = .init(), + appleAuthService: MockAppleAuthService = .init() + ) -> (vm: LoginViewModel, login: MockLoginUseCase, kakao: MockKakaoAuthService, tokenStorage: StubTokenStorage) { let tokenStorage = StubTokenStorage() let vm = LoginViewModel( loginUseCase: loginUseCase, + kakaoAuthService: kakaoAuthService, + appleAuthService: appleAuthService, tokenStorage: tokenStorage, appState: AppState.shared ) - return (vm, loginUseCase, tokenStorage) - } - - // MARK: - isLoginEnabled - - @Test("아이디/비밀번호 모두 입력 시 로그인 활성화") - func isLoginEnabled_bothFilled() { - let (vm, _, _) = makeSUT() - vm.loginId = "testuser" - vm.password = "pass1234" - - #expect(vm.isLoginEnabled == true) - } - - @Test("아이디 비어있으면 로그인 비활성화") - func isLoginEnabled_emptyId() { - let (vm, _, _) = makeSUT() - vm.loginId = "" - vm.password = "pass1234" - - #expect(vm.isLoginEnabled == false) - } - - @Test("비밀번호 비어있으면 로그인 비활성화") - func isLoginEnabled_emptyPassword() { - let (vm, _, _) = makeSUT() - vm.loginId = "testuser" - vm.password = "" - - #expect(vm.isLoginEnabled == false) + return (vm, loginUseCase, kakaoAuthService, tokenStorage) } // MARK: - loginAsGuest @Test("게스트 로그인 시 토큰 클리어 및 로그아웃") func loginAsGuest_clearsTokenAndLogsOut() { - let (vm, _, tokenStorage) = makeSUT() + let (vm, _, _, tokenStorage) = makeSUT() AppState.shared.login() tokenStorage.accessToken = "some-token" @@ -333,71 +309,69 @@ struct LoginViewModelTests { #expect(AppState.shared.authState == .guest) } - // MARK: - login + // MARK: - loginWithKakao - @Test("로그인 성공 시 에러 초기화 및 인증 상태 전환") - func login_success() async { + @Test("카카오 로그인 성공 시 idToken 전달 및 인증 상태 전환") + func kakaoLogin_success() async { let mock = MockLoginUseCase() - let (vm, _, _) = makeSUT(loginUseCase: mock) - vm.loginId = "testuser" - vm.password = "pass1234" + let kakao = MockKakaoAuthService() + kakao.result = .success("kakao-id-token") + let (vm, _, _, _) = makeSUT(loginUseCase: mock, kakaoAuthService: kakao) AppState.shared.logout() var successCalled = false - vm.login { successCalled = true } + vm.loginWithKakao(onLoggedIn: { successCalled = true }, onNeedSignup: { _, _ in }) // 내부 Task 완료 대기 try? await Task.sleep(for: .milliseconds(50)) - #expect(mock.executedLoginId == "testuser") - #expect(mock.executedPassword == "pass1234") + #expect(mock.executedProvider == .kakao) + #expect(mock.executedIDToken == "kakao-id-token") #expect(successCalled == true) - #expect(vm.errorMessage == nil) - #expect(vm.isLoginIdError == false) - #expect(vm.isPasswordError == false) + #expect(vm.currentError == nil) #expect(AppState.shared.authState == .authenticated) } - @Test("로그인 실패 — invalidPassword") - func login_invalidPassword() async { - let mock = MockLoginUseCase() - mock.result = .failure(LoginError.invalidPassword) - let (vm, _, _) = makeSUT(loginUseCase: mock) - vm.loginId = "testuser" - vm.password = "wrongpass" + @Test("카카오 로그인 취소 시 에러 표시 없이 무시") + func kakaoLogin_cancelled() async { + let kakao = MockKakaoAuthService() + kakao.result = .failure(LoginError.cancelled) + let (vm, _, _, _) = makeSUT(kakaoAuthService: kakao) - vm.login { } + var successCalled = false + vm.loginWithKakao(onLoggedIn: { successCalled = true }, onNeedSignup: { _, _ in }) try? await Task.sleep(for: .milliseconds(50)) - #expect(vm.isPasswordError == true) - #expect(vm.isLoginIdError == false) - #expect(vm.errorMessage != nil) + #expect(successCalled == false) + #expect(vm.currentError == nil) + #expect(vm.isLoading == false) } - @Test("로그인 실패 — accountNotFound") - func login_accountNotFound() async { + @Test("카카오 로그인 네트워크 실패 시 에러 표시") + func kakaoLogin_networkError() async { let mock = MockLoginUseCase() - mock.result = .failure(LoginError.accountNotFound) - let (vm, _, _) = makeSUT(loginUseCase: mock) - vm.loginId = "nouser" - vm.password = "pass1234" + mock.result = .failure(LoginError.networkError(URLError(.notConnectedToInternet))) + let kakao = MockKakaoAuthService() + kakao.result = .success("kakao-id-token") + let (vm, _, _, _) = makeSUT(loginUseCase: mock, kakaoAuthService: kakao) - vm.login { } + vm.loginWithKakao(onLoggedIn: { }, onNeedSignup: { _, _ in }) try? await Task.sleep(for: .milliseconds(50)) - #expect(vm.isLoginIdError == true) - #expect(vm.isPasswordError == false) - #expect(vm.errorMessage != nil) + #expect(vm.currentError != nil) + #expect(vm.isLoading == false) } @Test("로딩 중 중복 호출 방지") - func login_duplicatePrevented() { - let (vm, mock, _) = makeSUT() + func kakaoLogin_duplicatePrevented() async { + let (vm, mock, _, _) = makeSUT() vm.isLoading = true - vm.login { } + vm.loginWithKakao(onLoggedIn: { }, onNeedSignup: { _, _ in }) + + try? await Task.sleep(for: .milliseconds(50)) #expect(mock.executeCallCount == 0) } diff --git a/Modules/Features/Bookmark/Bookmark.xcodeproj/project.pbxproj b/Modules/Features/Bookmark/Bookmark.xcodeproj/project.pbxproj index 348ea2ac..b9b12e89 100644 --- a/Modules/Features/Bookmark/Bookmark.xcodeproj/project.pbxproj +++ b/Modules/Features/Bookmark/Bookmark.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 041E31D70D5CEF8FC84F8A6A /* BookmarkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F66F6C2D2FE5931531949059 /* BookmarkViewModel.swift */; }; 087F2C6B78A32AE7E1D205C4 /* BookmarkDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */; }; 1458ECB9E29B36B27B2C65B4 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD58982C5C438D314E6BEC2A /* Moya.framework */; }; + 15B5B61710D883857442F7D8 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */; }; 176538BC0FF6A9B25033A910 /* MonthlyBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0206BD8483F955BBBE9319B6 /* MonthlyBookmark.swift */; }; 17D27226B3ACEBBA22B67FA4 /* BookmarkGuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A47C7D14746696637C609C95 /* BookmarkGuestView.swift */; }; 1A9388B3195E7434819F3A90 /* BookmarkDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */; }; @@ -26,6 +27,7 @@ 35E55A3EB79F3C79237B06A9 /* BookmarkData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 82057388BFC0F3F42C3F8205 /* BookmarkData.framework */; }; 36A1C8F8DBC81433306D7FFD /* Bookmark.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76BD577AD93EFB89FF1662CC /* Bookmark.framework */; }; 398C358B05E39D463566987A /* BookmarkSortBottomSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13F9A4DD3CE365312FF6EFD /* BookmarkSortBottomSheet.swift */; }; + 3F1C052B1B8FCFABBE443EF9 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */; }; 41214122226FE32CD3C03506 /* BookmarkDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */; }; 45925DF8DE7496C4348BD0F9 /* BookmarkInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7655ACA3BC556B119528725 /* BookmarkInterface.framework */; }; 46544D3CC066630ECA9B0AFE /* BookmarkDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177C50DB84A2207F875A86A6 /* BookmarkDTO.swift */; }; @@ -36,6 +38,7 @@ 5206F4FEEE24DA160A8A73E1 /* BookmarkRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DEC7FF30725688E6BE8DE19 /* BookmarkRepositoryImpl.swift */; }; 52645DC713DA5763373B841A /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */; }; 55B78CD6D6C94876F593D4D4 /* BookmarkDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */; }; + 58118EB0B59B21E0BB307280 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */; }; 5D699E791C8658B19EB124BE /* BookmarkRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E4D1C21AD8172E2DE26AB5 /* BookmarkRepository.swift */; }; 5DA795FD8AE82AF3E6657BB5 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */; }; 612EE9439A6C38F03EABBCF4 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 722BE9794BB696843B2378B9 /* Kingfisher.framework */; }; @@ -54,18 +57,20 @@ 9CDFF7E5C35845724D00EEF8 /* BookmarkItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D276B3421EA24CE847FEE3A2 /* BookmarkItem.swift */; }; 9D7C75A36F3F477772BD7FBE /* BookmarkEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 962531354FC80D68BEDB100B /* BookmarkEmptyView.swift */; }; A04E9AADF186FE1832AF4D59 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = DFCFEC2F6E5E0AB50AFCB559 /* NetworkKit.framework */; }; + A291F84729C809444E84AA46 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 22775B642171631175E5C887 /* Shared.framework */; }; A4986F3B592504E5025275B6 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */; }; + A5876B6DBB7C98F72CFD191F /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */; }; A7A6863FE15A79DB2C7C5B88 /* BookmarkDIContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877A2A9247AC50B3C3131A91 /* BookmarkDIContainer.swift */; }; + AFA065CCADB1C955C11D1EE7 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */; }; B077BEF4EBFB5B47890445A2 /* BookmarkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A67016F7ECAD609354E68E6 /* BookmarkView.swift */; }; B3DDE87514556E0BA6A6257E /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7097229A5B4D0C77F9A1AA9 /* PopupView.framework */; }; - B5602D28474E43E016E4B621 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BB3583AB8AFF5A8582A7EA5C /* Bookmark.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76BD577AD93EFB89FF1662CC /* Bookmark.framework */; }; BCB178B26120DAE57F765D76 /* FetchBookmarkedInterestsUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB8DFAD64525DD3CF1E7EDF /* FetchBookmarkedInterestsUseCaseImpl.swift */; }; BD2761C3F5A24B3D07E0DD13 /* BookmarkArticleAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311265B76A7A915B60EE7767 /* BookmarkArticleAPI.swift */; }; C1101C88BE3BC60EDA35F222 /* MockFetchBookmarkedArticlesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBEAB6D95837215A0E40807C /* MockFetchBookmarkedArticlesUseCase.swift */; }; C12F9D2C0850C3C1B5039645 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = DFCFEC2F6E5E0AB50AFCB559 /* NetworkKit.framework */; }; + C200E53FF641FB80FF25FBBC /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */; }; C3326C3758B8FE084CAF4D0A /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22775B642171631175E5C887 /* Shared.framework */; }; - C6294624C9177D6AB21D9D1C /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F0CCCA6FC1C50F4DD02B1CCC /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C6D2F181D424BE4BA0E205C4 /* BookmarkMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8CAFD478C6DDC83E089E3A7 /* BookmarkMain.swift */; }; C9713249EFF54B95D5957871 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 22775B642171631175E5C887 /* Shared.framework */; }; CB39ECF8F89EB6D5AAC4958E /* BookmarkInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7655ACA3BC556B119528725 /* BookmarkInterface.framework */; }; @@ -73,9 +78,11 @@ DB824CEA2A1609AD8764FBAB /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD58982C5C438D314E6BEC2A /* Moya.framework */; }; E5164B2889523A1E7FCCA93E /* BookmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D833BD260020B2F30A7E7FC8 /* BookmarkTests.swift */; }; E8D17997A650266731C11F30 /* MockFetchBookmarkedInterestsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D72B487917F46352154A5D /* MockFetchBookmarkedInterestsUseCase.swift */; }; + EA5E9ECBD41EC0272310C6FE /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */; }; EFEA28987FB90851599084C2 /* BookmarkInterestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8328380BADA8FF551AC269 /* BookmarkInterestDTO.swift */; }; F3A20883E17372BAE2995BDA /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFCFEC2F6E5E0AB50AFCB559 /* NetworkKit.framework */; }; F783D19B9CDAD845A9C48311 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7097229A5B4D0C77F9A1AA9 /* PopupView.framework */; }; + FF071D7F25F1A1CD20AC825D /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */; }; FF662E892BCA85526915A148 /* FetchBookmarkedArticlesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D31CA5BDB3B22749605469DE /* FetchBookmarkedArticlesUseCase.swift */; }; /* End PBXBuildFile section */ @@ -177,6 +184,18 @@ files = ( 8B9E4218261392B76342AFC1 /* BookmarkDomain.framework in Dependencies */, 6E2E23C7B71C7263BB660EE8 /* BookmarkInterface.framework in Dependencies */, + A291F84729C809444E84AA46 /* Shared.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 40DAC921EE2E1CE51FBB2E5C /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + AFA065CCADB1C955C11D1EE7 /* Alamofire_Alamofire.bundle in Dependencies */, + A5876B6DBB7C98F72CFD191F /* DesignSystem_DesignSystem.bundle in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -207,8 +226,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - C6294624C9177D6AB21D9D1C /* Alamofire.framework in Embed Frameworks */, - B5602D28474E43E016E4B621 /* DesignSystem.framework in Embed Frameworks */, D90025D498615250A14DA6C7 /* Kingfisher.framework in Embed Frameworks */, 0353DF8DA771DC2B45C38979 /* Moya.framework in Embed Frameworks */, 2B296FFE6CB88BCC3C50EF7B /* PopupView.framework in Embed Frameworks */, @@ -251,6 +268,17 @@ name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; + BF69A515542BB9C5AB004EB7 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 15B5B61710D883857442F7D8 /* Alamofire_Alamofire.bundle in Dependencies */, + C200E53FF641FB80FF25FBBC /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; C6A55BA645C11580C9F657C7 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -300,6 +328,7 @@ 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BookmarkDomain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 82057388BFC0F3F42C3F8205 /* BookmarkData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BookmarkData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 877A2A9247AC50B3C3131A91 /* BookmarkDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkDIContainer.swift; sourceTree = ""; }; + 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 928A9853C70554E2166EA819 /* BookmarkInterest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkInterest.swift; sourceTree = ""; }; 962531354FC80D68BEDB100B /* BookmarkEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkEmptyView.swift; sourceTree = ""; }; 97DAA337D2CC52A06A96F0BF /* BookmarkInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkInterface.swift; sourceTree = ""; }; @@ -309,6 +338,7 @@ B5D72B487917F46352154A5D /* MockFetchBookmarkedInterestsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchBookmarkedInterestsUseCase.swift; sourceTree = ""; }; B5E4D1C21AD8172E2DE26AB5 /* BookmarkRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkRepository.swift; sourceTree = ""; }; B5F84BC7D11297441DD5C5C4 /* BookmarkExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "BookmarkExample-Info.plist"; sourceTree = ""; }; + BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; BE0794787B1481BD387B2CC6 /* BookmarkExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkExampleApp.swift; sourceTree = ""; }; CD58982C5C438D314E6BEC2A /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D13F9A4DD3CE365312FF6EFD /* BookmarkSortBottomSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkSortBottomSheet.swift; sourceTree = ""; }; @@ -320,7 +350,6 @@ E20CAF6D40A69ECF1CABB4B5 /* BookmarkItem+Sample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BookmarkItem+Sample.swift"; sourceTree = ""; }; E7655ACA3BC556B119528725 /* BookmarkInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BookmarkInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EBEAB6D95837215A0E40807C /* MockFetchBookmarkedArticlesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchBookmarkedArticlesUseCase.swift; sourceTree = ""; }; - F0CCCA6FC1C50F4DD02B1CCC /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F1105013526F13651EC442F5 /* BookmarkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BookmarkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F5CC4B625E176A882F77C5A9 /* BookmarkData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "BookmarkData-Info.plist"; sourceTree = ""; }; @@ -439,7 +468,7 @@ 349FAF58BCF75F1E87F887B1 /* Products */ = { isa = PBXGroup; children = ( - F0CCCA6FC1C50F4DD02B1CCC /* Alamofire.framework */, + 89B93615CAA3A4B6EDE00CC7 /* Alamofire_Alamofire.bundle */, 76BD577AD93EFB89FF1662CC /* Bookmark.framework */, 82057388BFC0F3F42C3F8205 /* BookmarkData.framework */, 7D71C9FA16EA7F7B8C065C3F /* BookmarkDomain.framework */, @@ -447,6 +476,7 @@ E7655ACA3BC556B119528725 /* BookmarkInterface.framework */, 455970BB067D86A1E0357180 /* BookmarkTesting.framework */, F1105013526F13651EC442F5 /* BookmarkTests.xctest */, + BBDE9251A6A0136A7E26B3E5 /* DesignSystem_DesignSystem.bundle */, F2A5BEA1A83032F8516C05FC /* DesignSystem.framework */, 722BE9794BB696843B2378B9 /* Kingfisher.framework */, CD58982C5C438D314E6BEC2A /* Moya.framework */, @@ -685,6 +715,7 @@ 2BBBA6E24C5983E3548F5BA6 /* Resources */, CEC9DA134F79755CB448916B /* Frameworks */, 9767153D635DF53C78790F4A /* Embed Frameworks */, + 40DAC921EE2E1CE51FBB2E5C /* Dependencies */, ); buildRules = ( ); @@ -817,6 +848,7 @@ ACE72C6E428CCBA07334E279 /* Resources */, 20B520E08F0B31EDFD381617 /* Frameworks */, 9BC99EC1B32ACA3FFCFA4EAA /* Embed Frameworks */, + BF69A515542BB9C5AB004EB7 /* Dependencies */, ); buildRules = ( ); @@ -878,6 +910,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3F1C052B1B8FCFABBE443EF9 /* Alamofire_Alamofire.bundle in Resources */, + 58118EB0B59B21E0BB307280 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -892,6 +926,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + EA5E9ECBD41EC0272310C6FE /* Alamofire_Alamofire.bundle in Resources */, + FF071D7F25F1A1CD20AC825D /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1128,6 +1164,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.bookmark.example; PRODUCT_NAME = BookmarkExample; SDKROOT = iphoneos; @@ -1249,6 +1289,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.bookmark.tests; PRODUCT_NAME = BookmarkTests; SDKROOT = iphoneos; @@ -1309,6 +1353,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.bookmark.tests; PRODUCT_NAME = BookmarkTests; SDKROOT = iphoneos; @@ -1570,6 +1618,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.bookmark.example; PRODUCT_NAME = BookmarkExample; SDKROOT = iphoneos; diff --git a/Modules/Features/Detail/Derived/Sources/TuistBundle+Detail.swift b/Modules/Features/Detail/Derived/Sources/TuistBundle+Detail.swift index ed5f8133..7fbaf208 100644 --- a/Modules/Features/Detail/Derived/Sources/TuistBundle+Detail.swift +++ b/Modules/Features/Detail/Derived/Sources/TuistBundle+Detail.swift @@ -8,59 +8,49 @@ public import Foundation #else import Foundation #endif -// MARK: - Swift Bundle Accessor for Static Frameworks +// MARK: - Swift Bundle Accessor - for SPM +private class BundleFinder {} extension Foundation.Bundle { -/// Since Detail is a static framework, a cut down framework is embedded, with all the resources but only a stub Mach-O image. +/// Since Detail is a static framework, the bundle containing the resources is copied into the final product. static let module: Bundle = { - class BundleFinder {} - let hostBundle = Bundle(for: BundleFinder.self) - var candidates: [URL?] = [ - hostBundle.privateFrameworksURL, - hostBundle.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL, - hostBundle.bundleURL.deletingLastPathComponent(), - hostBundle.resourceURL, - Bundle.main.privateFrameworksURL, - Bundle.main.bundleURL.appendingPathComponent("Frameworks"), - Bundle.main.bundleURL, - Bundle.main.resourceURL, - // App extensions are placed under PlugIns/ in the host app bundle. - // Navigate up from the extension to the containing app's Frameworks directory. - hostBundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Frameworks"), - ].map({ $0?.appendingPathComponent("Detail.framework") }) - - for candidate in candidates { - if let bundle = candidate.flatMap(Bundle.init(url:)) { - return bundle - } - } - - var bundleCandidates: [URL?] = [ - hostBundle.resourceURL, - hostBundle.bundleURL, - hostBundle.privateFrameworksURL, - hostBundle.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL.deletingLastPathComponent(), + let bundleName = "Detail_Detail" + let bundleFinderResourceURL = Bundle(for: BundleFinder.self).resourceURL + var candidates = [ Bundle.main.resourceURL, + bundleFinderResourceURL, Bundle.main.bundleURL, - Bundle.main.privateFrameworksURL, - Bundle.main.bundleURL.appendingPathComponent("Frameworks"), - hostBundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Frameworks"), ] - if ProcessInfo.processInfo.processName == "xctest" - || ProcessInfo.processInfo.processName == "swift-testing" - { - bundleCandidates.append(hostBundle.bundleURL.appendingPathComponent("..")) + // This is a fix to make Previews work with bundled resources. + // Logic here is taken from SPM's generated `resource_bundle_accessors.swift` file, + // which is located under the derived data directory after building the project. + if let override = ProcessInfo.processInfo.environment["PACKAGE_RESOURCE_BUNDLE_PATH"] { + candidates.append(URL(fileURLWithPath: override)) + // Deleting derived data and not rebuilding the frameworks containing resources may result in a state + // where the bundles are only available in the framework's directory that is actively being previewed. + // Since we don't know which framework this is, we also need to look in all the framework subpaths. + if let subpaths = try? Foundation.FileManager.default.contentsOfDirectory(atPath: override) { + for subpath in subpaths { + if subpath.hasSuffix(".framework") { + candidates.append(URL(fileURLWithPath: override + "/" + subpath)) + } + } + } } - for candidate in bundleCandidates { - let bundlePath = candidate?.appendingPathComponent("Detail_Detail.bundle") + // This is a fix to make unit tests work with bundled resources. + // Making this change allows unit tests to search one directory up for a bundle. + // More context can be found in this PR: https://github.com/tuist/tuist/pull/6895 + #if canImport(XCTest) + candidates.append(bundleFinderResourceURL?.appendingPathComponent("..")) + #endif + + for candidate in candidates { + let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle") if let bundle = bundlePath.flatMap(Bundle.init(url:)) { return bundle } } - - return Bundle.main + fatalError("unable to find bundle named Detail_Detail") }() } // MARK: - Objective-C Bundle Accessor diff --git a/Modules/Features/Detail/Detail.xcodeproj/project.pbxproj b/Modules/Features/Detail/Detail.xcodeproj/project.pbxproj index faa810ec..9c3e0e17 100644 --- a/Modules/Features/Detail/Detail.xcodeproj/project.pbxproj +++ b/Modules/Features/Detail/Detail.xcodeproj/project.pbxproj @@ -10,16 +10,18 @@ 02011050E354A89285B0F4A3 /* BrandHeroSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED00ED0D2221095DD00FB727 /* BrandHeroSection.swift */; }; 0450697F87CB8BC06F7A5E9F /* DetailDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A96794BD3377F90430EF0E9C /* DetailDomain.framework */; }; 04C546B0F4B70C1166B95B1F /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE04B8BBFA30AEACC4320117 /* NetworkKit.framework */; }; + 0667E782E5C24B811488AF76 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */; }; 08BA15218FCD111910D8BC25 /* WebViewHighlightRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5356B36ADC85270B5B7CDB /* WebViewHighlightRenderer.swift */; }; 0D96F6D256F648B72CDA8740 /* DetailBrandRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCA96E6A68D1DB019BABD685 /* DetailBrandRepository.swift */; }; 0E9AD2803FD7D0A62CC1A072 /* MockToggleArticleBookmarkUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E155CB1056429557CEFA7CB /* MockToggleArticleBookmarkUseCase.swift */; }; 1104AEB09AC223B45D45C575 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767F6388D464E3D8420F18D2 /* Moya.framework */; }; - 1469C8EDD99065CD7F6A484B /* highlight-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 00857E16F4612780B31D3541 /* highlight-core.js */; }; 1536F42215DB595E7BF87726 /* DetailData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05B413B7BB7364B2A8EB43B8 /* DetailData.framework */; }; 168C6F27B1CEEDCFF161D62E /* HighlightStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42B2228FB1F42508CD26B420 /* HighlightStyle.swift */; }; 17317F475E53E771034636AE /* Moya.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 767F6388D464E3D8420F18D2 /* Moya.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1782F3096C1E7CF5B47F2DD1 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 16E9D08E995905CE2B02915B /* Shared.framework */; }; 19F643E350D25CC82773DF53 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 037730AF7DDB88D4A7CFEC27 /* Kingfisher.framework */; }; 1A2F518D2EDE2203A73E7E80 /* Kingfisher.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 037730AF7DDB88D4A7CFEC27 /* Kingfisher.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1D263DFC676106D57B258376 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */; }; 1D3BD41B18EAB5E2D01FAF9B /* SubscriptionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3341D48D082CA7690C2B06 /* SubscriptionStatus.swift */; }; 1F1C24F349A1AE534F26506D /* DetailBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E2DB91D8F8F689EC06B102 /* DetailBuilder.swift */; }; 1FD29103A636498CA0DB2477 /* MockDetailHighlightRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ECFC5C90FF58B3D2AF210DD /* MockDetailHighlightRepository.swift */; }; @@ -39,7 +41,6 @@ 41EDDEB6A736501BBDC3B8EF /* ViewUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67323218CF9E12697D8FE546 /* ViewUtilities.swift */; }; 42BE7BCA68F9154F81B54052 /* FontSizeControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5F7436AF686B88FA2D5EDE /* FontSizeControlView.swift */; }; 46307C5E2B1A1F7797AC400C /* DetailBrandDetailDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6752E8B1EC679205553468F /* DetailBrandDetailDTO.swift */; }; - 486BA0DC650B8C96131BEB8B /* Detail.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B95DEB0BB0769D679538C4A /* Detail.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4B5E536F51C6DA57CD664AC5 /* TuistBundle+Detail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB723250EB0641E40F4B90A /* TuistBundle+Detail.swift */; }; 4C3F28585649FEC6674AB04D /* ArticleHTMLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDBA229B6B3EF2923D805D2D /* ArticleHTMLBuilder.swift */; }; 4E25DF1EA440EC32B957A409 /* DetailArticleDetailDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2342B528C8EF2F01C4011A5 /* DetailArticleDetailDTO.swift */; }; @@ -47,21 +48,29 @@ 5964495ABC5CD31091FECF77 /* DetailError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8913DD26045FA9B30B463521 /* DetailError.swift */; }; 5A2A8EA92A5DD81BB02464B9 /* HighlightStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2298CEE69AC04C6C5CCF1106 /* HighlightStyleTests.swift */; }; 5E7B91384F72F810EBFBE662 /* DetailInterest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7F091D55409F8BB269CF55D /* DetailInterest.swift */; }; + 5F7F75B508746A1E3DEC88F0 /* Detail_Detail.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */; }; 60ACB81D3B115BDA82C1C0A1 /* DetailInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B1AE62965A0CCECBA5E4E62 /* DetailInterface.framework */; }; + 61A13AEB3C66BF2540DE02A3 /* highlight-selection.js in Resources */ = {isa = PBXBuildFile; fileRef = E238F6A510832E68B7A93E83 /* highlight-selection.js */; }; 62E57D9A477C43218EFCFD39 /* DetailMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = A883D2FFA63ECF6643BD9A68 /* DetailMain.swift */; }; 6700E3EA7BF1F1DB800C080F /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = DE04B8BBFA30AEACC4320117 /* NetworkKit.framework */; }; 677E6DFCF06377899199516C /* ToggleArticleBookmarkUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E25901C49FE9D1DDF1D3F2D /* ToggleArticleBookmarkUseCase.swift */; }; + 6794D14BFDEDB2DD9F1330C4 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */; }; + 718FFB94677AF52FEE96BB17 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */; }; 7244566371A2921D39B49139 /* DetailExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453D8A2E57EC8CB33197FB6A /* DetailExampleApp.swift */; }; 724756B27F58CA6CA2A5E5C5 /* DatabaseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F040FD94FD31D8B93AFC455 /* DatabaseKit.framework */; }; 72848D5788E2DC95EDB93370 /* DetailInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B1AE62965A0CCECBA5E4E62 /* DetailInterface.framework */; }; 78582CE852B3A16DCF9DD930 /* HighlightListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 710255FE24DC1AA428EBD25C /* HighlightListView.swift */; }; 785EA326B43908DB97C3B147 /* FetchArticleDetailUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19C9C8E4DD02773C8AA3821B /* FetchArticleDetailUseCaseImpl.swift */; }; 79B494C4D68174B622B3B2DC /* DetailDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A96794BD3377F90430EF0E9C /* DetailDomain.framework */; }; + 7F1C69D1E9C843D1EA552C47 /* Detail_Detail.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */; }; + 80EF48C1C96EBB4AB1E03A6C /* Detail_Detail.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */; }; 837CA0B6620C0FEA48AE923C /* DetailTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AD745E7440FC97A9CA14268 /* DetailTesting.framework */; }; 83B6055429750F1EFA7AB439 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF10631497B2359FDEE1276E /* DesignSystem.framework */; }; 84C5FBCACCCF602F4011179A /* SubscriptionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E382FC67A8F9821585CDB031 /* SubscriptionRequest.swift */; }; 86AB8A12E9CB8B826C50BE18 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 037730AF7DDB88D4A7CFEC27 /* Kingfisher.framework */; }; 88CCA7BC3E911685B0D74076 /* DetailInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BA99C3FC74CB681E8B504F /* DetailInterface.swift */; }; + 8CF59F4EF6EE957462691CE3 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */; }; + 90BC00C25A87D9F08FF48D81 /* Detail_Detail.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */; }; 91FD09A50B171C61C895C539 /* DetailBrand+Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C5B3B6E99DC25CE4D40921 /* DetailBrand+Sample.swift */; }; 9548271DCD9B0937B8383E56 /* FetchArticleDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B42B93ACDF818E1B36FEBE87 /* FetchArticleDetailUseCase.swift */; }; 9631E3E676A86B8D59AA476E /* PopupView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A462F32EEA5D4222C73174FD /* PopupView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -74,8 +83,8 @@ 9DCDAC2D0E3790C2282376F4 /* FoundationKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 2DC131721167BC8AA615F8D6 /* FoundationKit.framework */; }; 9E0570C4F8BD47BD7BB6BFDF /* DetailDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A96794BD3377F90430EF0E9C /* DetailDomain.framework */; }; 9F4E6D977ED6B80D1BB2B80B /* Detail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B95DEB0BB0769D679538C4A /* Detail.framework */; }; + A2E78A59380D11B48D0493C8 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */; }; A3707B6659E63069D378F84F /* DetailHighlightRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 113B09463389CF5EFE2CFBFE /* DetailHighlightRepositoryImpl.swift */; }; - A3C7CA92CAC6E270FF98FD9C /* highlight-selection.js in Resources */ = {isa = PBXBuildFile; fileRef = E238F6A510832E68B7A93E83 /* highlight-selection.js */; }; A501A80C18812818FE3E2F23 /* DetailArticleDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FAC0CD654C1727458CCD6B /* DetailArticleDetail.swift */; }; A5AD87EF646305798147569F /* DetailBrandDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5EBC3117032F11AADF0A4DC /* DetailBrandDetail.swift */; }; A9DD2BA21B126A3A9C9B7AB0 /* BrandDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B77220230DE1B29E53160F9 /* BrandDetailView.swift */; }; @@ -87,12 +96,13 @@ B8805B2A9E645DE8081DFBAC /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2DC131721167BC8AA615F8D6 /* FoundationKit.framework */; }; B900916B4421F17E5DE8A107 /* HighlightEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD19A75DB1E0E4B575056E07 /* HighlightEvent.swift */; }; BBB2AA8E96719EE07A07C445 /* DetailArticleRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF4697209D5D3C48696A3DD3 /* DetailArticleRepository.swift */; }; - C0302BAC5FB29B85950CA50F /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AF10631497B2359FDEE1276E /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C053252648DD62D20A07C6A9 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16E9D08E995905CE2B02915B /* Shared.framework */; }; C09C04D555251740EB0123DC /* DatabaseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F040FD94FD31D8B93AFC455 /* DatabaseKit.framework */; }; + C419A223927A4110D1A6C53F /* highlight-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 00857E16F4612780B31D3541 /* highlight-core.js */; }; C5F11A5F3FF7FA90047EB1DE /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A462F32EEA5D4222C73174FD /* PopupView.framework */; }; C633E75E6702946A5DF9BE09 /* DetailArticleDetailResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E300CBDD8DD1CB03AB6372 /* DetailArticleDetailResult.swift */; }; C6BA16E06B2321B9E3216F43 /* DetailArticleRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D5D8F4620FFA9D5FAD4CBE /* DetailArticleRepositoryImpl.swift */; }; + D01027525066E8F6839C4943 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */; }; D04BFE6FA711D99D1C625A45 /* ArticleHighlightJS.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB01B27F8DEACEECEFDFA627 /* ArticleHighlightJS.swift */; }; D47AD455D6CE920C9CE1E8BE /* DetailNewsletterAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F846D7141C8996200B58F7BA /* DetailNewsletterAPI.swift */; }; D5A476F4F89A71AFBACC56A8 /* ArticleDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14FFF62190471C071159E97A /* ArticleDetailViewModel.swift */; }; @@ -100,7 +110,6 @@ DF8A5A0755FAF22FAAEC4A25 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A462F32EEA5D4222C73174FD /* PopupView.framework */; }; E1D95026F34EC560BA662714 /* BrandSubscribeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 806ADA3C0CDD4E6AF914A053 /* BrandSubscribeButton.swift */; }; E32984988E3C978F8093597F /* DetailInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6B1AE62965A0CCECBA5E4E62 /* DetailInterface.framework */; }; - E35BF2DC3E0EDE4B386C986D /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 856AF65DBB58B6E79EF7DF24 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; E46E7A87A4F7768A8930506A /* BookmarkRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB98D8DC33A9D2CBD06B80AE /* BookmarkRequest.swift */; }; E6452BFC6770104F497B0A4F /* DetailTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DCF08A981030825A2FC8348 /* DetailTests.swift */; }; EB1BAEB515049D69E23D2F52 /* ToggleArticleBookmarkUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1D53036A893CF0474D6D2A5 /* ToggleArticleBookmarkUseCaseImpl.swift */; }; @@ -111,6 +120,7 @@ F1B25E60B0311B0E8561F5B3 /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2DC131721167BC8AA615F8D6 /* FoundationKit.framework */; }; F2DE7432B78B29BB555248E4 /* ArticleDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A32E848FB34AC263D298782D /* ArticleDetailView.swift */; }; FC6DAEFF4D81A101A3FAEA5A /* DetailHighlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315587186714BA35F86EACFA /* DetailHighlight.swift */; }; + FE2A7B849A5EE791CA108F1C /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -121,6 +131,13 @@ remoteGlobalIDString = C88D15CEF71B110EE71D0D3F; remoteInfo = DetailDomain; }; + 52D0EC946E6EEBDD20C632F9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = AB08FD11D704AC1BA3ACB508 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 26FD65E4003CB95E3E791F5B; + remoteInfo = Detail_Detail; + }; 6997F60FA1DCEDEDBF9EFE29 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = AB08FD11D704AC1BA3ACB508 /* Project object */; @@ -204,6 +221,40 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 159A1FED64F5EB05764DA2E0 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 718FFB94677AF52FEE96BB17 /* Alamofire_Alamofire.bundle in Dependencies */, + A2E78A59380D11B48D0493C8 /* DesignSystem_DesignSystem.bundle in Dependencies */, + 90BC00C25A87D9F08FF48D81 /* Detail_Detail.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 50A9E21E190436ADAE120395 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 698BF416956A3A81F72C999F /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 8CF59F4EF6EE957462691CE3 /* Alamofire_Alamofire.bundle in Dependencies */, + FE2A7B849A5EE791CA108F1C /* DesignSystem_DesignSystem.bundle in Dependencies */, + 7F1C69D1E9C843D1EA552C47 /* Detail_Detail.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 73273422BAC74AD62407AE33 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -290,6 +341,7 @@ files = ( 970EF75A181C2B329333334C /* DetailDomain.framework in Dependencies */, E32984988E3C978F8093597F /* DetailInterface.framework in Dependencies */, + 1782F3096C1E7CF5B47F2DD1 /* Shared.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -300,9 +352,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - E35BF2DC3E0EDE4B386C986D /* Alamofire.framework in Embed Frameworks */, - C0302BAC5FB29B85950CA50F /* DesignSystem.framework in Embed Frameworks */, - 486BA0DC650B8C96131BEB8B /* Detail.framework in Embed Frameworks */, 1A2F518D2EDE2203A73E7E80 /* Kingfisher.framework in Embed Frameworks */, 17317F475E53E771034636AE /* Moya.framework in Embed Frameworks */, 9631E3E676A86B8D59AA476E /* PopupView.framework in Embed Frameworks */, @@ -320,6 +369,7 @@ 1081C5FB722791B45F1EF2AD /* BrandDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrandDetailViewModel.swift; sourceTree = ""; }; 113B09463389CF5EFE2CFBFE /* DetailHighlightRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailHighlightRepositoryImpl.swift; sourceTree = ""; }; 14FFF62190471C071159E97A /* ArticleDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleDetailViewModel.swift; sourceTree = ""; }; + 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Detail_Detail.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 16E9D08E995905CE2B02915B /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 19C9C8E4DD02773C8AA3821B /* FetchArticleDetailUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchArticleDetailUseCaseImpl.swift; sourceTree = ""; }; 1ECFC5C90FF58B3D2AF210DD /* MockDetailHighlightRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDetailHighlightRepository.swift; sourceTree = ""; }; @@ -335,6 +385,7 @@ 42B2228FB1F42508CD26B420 /* HighlightStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightStyle.swift; sourceTree = ""; }; 44FAC0CD654C1727458CCD6B /* DetailArticleDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailArticleDetail.swift; sourceTree = ""; }; 453D8A2E57EC8CB33197FB6A /* DetailExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailExampleApp.swift; sourceTree = ""; }; + 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 520DC973A302CE54DF2F8D7A /* Detail-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Detail-Info.plist"; sourceTree = ""; }; 57EE666730B6FB01E6451E14 /* DetailBrandArticleDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailBrandArticleDTO.swift; sourceTree = ""; }; 5AD745E7440FC97A9CA14268 /* DetailTesting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DetailTesting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -350,9 +401,9 @@ 7DCF08A981030825A2FC8348 /* DetailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailTests.swift; sourceTree = ""; }; 7FE91A778D54F906BBB478EA /* DetailArticleAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailArticleAPI.swift; sourceTree = ""; }; 806ADA3C0CDD4E6AF914A053 /* BrandSubscribeButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrandSubscribeButton.swift; sourceTree = ""; }; - 856AF65DBB58B6E79EF7DF24 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8913DD26045FA9B30B463521 /* DetailError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailError.swift; sourceTree = ""; }; 895ACCCB628BC9B6AA8FBE47 /* DetailData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DetailData-Info.plist"; sourceTree = ""; }; + 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 8E53E21BCF2EBF291EFF200E /* DetailInterface-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DetailInterface-Info.plist"; sourceTree = ""; }; 99C5B3B6E99DC25CE4D40921 /* DetailBrand+Sample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DetailBrand+Sample.swift"; sourceTree = ""; }; 9AA0F26E33A078BEAA951AFF /* MockFetchArticleDetailUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchArticleDetailUseCase.swift; sourceTree = ""; }; @@ -385,6 +436,7 @@ E6BA99C3FC74CB681E8B504F /* DetailInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailInterface.swift; sourceTree = ""; }; E7332682AF3A45F10EBC84EF /* DetailBrandRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailBrandRepositoryImpl.swift; sourceTree = ""; }; E79257768C8AA33BAEAF7888 /* DetailExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DetailExample-Info.plist"; sourceTree = ""; }; + E939CAA6DBD23D40F457B47D /* Detail_Detail-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Detail_Detail-Info.plist"; sourceTree = ""; }; ED00ED0D2221095DD00FB727 /* BrandHeroSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrandHeroSection.swift; sourceTree = ""; }; F2342B528C8EF2F01C4011A5 /* DetailArticleDetailDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailArticleDetailDTO.swift; sourceTree = ""; }; F32F05CE24F8841B6FB502DF /* MockDetailBrandRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDetailBrandRepository.swift; sourceTree = ""; }; @@ -446,6 +498,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9847307B1669C856813F179D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; B54BFFA97BBD85C1147E4352 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -508,9 +567,11 @@ 1E43E38C7AA0E336D84C5D66 /* Products */ = { isa = PBXGroup; children = ( - 856AF65DBB58B6E79EF7DF24 /* Alamofire.framework */, + 4B191A878566A0623A3E3FA0 /* Alamofire_Alamofire.bundle */, 9F040FD94FD31D8B93AFC455 /* DatabaseKit.framework */, + 8A87F248EFB679644B4B5755 /* DesignSystem_DesignSystem.bundle */, AF10631497B2359FDEE1276E /* DesignSystem.framework */, + 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */, 3B95DEB0BB0769D679538C4A /* Detail.framework */, 05B413B7BB7364B2A8EB43B8 /* DetailData.framework */, A96794BD3377F90430EF0E9C /* DetailDomain.framework */, @@ -629,6 +690,7 @@ 7F63984D48F924C0603F0DEC /* InfoPlists */ = { isa = PBXGroup; children = ( + E939CAA6DBD23D40F457B47D /* Detail_Detail-Info.plist */, 520DC973A302CE54DF2F8D7A /* Detail-Info.plist */, 895ACCCB628BC9B6AA8FBE47 /* DetailData-Info.plist */, F5B7718F255BC6B70BDE4D42 /* DetailDomain-Info.plist */, @@ -815,6 +877,26 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 26FD65E4003CB95E3E791F5B /* Detail_Detail */ = { + isa = PBXNativeTarget; + buildConfigurationList = FC734CFE1F9E92CF5BF3D9D6 /* Build configuration list for PBXNativeTarget "Detail_Detail" */; + buildPhases = ( + DF202121DA37B6AF26C3D505 /* Sources */, + 0F76D62C196B3AD00E959736 /* Resources */, + 9847307B1669C856813F179D /* Frameworks */, + 50A9E21E190436ADAE120395 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Detail_Detail; + packageProductDependencies = ( + ); + productName = Detail_Detail; + productReference = 16E5CD9220DA0EB579A3075E /* Detail_Detail.bundle */; + productType = "com.apple.product-type.bundle"; + }; 378027671B59764DC5831691 /* DetailTests */ = { isa = PBXNativeTarget; buildConfigurationList = 2B9CAC1C11D83336656849FA /* Build configuration list for PBXNativeTarget "DetailTests" */; @@ -823,6 +905,7 @@ 8BB30DF501B5429006583AA6 /* Resources */, 3DF91622A6C5259174EAEA00 /* Frameworks */, 0A25737089C8EDC4FD9879B0 /* Embed Frameworks */, + 159A1FED64F5EB05764DA2E0 /* Dependencies */, ); buildRules = ( ); @@ -853,6 +936,7 @@ 9574E7263BD0D6194643E474 /* PBXTargetDependency */, 84872224FFDCA782F28CB5C1 /* PBXTargetDependency */, 9300CBCF81981E790795EC94 /* PBXTargetDependency */, + BD5D4EC5E844B636B3AB7779 /* PBXTargetDependency */, ); name = Detail; packageProductDependencies = ( @@ -954,6 +1038,7 @@ C148D5ECBDC8A76B2EB2F0AB /* Resources */, B54BFFA97BBD85C1147E4352 /* Frameworks */, F5691EE2348641E4FE0581CB /* Embed Frameworks */, + 698BF416956A3A81F72C999F /* Dependencies */, ); buildRules = ( ); @@ -1000,6 +1085,7 @@ 9A293940913ED0FF4D0EF915 /* DetailInterface */, BB2FF893B90ACF9CC724F176 /* DetailTesting */, 378027671B59764DC5831691 /* DetailTests */, + 26FD65E4003CB95E3E791F5B /* Detail_Detail */, ); }; /* End PBXProject section */ @@ -1012,12 +1098,19 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 0F76D62C196B3AD00E959736 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C419A223927A4110D1A6C53F /* highlight-core.js in Resources */, + 61A13AEB3C66BF2540DE02A3 /* highlight-selection.js in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 691873A78670D61FD175FA5C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1469C8EDD99065CD7F6A484B /* highlight-core.js in Resources */, - A3C7CA92CAC6E270FF98FD9C /* highlight-selection.js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1032,6 +1125,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + D01027525066E8F6839C4943 /* Alamofire_Alamofire.bundle in Resources */, + 0667E782E5C24B811488AF76 /* DesignSystem_DesignSystem.bundle in Resources */, + 80EF48C1C96EBB4AB1E03A6C /* Detail_Detail.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1046,6 +1142,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6794D14BFDEDB2DD9F1330C4 /* Alamofire_Alamofire.bundle in Resources */, + 1D263DFC676106D57B258376 /* DesignSystem_DesignSystem.bundle in Resources */, + 5F7F75B508746A1E3DEC88F0 /* Detail_Detail.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1165,6 +1264,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DF202121DA37B6AF26C3D505 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1228,6 +1334,12 @@ target = BB2FF893B90ACF9CC724F176 /* DetailTesting */; targetProxy = F40C95A682E8C46F43586CDD /* PBXContainerItemProxy */; }; + BD5D4EC5E844B636B3AB7779 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Detail_Detail; + target = 26FD65E4003CB95E3E791F5B /* Detail_Detail */; + targetProxy = 52D0EC946E6EEBDD20C632F9 /* PBXContainerItemProxy */; + }; FC9E9FDF392FE7A90094F2BC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Detail; @@ -1476,6 +1588,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.example; PRODUCT_NAME = DetailExample; SDKROOT = iphoneos; @@ -1507,6 +1623,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; + PACKAGE_RESOURCE_BUNDLE_NAME = Detail_Detail; PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail; PRODUCT_NAME = Detail; SDKROOT = iphoneos; @@ -1526,6 +1643,33 @@ }; name = Release; }; + 56016448387FC0E951125353 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GENERATE_MASTER_OBJECT_FILE = NO; + INFOPLIST_FILE = "Derived/InfoPlists/Detail_Detail-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.generated.resources; + PRODUCT_NAME = Detail_Detail; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = ""; + }; + name = Debug; + }; 56C81D832FDB9E6BAA518DEF /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1544,6 +1688,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; + PACKAGE_RESOURCE_BUNDLE_NAME = Detail_Detail; PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail; PRODUCT_NAME = Detail; SDKROOT = iphoneos; @@ -1582,6 +1727,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.example; PRODUCT_NAME = DetailExample; SDKROOT = iphoneos; @@ -1610,6 +1759,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.tests; PRODUCT_NAME = DetailTests; SDKROOT = iphoneos; @@ -1830,6 +1983,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.tests; PRODUCT_NAME = DetailTests; SDKROOT = iphoneos; @@ -1843,6 +2000,29 @@ }; name = Release; }; + EAD856625E2AE3B1F775B3AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GENERATE_MASTER_OBJECT_FILE = NO; + INFOPLIST_FILE = "Derived/InfoPlists/Detail_Detail-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newdok.detail.generated.resources; + PRODUCT_NAME = Detail_Detail; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1918,6 +2098,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + FC734CFE1F9E92CF5BF3D9D6 /* Build configuration list for PBXNativeTarget "Detail_Detail" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 56016448387FC0E951125353 /* Debug */, + EAD856625E2AE3B1F775B3AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = AB08FD11D704AC1BA3ACB508 /* Project object */; diff --git a/Modules/Features/Detail/Detail.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Detail/Detail.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index 3366abbd..7c968003 100644 --- a/Modules/Features/Detail/Detail.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Detail/Detail.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,35 @@ isShown orderHint - 10 + 11 DetailData.xcscheme_^#shared#^_ isShown orderHint - 11 + 12 DetailDomain.xcscheme_^#shared#^_ isShown orderHint - 12 + 13 DetailExample.xcscheme_^#shared#^_ isShown orderHint - 13 + 14 + + Detail_Detail.xcscheme_^#shared#^_ + + isShown + + orderHint + 15 diff --git a/Modules/Features/Explore/Explore.xcodeproj/project.pbxproj b/Modules/Features/Explore/Explore.xcodeproj/project.pbxproj index 1b59ee13..0d6d907a 100644 --- a/Modules/Features/Explore/Explore.xcodeproj/project.pbxproj +++ b/Modules/Features/Explore/Explore.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 073F229792FF7C0867DB771E /* ExploreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24D785C89919F6791BD7A33 /* ExploreView.swift */; }; 09783F763339FDD665D20027 /* ExploreBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 888F76455723B0BB93117B37 /* ExploreBase.swift */; }; 0C96D4AAECAD97812855C999 /* ExploreNoProfileSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DC3D67031B54891AACACBB0 /* ExploreNoProfileSection.swift */; }; + 1137F7C41C1775D4C6F620AD /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */; }; 11EFC05C0C6C2A6F7476CE9B /* TransformExploreRecommendationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FC211EFDA28CB6516DA622C /* TransformExploreRecommendationUseCase.swift */; }; 151F78553C8953C647743454 /* ExploreDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 93F5FA1DA86CFF691FF542B0 /* ExploreDomain.framework */; }; 1568857A0C158C8FD24EA4A4 /* NewsletterDetailRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8975011C35FA609F5AD763 /* NewsletterDetailRow.swift */; }; @@ -21,11 +22,14 @@ 17C36C1FA64A43AE83E20678 /* RecommendedNewsLetterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BCDA9A9CBE8807820971B4C /* RecommendedNewsLetterView.swift */; }; 1A9DB85520140354256C93A6 /* ExploreOrderOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1184E3617FA54DA7DE55C0 /* ExploreOrderOption.swift */; }; 1B6993E199FB0C966264508A /* ExploreData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = C15F9F3CB6278990DB940B8F /* ExploreData.framework */; }; + 1DCF1C3B6944E6A2608EE59B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */; }; 1E4A2A6F8815FEB546CCAB74 /* TransformExploreRecommendationUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73A1AFEE5EC083C7A95B153 /* TransformExploreRecommendationUseCaseTests.swift */; }; + 21069CA4265AC72853FDFCA9 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = EB6BFB9C49D58077BC4C3EE7 /* Shared.framework */; }; 249A18D0808BFD907120A72F /* ExploreExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0D54E2DECF8A17807B345D4 /* ExploreExampleApp.swift */; }; 2754E16A9907767BB2CA89BE /* ExploreOptionDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC429B1C2535BCA693099ED9 /* ExploreOptionDTO.swift */; }; 2774AF43D9408CF7A301B1B5 /* FetchExploreRecommendationUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE849E14316C503C90BD0E45 /* FetchExploreRecommendationUseCaseImpl.swift */; }; 28DBD961C7B7A994B075D8ED /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 250A5692EC2B284352F39DF6 /* NetworkKit.framework */; }; + 28E9503C1DDAE6EED96EB1C8 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */; }; 29A540B19553549BF05A0AA5 /* FetchGuestExploreNewslettersUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC8C3E06DBBCA2C6681D98B9 /* FetchGuestExploreNewslettersUseCaseImpl.swift */; }; 29DAC8EAE7B53F221D8A2958 /* LoadOptionsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71EB350DD845DB07C8A63B42 /* LoadOptionsUseCase.swift */; }; 2A46E44695CBDFD14111F3C4 /* ExploreDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93F5FA1DA86CFF691FF542B0 /* ExploreDomain.framework */; }; @@ -43,8 +47,8 @@ 56469C4FCC5443925EB06183 /* PrioritizeInterestsUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA7E33E9D12E87B28C264DE /* PrioritizeInterestsUseCaseImpl.swift */; }; 58DCF75103B0F04322161FD7 /* ExploreAllNewsletterSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8FA180FF152AA423ED45A8B /* ExploreAllNewsletterSection.swift */; }; 5EB7C5689377D6E8B3FF4717 /* ExploreInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79F1E6DBD7C2A06352AF9764 /* ExploreInterface.swift */; }; - 6434435EE71C2E259B5BAE46 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84F37D3F1E984B2DC46FF168 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 655E69A7CF7BAE0041456773 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB6BFB9C49D58077BC4C3EE7 /* Shared.framework */; }; + 69A549733531DC349706578E /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */; }; 6AE7DAB3726890EBE05F09A7 /* ExploreInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 52848CDDBB14287A77B3B8D8 /* ExploreInterface.framework */; }; 71474BA87E102C5721C20066 /* ExploreBrandDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72D063A51E4DF0D936E662B /* ExploreBrandDTO.swift */; }; 71F3F5FBB3C658D7FF1A0274 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CC6C36B01EE7E27AAE4D727 /* Kingfisher.framework */; }; @@ -57,9 +61,9 @@ 7D65A0514B8D9FB75519F3F8 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 250A5692EC2B284352F39DF6 /* NetworkKit.framework */; }; 7E61858AFAEBBF5880353E68 /* ExploreInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52848CDDBB14287A77B3B8D8 /* ExploreInterface.framework */; }; 7FE7744DEB271B2313999494 /* ExploreIndustryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6C44F04C3E9A543CFC3A3C /* ExploreIndustryDTO.swift */; }; - 864A3AEDACD95D4A500348EC /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E8584C892020BB03C7F6C2EC /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 868D4222231FD7682CCED247 /* ExploreIndustry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 827B3F81E9669C6B25D4591C /* ExploreIndustry.swift */; }; 8E50071138DE873A278F2167 /* FetchExploreRecommendationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CF738C0290EAA7435919F1B /* FetchExploreRecommendationUseCase.swift */; }; + 9013B8ECC9EE97B247F7C87E /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */; }; 914A3608C0D32A093C290D54 /* PrioritizeInterestsUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A5E26974DA4DBB6685FD25 /* PrioritizeInterestsUseCaseTests.swift */; }; 932A59E057F60558E758FC40 /* ExploreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C15F9F3CB6278990DB940B8F /* ExploreData.framework */; }; 9607A76F7B9AE5079D3250D7 /* ExploreTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2C1F0C633ABCEAEF226F8ED /* ExploreTesting.framework */; }; @@ -68,6 +72,7 @@ 9C9C98A881CC40F8D6980D3B /* ExploreBrand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA968D7D77A7E89D97C740F /* ExploreBrand.swift */; }; 9FA003749402F76FAB4B4395 /* MockFetchGuestExploreNewslettersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9973545623CF08E3378CEF /* MockFetchGuestExploreNewslettersUseCase.swift */; }; A305ACCAFCC6030E4592B5EA /* ExploreRecommendedNewsletterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 343160A151CA05CFFB377D0D /* ExploreRecommendedNewsletterDTO.swift */; }; + A33EC1FE8B7504FBD1EEAB26 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */; }; A3BC78D8D9ABBD4A12108517 /* MockPrioritizeInterestsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FF24FA935E3B7DDF6E12341 /* MockPrioritizeInterestsUseCase.swift */; }; A8D82DA9F46E630B99923408 /* FetchExploreOptionListUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = F451F93F917934C7B6AA8B7C /* FetchExploreOptionListUseCaseImpl.swift */; }; A93A47968F782F087DA3E677 /* FetchExploreOptionListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A65E8DCC68016D13DD02A7 /* FetchExploreOptionListUseCase.swift */; }; @@ -76,6 +81,7 @@ ACC43D3DB3E0B7CCE985F9B4 /* NewletterRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F358D13829D312F2BAD5833 /* NewletterRow.swift */; }; B09F17A3F771ED795BA24F25 /* Explore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C38C04CFD92482D29D36740 /* Explore.framework */; }; B0B496DA44C9B1D2E644CDA2 /* ExploreNewsletterAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E5FC88EEBE9469E10BA69D /* ExploreNewsletterAPI.swift */; }; + B1BC3C9AED7BB2761C3A2FB3 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */; }; B3EF99742C89D2A8CDDB51C4 /* TransformExploreRecommendationUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148DB4A52EAFEB707EF8485B /* TransformExploreRecommendationUseCaseImpl.swift */; }; B62F788290464F031196A574 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 84F37D3F1E984B2DC46FF168 /* DesignSystem.framework */; }; B9584611F0D9629076314904 /* ExploreGuestSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03107AFCD433376EFCD15D90 /* ExploreGuestSection.swift */; }; @@ -91,6 +97,7 @@ D3AEE36E88B5E6A7F21CB94A /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F37D3F1E984B2DC46FF168 /* DesignSystem.framework */; }; D3E1D5B2871B7F231B61713F /* ExploreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C15F9F3CB6278990DB940B8F /* ExploreData.framework */; }; D4399F288235646AB93D9EA0 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55B1E8DB65255934AF9129FC /* Moya.framework */; }; + D8B91DBDD754C6BF1AEC8FD0 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */; }; D98BC6AD895838FE8B6F1595 /* ExploreDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 93F5FA1DA86CFF691FF542B0 /* ExploreDomain.framework */; }; DD4C53B17A7E187C2C35DE68 /* PagingScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98D64C114E158DCBDB5A98F /* PagingScrollView.swift */; }; DFF6385287E2BD16C94D8D0F /* ExploreNewsletterDetailDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE33DBDE88BA0AC4A46767D2 /* ExploreNewsletterDetailDTO.swift */; }; @@ -210,8 +217,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 864A3AEDACD95D4A500348EC /* Alamofire.framework in Embed Frameworks */, - 6434435EE71C2E259B5BAE46 /* DesignSystem.framework in Embed Frameworks */, 1721822F623580AE16DF2BDB /* Kingfisher.framework in Embed Frameworks */, 4EC49EC04D4BECD111CC242A /* Moya.framework in Embed Frameworks */, BEAC42592153C460546222B7 /* PopupView.framework in Embed Frameworks */, @@ -247,6 +252,18 @@ files = ( D98BC6AD895838FE8B6F1595 /* ExploreDomain.framework in Dependencies */, C22F4F3FB777D8AB0BF36E4C /* ExploreInterface.framework in Dependencies */, + 21069CA4265AC72853FDFCA9 /* Shared.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 54F6958B7ECB64886E40B4D6 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 69A549733531DC349706578E /* Alamofire_Alamofire.bundle in Dependencies */, + A33EC1FE8B7504FBD1EEAB26 /* DesignSystem_DesignSystem.bundle in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -271,6 +288,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + CAC32E1FBE336AAF70608AB1 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 1DCF1C3B6944E6A2608EE59B /* Alamofire_Alamofire.bundle in Dependencies */, + B1BC3C9AED7BB2761C3A2FB3 /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; CC7BF11F038CE57B5F946D1C /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; @@ -325,6 +353,7 @@ 593A758FB76F8B18C48BD981 /* ExploreViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreViewModel.swift; sourceTree = ""; }; 5C38C04CFD92482D29D36740 /* Explore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Explore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5FA968D7D77A7E89D97C740F /* ExploreBrand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreBrand.swift; sourceTree = ""; }; + 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 64AEDB21409087596C001C42 /* ExploreExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "ExploreExample-Info.plist"; sourceTree = ""; }; 71EB350DD845DB07C8A63B42 /* LoadOptionsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadOptionsUseCase.swift; sourceTree = ""; }; 787479014835E30089ED74AE /* ExploreRecommendationSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreRecommendationSection.swift; sourceTree = ""; }; @@ -365,13 +394,13 @@ C2C1F0C633ABCEAEF226F8ED /* ExploreTesting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ExploreTesting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C2CB7862ED357659A503E9B6 /* ExploreRecommendedNewsletter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreRecommendedNewsletter.swift; sourceTree = ""; }; CC8C3E06DBBCA2C6681D98B9 /* FetchGuestExploreNewslettersUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchGuestExploreNewslettersUseCaseImpl.swift; sourceTree = ""; }; + D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; D72D063A51E4DF0D936E662B /* ExploreBrandDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreBrandDTO.swift; sourceTree = ""; }; D8FA180FF152AA423ED45A8B /* ExploreAllNewsletterSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreAllNewsletterSection.swift; sourceTree = ""; }; DA2263923D4B545CDBF405D4 /* ExploreInterest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreInterest.swift; sourceTree = ""; }; DC237F88BE629BF3598049C7 /* SortBottomSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortBottomSheet.swift; sourceTree = ""; }; DC80382D2E55CF54C5CD3311 /* MockTransformExploreRecommendationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTransformExploreRecommendationUseCase.swift; sourceTree = ""; }; DE33DBDE88BA0AC4A46767D2 /* ExploreNewsletterDetailDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreNewsletterDetailDTO.swift; sourceTree = ""; }; - E8584C892020BB03C7F6C2EC /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EB6BFB9C49D58077BC4C3EE7 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F451F93F917934C7B6AA8B7C /* FetchExploreOptionListUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchExploreOptionListUseCaseImpl.swift; sourceTree = ""; }; F9A65E8DCC68016D13DD02A7 /* FetchExploreOptionListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchExploreOptionListUseCase.swift; sourceTree = ""; }; @@ -650,7 +679,8 @@ 9BCD9434591CA445FFF60A51 /* Products */ = { isa = PBXGroup; children = ( - E8584C892020BB03C7F6C2EC /* Alamofire.framework */, + D20A4406B94CA5D712D3DE2D /* Alamofire_Alamofire.bundle */, + 62BB0862401C204E86A83ED0 /* DesignSystem_DesignSystem.bundle */, 84F37D3F1E984B2DC46FF168 /* DesignSystem.framework */, 5C38C04CFD92482D29D36740 /* Explore.framework */, C15F9F3CB6278990DB940B8F /* ExploreData.framework */, @@ -801,6 +831,7 @@ F25F656077B1A2B4969A6250 /* Resources */, D10D45B11850700645CF28A3 /* Frameworks */, FF83E117A08EA497CAE532F2 /* Embed Frameworks */, + CAC32E1FBE336AAF70608AB1 /* Dependencies */, ); buildRules = ( ); @@ -912,6 +943,7 @@ 76F6D2965F99AE60FF194E93 /* Resources */, 0B4CB767C23C300F01A73381 /* Frameworks */, 17810ED90893ECD508FCC6C4 /* Embed Frameworks */, + 54F6958B7ECB64886E40B4D6 /* Dependencies */, ); buildRules = ( ); @@ -981,6 +1013,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9013B8ECC9EE97B247F7C87E /* Alamofire_Alamofire.bundle in Resources */, + D8B91DBDD754C6BF1AEC8FD0 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1009,6 +1043,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1137F7C41C1775D4C6F620AD /* Alamofire_Alamofire.bundle in Resources */, + 28E9503C1DDAE6EED96EB1C8 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1321,6 +1357,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.explore.tests; PRODUCT_NAME = ExploreTests; SDKROOT = iphoneos; @@ -1345,6 +1385,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.explore.tests; PRODUCT_NAME = ExploreTests; SDKROOT = iphoneos; @@ -1585,6 +1629,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.explore.example; PRODUCT_NAME = ExploreExample; SDKROOT = iphoneos; @@ -1617,6 +1665,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.explore.example; PRODUCT_NAME = ExploreExample; SDKROOT = iphoneos; diff --git a/Modules/Features/Explore/Explore.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Explore/Explore.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index b6412b3f..498125b3 100644 --- a/Modules/Features/Explore/Explore.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Explore/Explore.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,28 @@ isShown orderHint - 14 + 16 ExploreData.xcscheme_^#shared#^_ isShown orderHint - 15 + 17 ExploreDomain.xcscheme_^#shared#^_ isShown orderHint - 16 + 18 ExploreExample.xcscheme_^#shared#^_ isShown orderHint - 17 + 19 diff --git a/Modules/Features/Home/Home.xcodeproj/project.pbxproj b/Modules/Features/Home/Home.xcodeproj/project.pbxproj index 0983f714..bdebf1dd 100644 --- a/Modules/Features/Home/Home.xcodeproj/project.pbxproj +++ b/Modules/Features/Home/Home.xcodeproj/project.pbxproj @@ -23,10 +23,12 @@ 1E62878C0C7B5C3F9ED0AB99 /* HomeDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E7CDF63113C2F46BE8A71B0 /* HomeDomain.framework */; }; 1E7E45098752C3B4C517EF1A /* MockFetchHomeNewslettersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5334BF9E23A4C0D601A88700 /* MockFetchHomeNewslettersUseCase.swift */; }; 22CCBAB1A599A71D9B5F775B /* HomeArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F9D57C7C3F6677D7BA035EB /* HomeArticle.swift */; }; + 25632853C21928B783200A6A /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */; }; 261CEAC9556FF74D8C655436 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45A37D9EB117BE8E26CCEAF /* Moya.framework */; }; 269DAC6E999F4D87706612D6 /* Home.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9290645AFD421A6E8E0A3C77 /* Home.framework */; }; 296BBBFAE6A19D780B60F09F /* MockFetchHomeHighlightCountsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE5D92798C2C2687A8EC0852 /* MockFetchHomeHighlightCountsUseCase.swift */; }; 2B8F29F0ED90A533AB1AEC24 /* HomeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CADBDBCE22FDE304B4127596 /* HomeTests.swift */; }; + 2ECBD5048EFF4DB5DF891E1E /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */; }; 30D2AC437EAEB059AF6636D7 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C3EBAC2F650C65DE1069CB5 /* DesignSystem.framework */; }; 34BF87846D5FD728A6D2685E /* DatabaseKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = AEAB33304E14B478149B9571 /* DatabaseKit.framework */; }; 368747EF3CFA31EDD1D3DA44 /* MockLoadReadArticleIdsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D739686E84362857C0CCFD5 /* MockLoadReadArticleIdsUseCase.swift */; }; @@ -35,6 +37,7 @@ 3CE34D0B41EB1D188B43C40B /* HighlightCountRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BE0540C0D9101967B30B88 /* HighlightCountRepository.swift */; }; 3DE07EC4C5A5F7F5E0FB5DF5 /* Moya.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E45A37D9EB117BE8E26CCEAF /* Moya.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3DE6F333B7FB683C1E5E5025 /* HomeArticleRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = F073CBC0ECE36A2D30D69D1F /* HomeArticleRepository.swift */; }; + 3F63BD4E0C5F97AB63D99AFF /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 5D35F66BCBA8EB427B5DE027 /* Shared.framework */; }; 45F47826A26195919CD537A9 /* HomeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4690E81D73D861BE25E27C63 /* HomeData.swift */; }; 468EE7C2A17CEB07A48DA21F /* HomeInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = FD41FB3E0EEA6290D73279DC /* HomeInterface.framework */; }; 49123A0C78DE39E4C17EF7D7 /* DecorateArticlesUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35613C429EA041D0B77F54B7 /* DecorateArticlesUseCaseImpl.swift */; }; @@ -44,7 +47,6 @@ 508E2389B68D5FB2D0824D4A /* HomeNewsletterAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21D83C7A0A54DF67941C009B /* HomeNewsletterAPI.swift */; }; 547F394565001BA1D23C0A7E /* RefreshHomeArticlesUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3295E7AF8FD2DAD41E6490 /* RefreshHomeArticlesUseCaseImpl.swift */; }; 56746DB4C018F47A3E75FE13 /* HighlightCountRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1A0FDB37378365582383FA /* HighlightCountRepositoryImpl.swift */; }; - 588D25E2E77205E3EF774C37 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8C3EBAC2F650C65DE1069CB5 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 58A3F6A90D1AB2E122FB415A /* FetchMonthArticlesUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C27E30652D5F73686FD4353 /* FetchMonthArticlesUseCaseImpl.swift */; }; 5958A795220236D936B094E6 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B81F80C2FEAA1107F2AE9F09 /* PopupView.framework */; }; 5BC163E8AAE46124A7EEE0DC /* HomeMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF03E4A61F76015E77430AF5 /* HomeMain.swift */; }; @@ -54,6 +56,7 @@ 641594D3A073EA80DB5E176E /* HomeDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 7E7CDF63113C2F46BE8A71B0 /* HomeDomain.framework */; }; 65566DD060259C10F5144675 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDB4C3569E3D5CCC18BE7FD7 /* Kingfisher.framework */; }; 67611AF5B54B257C073CC1C7 /* SaveReadArticleIdsUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA930739B49D4617C017495 /* SaveReadArticleIdsUseCaseImpl.swift */; }; + 69BB4BC16D9D12EB4A93D7FB /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */; }; 6AC90B31C866C0162BF72964 /* FetchHomeNewslettersUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74C49D5F0BE0EAD712EC97F /* FetchHomeNewslettersUseCaseImpl.swift */; }; 6AF94EE489A31CAB497CC765 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D35F66BCBA8EB427B5DE027 /* Shared.framework */; }; 6C158EC00C3B9956038A27BD /* DecorateArticlesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0271616E5AD36378C969B8C1 /* DecorateArticlesUseCase.swift */; }; @@ -61,6 +64,7 @@ 79ED22B68E7D3A2900BE5FDC /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04AE699792985C546477918C /* FoundationKit.framework */; }; 7A474E19149BC0324CA36909 /* DatabaseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEAB33304E14B478149B9571 /* DatabaseKit.framework */; }; 7B2159DD0AE47DB3CDC00C51 /* HomeInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD41FB3E0EEA6290D73279DC /* HomeInterface.framework */; }; + 7F1749E8E21F3F81E13A5F02 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */; }; 832F5D657EE9511AC7DFC1AD /* MergeDayArticleSummaryUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D1954B3703B1B17DBF59CF /* MergeDayArticleSummaryUseCaseImpl.swift */; }; 84F4A42C18D61D66E82A0895 /* ExtractArticleDaysUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F2EEE595AA21F5D1615EC72 /* ExtractArticleDaysUseCaseTests.swift */; }; 85F59319531E6997AA4537A2 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D149E26863DC2280CAD0A26A /* NetworkKit.framework */; }; @@ -89,17 +93,19 @@ C279A57619B644F716EFC768 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 8C3EBAC2F650C65DE1069CB5 /* DesignSystem.framework */; }; C4FD9A6455255BF6D470039B /* MockFetchMonthArticlesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403D445062511989EB5D5859 /* MockFetchMonthArticlesUseCase.swift */; }; C8DC844992B30693A7FEA61D /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45A37D9EB117BE8E26CCEAF /* Moya.framework */; }; + CAEDE3EF78324D11746C2B1E /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */; }; D12E7BE78DF7D57850728578 /* ExtractArticleDaysUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30ECF71ADE0B3362CF30069F /* ExtractArticleDaysUseCaseImpl.swift */; }; D22A62D9C2CD11BCFD1F27AF /* MockFetchTodayArticlesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B147F8538F2F090A9A3957 /* MockFetchTodayArticlesUseCase.swift */; }; D4087F9283F2719065049F61 /* DatabaseKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = AEAB33304E14B478149B9571 /* DatabaseKit.framework */; }; D6BABF0A33009DD83E61B578 /* HomeData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37935B9DA7BE7EBD9E6DD632 /* HomeData.framework */; }; D9D9BAD34448A277BC8FE8BA /* MockSaveReadArticleIdsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F01053817F2ABEB643810A /* MockSaveReadArticleIdsUseCase.swift */; }; DB35F207C7F50C6FF9DD31BB /* ExtractArticleDaysUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59CEC279B35991FF12BC9856 /* ExtractArticleDaysUseCase.swift */; }; + DDAD0FE540D6F9D7690072AB /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */; }; DDE76B7216877C0F1932E837 /* HomeTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0782543C21EE711EE550C2AA /* HomeTesting.framework */; }; DF8B9B3A9110E55D7DCD1F33 /* HomeArticles.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB200FEEBF56F1BFB5116FBE /* HomeArticles.swift */; }; E12B05BA3D98A1C4A80DCEA1 /* FetchHomeNewslettersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87652B4152AA8312B7A8C04A /* FetchHomeNewslettersUseCase.swift */; }; E383AB41A613F381C05B01FF /* ReadStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54728880638341BCCD4F900 /* ReadStatus.swift */; }; - E4415727F375CA05B79540D3 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1A5FAB7ADFFA55459CCD3E /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E5C33DAB0820F43C0173ACF8 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */; }; E64CBE866CA7745A151893DE /* HomeArticleDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = A430E623D63FB6321CF778E8 /* HomeArticleDTO.swift */; }; E8293EF958828F6E454A2E37 /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D149E26863DC2280CAD0A26A /* NetworkKit.framework */; }; E83573CD9ACCDB5F6D5A4E62 /* ReadArticleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED77EB24D60E4333278594E7 /* ReadArticleStore.swift */; }; @@ -113,6 +119,7 @@ FC677ACB765EBCE2CD302AE4 /* HomeExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 812DBB1714096105DB2CC859 /* HomeExampleApp.swift */; }; FEA6F52F574DAE316B56ED98 /* HomeNewsletter+Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340C26E4EDD860280FD94F05 /* HomeNewsletter+Sample.swift */; }; FF14E6EE45E4990DB8B026DD /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D149E26863DC2280CAD0A26A /* NetworkKit.framework */; }; + FF99CC3918E2F8453AFACA84 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */; }; FFC8FCCA16E79951DFD5AA8D /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAD2FE377459D687CCBCE3E0 /* HomeViewModel.swift */; }; /* End PBXBuildFile section */ @@ -236,6 +243,7 @@ files = ( 95F99C807FD982C4E6125404 /* HomeDomain.framework in Dependencies */, 98D19B21F2097F841C0F2DDF /* HomeInterface.framework in Dependencies */, + 3F63BD4E0C5F97AB63D99AFF /* Shared.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -260,14 +268,23 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 72F4E209847032C394F96253 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 25632853C21928B783200A6A /* Alamofire_Alamofire.bundle in Dependencies */, + CAEDE3EF78324D11746C2B1E /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 8E77B6070471420CCBA638D9 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - E4415727F375CA05B79540D3 /* Alamofire.framework in Embed Frameworks */, - 588D25E2E77205E3EF774C37 /* DesignSystem.framework in Embed Frameworks */, 5CC2D77A673B6A9B791CC64A /* Kingfisher.framework in Embed Frameworks */, 3DE07EC4C5A5F7F5E0FB5DF5 /* Moya.framework in Embed Frameworks */, 8FD0FC35862FD44D5C85D445 /* PopupView.framework in Embed Frameworks */, @@ -302,6 +319,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 9E23B10E1EBB1B064EF280D1 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + DDAD0FE540D6F9D7690072AB /* Alamofire_Alamofire.bundle in Dependencies */, + 69BB4BC16D9D12EB4A93D7FB /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; AB6F9991EFFF8EB658ECFA57 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -347,10 +375,10 @@ 5334BF9E23A4C0D601A88700 /* MockFetchHomeNewslettersUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchHomeNewslettersUseCase.swift; sourceTree = ""; }; 59CEC279B35991FF12BC9856 /* ExtractArticleDaysUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtractArticleDaysUseCase.swift; sourceTree = ""; }; 5A1A0FDB37378365582383FA /* HighlightCountRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightCountRepositoryImpl.swift; sourceTree = ""; }; - 5B1A5FAB7ADFFA55459CCD3E /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5D35F66BCBA8EB427B5DE027 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5F888AB37F684670D6487433 /* HomeData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "HomeData-Info.plist"; sourceTree = ""; }; 61EC700930D1096A1F12C0D7 /* Home-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Home-Info.plist"; sourceTree = ""; }; + 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 6F2EEE595AA21F5D1615EC72 /* ExtractArticleDaysUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtractArticleDaysUseCaseTests.swift; sourceTree = ""; }; 6F9D57C7C3F6677D7BA035EB /* HomeArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeArticle.swift; sourceTree = ""; }; 769838F5159DD381C709E560 /* HomeArticle+Sample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HomeArticle+Sample.swift"; sourceTree = ""; }; @@ -367,6 +395,7 @@ 9879BE437F14BB2EB41CC295 /* HomeBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeBuilder.swift; sourceTree = ""; }; 99BE0540C0D9101967B30B88 /* HighlightCountRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightCountRepository.swift; sourceTree = ""; }; 9A449CFDCA59CB8A8B2144B9 /* FetchDayArticlesUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchDayArticlesUseCaseImpl.swift; sourceTree = ""; }; + A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; A42B7A6C3FBA6B39ACF0EB0D /* MockFetchDayArticlesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchDayArticlesUseCase.swift; sourceTree = ""; }; A430E623D63FB6321CF778E8 /* HomeArticleDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeArticleDTO.swift; sourceTree = ""; }; A4F549A46AF7A1574E4E5924 /* RefreshHomeArticlesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshHomeArticlesUseCase.swift; sourceTree = ""; }; @@ -520,8 +549,9 @@ 156072FA40260C0FBAAE35F3 /* Products */ = { isa = PBXGroup; children = ( - 5B1A5FAB7ADFFA55459CCD3E /* Alamofire.framework */, + 64B42078E0A87CEE27F32CF2 /* Alamofire_Alamofire.bundle */, AEAB33304E14B478149B9571 /* DatabaseKit.framework */, + A393F8EFC0690F199B785B09 /* DesignSystem_DesignSystem.bundle */, 8C3EBAC2F650C65DE1069CB5 /* DesignSystem.framework */, 04AE699792985C546477918C /* FoundationKit.framework */, 9290645AFD421A6E8E0A3C77 /* Home.framework */, @@ -859,6 +889,7 @@ A3E9A846F2389D47B0821045 /* Resources */, 23A28F306D3F7D64A552EE00 /* Frameworks */, 8E77B6070471420CCBA638D9 /* Embed Frameworks */, + 9E23B10E1EBB1B064EF280D1 /* Dependencies */, ); buildRules = ( ); @@ -902,6 +933,7 @@ 95C7AAA080E708276A8F09A7 /* Resources */, D2D1CD11E151DABAE249ECD8 /* Frameworks */, 724F10C18B84459D2E88EF10 /* Embed Frameworks */, + 72F4E209847032C394F96253 /* Dependencies */, ); buildRules = ( ); @@ -993,6 +1025,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + FF99CC3918E2F8453AFACA84 /* Alamofire_Alamofire.bundle in Resources */, + 7F1749E8E21F3F81E13A5F02 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1007,6 +1041,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E5C33DAB0820F43C0173ACF8 /* Alamofire_Alamofire.bundle in Resources */, + 2ECBD5048EFF4DB5DF891E1E /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1558,6 +1594,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.home.example; PRODUCT_NAME = HomeExample; SDKROOT = iphoneos; @@ -1623,6 +1663,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.home.tests; PRODUCT_NAME = HomeTests; SDKROOT = iphoneos; @@ -1651,6 +1695,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.home.example; PRODUCT_NAME = HomeExample; SDKROOT = iphoneos; @@ -1675,6 +1723,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.home.tests; PRODUCT_NAME = HomeTests; SDKROOT = iphoneos; diff --git a/Modules/Features/Home/Home.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Home/Home.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index eb18644c..997ee908 100644 --- a/Modules/Features/Home/Home.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Home/Home.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,28 @@ isShown orderHint - 20 + 22 HomeData.xcscheme_^#shared#^_ isShown orderHint - 21 + 23 HomeDomain.xcscheme_^#shared#^_ isShown orderHint - 22 + 24 HomeExample.xcscheme_^#shared#^_ isShown orderHint - 23 + 25 diff --git a/Modules/Features/Launch/Launch.xcodeproj/project.pbxproj b/Modules/Features/Launch/Launch.xcodeproj/project.pbxproj index 6657bc20..256a9135 100644 --- a/Modules/Features/Launch/Launch.xcodeproj/project.pbxproj +++ b/Modules/Features/Launch/Launch.xcodeproj/project.pbxproj @@ -10,13 +10,16 @@ 0B55C607E32BA0CA157B3BDA /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9229787BA766DFA18583ABFA /* DesignSystem.framework */; }; 113F0CBB242B95E70E2B695B /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5E611CA9D5AA49AF6715E1 /* PopupView.framework */; }; 1AEFE7FA6BB5863FD0BA5386 /* LaunchMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A44DF136146F6B9A83C6AB1 /* LaunchMain.swift */; }; + 20F3FEBE364914EB1EF8A480 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 33C3A825E35B81636156DB43 /* DesignSystem_DesignSystem.bundle */; }; 43DAFA287C241F9A81F3F9A6 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAD73AE618B7002C6F84BF4C /* Shared.framework */; }; 45B48283F14B7CAE2E5F4216 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C483202D74E2B6F40348B08 /* Kingfisher.framework */; }; 4A5EC27A4FD3253280EBFD1D /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = FAD73AE618B7002C6F84BF4C /* Shared.framework */; }; + 91E7FC6828BFD26C633D7876 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 33C3A825E35B81636156DB43 /* DesignSystem_DesignSystem.bundle */; }; 988A639C908D85348FA3C893 /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB4BC8E5564382493B0CEDB /* SplashView.swift */; }; 9B8DE9786A8471253B1F77E3 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 9229787BA766DFA18583ABFA /* DesignSystem.framework */; }; A7AB08F321F5FB1D2A837467 /* Launch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CAE9D80105EE847E612B7E64 /* Launch.framework */; }; B1F79015784E7B2762AE008B /* LaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C397ED87CA36DDB17BA0A60 /* LaunchTests.swift */; }; + EBB92F90542ED84308AE68A6 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = FAD73AE618B7002C6F84BF4C /* Shared.framework */; }; F4A2FC493ADCD4CAE25B78CF /* LaunchTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB364B90EFC14BFABA85950 /* LaunchTesting.swift */; }; F7B0B86E17DD269FA98EB7CA /* LaunchTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5554D8163780EA3FBF884CE /* LaunchTesting.framework */; }; /* End PBXBuildFile section */ @@ -39,6 +42,26 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 10A449D84915DD62332B904F /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 91E7FC6828BFD26C633D7876 /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 31E08F68DC5A80FAE63BA5AD /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + EBB92F90542ED84308AE68A6 /* Shared.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 5080B47EE8ECE75CBC8C2A75 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -85,6 +108,7 @@ /* Begin PBXFileReference section */ 0AB4BC8E5564382493B0CEDB /* SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashView.swift; sourceTree = ""; }; 0C397ED87CA36DDB17BA0A60 /* LaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchTests.swift; sourceTree = ""; }; + 33C3A825E35B81636156DB43 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 45D9FF020D2DC8F6DABC4415 /* LaunchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "LaunchTests-Info.plist"; sourceTree = ""; }; 4C483202D74E2B6F40348B08 /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5BB364B90EFC14BFABA85950 /* LaunchTesting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchTesting.swift; sourceTree = ""; }; @@ -201,6 +225,7 @@ DAD3AD821D47FA47C1C68E93 /* Products */ = { isa = PBXGroup; children = ( + 33C3A825E35B81636156DB43 /* DesignSystem_DesignSystem.bundle */, 9229787BA766DFA18583ABFA /* DesignSystem.framework */, 4C483202D74E2B6F40348B08 /* Kingfisher.framework */, CAE9D80105EE847E612B7E64 /* Launch.framework */, @@ -233,6 +258,7 @@ EAA8360EA3C8B818BB84073F /* Resources */, 680A82AE1D6229AD99D80095 /* Frameworks */, 8018432BFC560EB6A47324C9 /* Embed Frameworks */, + 31E08F68DC5A80FAE63BA5AD /* Dependencies */, ); buildRules = ( ); @@ -274,6 +300,7 @@ 312535B7C3FB5E1BFCFEABA3 /* Resources */, 95086E17C1046738BE921DC9 /* Frameworks */, 5080B47EE8ECE75CBC8C2A75 /* Embed Frameworks */, + 10A449D84915DD62332B904F /* Dependencies */, ); buildRules = ( ); @@ -324,6 +351,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 20F3FEBE364914EB1EF8A480 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -398,6 +426,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.launch.tests; PRODUCT_NAME = LaunchTests; SDKROOT = iphoneos; @@ -559,6 +591,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.launch.tests; PRODUCT_NAME = LaunchTests; SDKROOT = iphoneos; diff --git a/Modules/Features/Launch/Launch.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Launch/Launch.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index c8203c22..ed2f0ac1 100644 --- a/Modules/Features/Launch/Launch.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Launch/Launch.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,7 +9,7 @@ isShown orderHint - 24 + 26 diff --git a/Modules/Features/MyPage/Mypage.xcodeproj/project.pbxproj b/Modules/Features/MyPage/Mypage.xcodeproj/project.pbxproj index c329ebac..fe0097b7 100644 --- a/Modules/Features/MyPage/Mypage.xcodeproj/project.pbxproj +++ b/Modules/Features/MyPage/Mypage.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 19935A663C405AB22BC11A90 /* MypageProfileSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11BF00A81D205AE7C88AD86 /* MypageProfileSection.swift */; }; 1B2616837CF776230638671F /* UpdateMypageIndustryUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07B7BEC13FBA38B3C41C987C /* UpdateMypageIndustryUseCase.swift */; }; 1ED582B601FFE9A15EBDFEAB /* CheckPhoneErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67CA1301A9D268781520C44 /* CheckPhoneErrorView.swift */; }; + 20015500438B2BF74ADF1E65 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */; }; 2028E1C4001175401C38828D /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC9681D4DFFD4DDB3C3849F8 /* PopupView.framework */; }; 21A188D0711A098C96B00BA1 /* MockFetchMypageSubscriptionCountUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68E20EDF12F7BB2BCCD3A6E0 /* MockFetchMypageSubscriptionCountUseCase.swift */; }; 239769415CD1F59CF82D9BE1 /* UpdateMypagePhoneNumberUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D3B8B6EE19F0EB5305F954 /* UpdateMypagePhoneNumberUseCase.swift */; }; @@ -37,7 +38,6 @@ 26310133009BC5878EE98201 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F22BB87ADE60B2913D547027 /* DesignSystem.framework */; }; 28438088E730C49EA0EB4C5C /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5560256FA7A1E81BD9D273D /* FoundationKit.framework */; }; 2888735C5BAF70C0D6B0109D /* FetchMypageProfileUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AA4E9FF7DDC66639D13020 /* FetchMypageProfileUseCaseImpl.swift */; }; - 29755FFF0D1C0E7337AE7750 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0C68A206BF4ED627C6FD6913 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2B7AD17B6B8B29942DD794ED /* PasswordRecoveryNewPasswordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB74B2505ABC6888CD7570BA /* PasswordRecoveryNewPasswordView.swift */; }; 2C7FAE614E80018B9A6C7093 /* MypageSMSResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F26CCFE679A08F925F2DED /* MypageSMSResponse.swift */; }; 2E09A3943D712C889AB620F2 /* MypageInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F3F1D4AE93F33C120F2D700D /* MypageInterface.framework */; }; @@ -58,6 +58,7 @@ 45B0C198530E0D39619FC7BE /* MockUpdateMypageNicknameUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF17808A49514A2EAFDAC31 /* MockUpdateMypageNicknameUseCase.swift */; }; 463EFE736E5179473F855EF1 /* MypageSimpleUserDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = A706BC74BF163D2A4F5BA500 /* MypageSimpleUserDTO.swift */; }; 4DAA542956FCB27188ACB180 /* MockFetchMypageProfileUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAD47F935B16B390CB7174B /* MockFetchMypageProfileUseCase.swift */; }; + 4EFFD1002113E3F7EDE4839C /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */; }; 4F4A7C58471FD3E476DC51A9 /* MypageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = A191B750E183477ADF4BAD45 /* MypageInterface.swift */; }; 564B61C6A1F0847B1DAFF2E2 /* WithdrawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A8CA8BD41F6C960FE921370 /* WithdrawView.swift */; }; 56E877CF4D70242607EDE666 /* MypageAuthSMSUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCEFD92A1B7C753EFD92E41 /* MypageAuthSMSUseCaseImpl.swift */; }; @@ -71,17 +72,20 @@ 61A99A787139724DC5113271 /* MypageWithdrawUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B669A3864F90EBB9C3D4E6BA /* MypageWithdrawUseCase.swift */; }; 61E40C93CDBEC0CAB13E652C /* FetchMypageSubscriptionCountUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19C49B9723AC6D72A76460D /* FetchMypageSubscriptionCountUseCase.swift */; }; 62A23C3C44FBA3E5FAF01A2D /* MypageData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6ABBA906E340EC2BED3094C2 /* MypageData.framework */; }; + 6425B27665B9D4C1FC44F5B8 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */; }; 64ACE20AAD8E457F506F6C0A /* PhoneNumberRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0864AA3AB533EA7B497F5F42 /* PhoneNumberRequest.swift */; }; 65FD8FA9561F446C685D5869 /* UpdateMypageIndustryUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277AE28C44A8605B9F62E650 /* UpdateMypageIndustryUseCaseImpl.swift */; }; 6676B749B932DA5CEC2E4FC7 /* MypageWithdrawUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EC02453D9378A9E882667F /* MypageWithdrawUseCaseImpl.swift */; }; 66FED88CC9623B40E9018056 /* MypageStatsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96C71387C911BEF715D45ED4 /* MypageStatsRepository.swift */; }; 673279633359C697B138609A /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A19D7843FEFE29BD0819145C /* Shared.framework */; }; + 6BD347A2BB85A7E487BA69AD /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */; }; 6F49967DE5266732372552CE /* NicknameRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60212C4A9A518D22D0675607 /* NicknameRequest.swift */; }; 6F8000862DD13AEF535E051B /* PasswordRecoveryIdInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA4B94929B9963BC4D21A20 /* PasswordRecoveryIdInputView.swift */; }; 6F952B605A3F6F9FAD334A18 /* Kingfisher.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 09180759E35FAC99B7E89CD5 /* Kingfisher.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7019BB754A571C304FE31EB5 /* PopupView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC9681D4DFFD4DDB3C3849F8 /* PopupView.framework */; }; 730123643E382D9C907B7F67 /* MockFetchReceivedArticleCountUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96604BD68CE1F8AD27036CD /* MockFetchReceivedArticleCountUseCase.swift */; }; 7390DD8F969606B6A77B2C13 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A19D7843FEFE29BD0819145C /* Shared.framework */; }; + 73C1C3881BEB27ACA8A98BAD /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */; }; 773AA4470A9CDC5CC8CC6725 /* EditAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A009F18AE1816F468D79E100 /* EditAlertView.swift */; }; 77FEFFBC6B10590447194F86 /* CheckMypagePhoneNumberUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF371A295252C79E14F27F3 /* CheckMypagePhoneNumberUseCase.swift */; }; 796D479ECF58F63D1D06DCA2 /* PasswordUpdateViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C192D2736D8CD6720A80CC7B /* PasswordUpdateViewModel.swift */; }; @@ -109,11 +113,11 @@ 9C201EC0DAAEC226B4EE442F /* MypageMenuRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934C22124CDFC346342A95C3 /* MypageMenuRow.swift */; }; 9D3AB07A6C6B100950358F7A /* MypageData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6ABBA906E340EC2BED3094C2 /* MypageData.framework */; }; 9D82B3CCEBABF8D7C4472530 /* MypageNewsletterAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ADC4E6680A49B2835E0613 /* MypageNewsletterAPI.swift */; }; - 9E22CABCDB73D10FFB7CF7CB /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F22BB87ADE60B2913D547027 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A4217A60C159A12FE76ABFE8 /* PasswordRecoveryPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D19AA7B747A81D71CA1EAB3 /* PasswordRecoveryPagerView.swift */; }; A4242A1D182943C95A652B09 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09180759E35FAC99B7E89CD5 /* Kingfisher.framework */; }; A4A87FF738D7D3FACD49C84C /* MypageData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6ABBA906E340EC2BED3094C2 /* MypageData.framework */; }; AA7440FF2D87122AC0C57C5C /* MockCheckMypagePhoneNumberUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B948AE7636FC23F71C71E6E /* MockCheckMypagePhoneNumberUseCase.swift */; }; + AB77FDBC9BFB70EABB9E90DB /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */; }; ACEFDA1D477291E9B8603C9B /* MypageArticlesCountDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9793B42A6B978BBF835B69A3 /* MypageArticlesCountDTO.swift */; }; AEBDF2B4E51B3AF98B6138D6 /* MypageUserDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4087D8AA34FB12797F2AEA90 /* MypageUserDTO.swift */; }; B656958EBB2857C9E41E63CD /* MypageBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95FC5124811C98A13DC4817D /* MypageBase.swift */; }; @@ -121,6 +125,7 @@ BD5499769F4EBE9706C2BF1E /* RecoveryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C4A9B55BFB0E1A40566064 /* RecoveryView.swift */; }; BF2AE740E3A427A571DC4062 /* RecoveryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF11E470578D33ABA7047737 /* RecoveryViewModel.swift */; }; C06F5EC21D529D37540FF9CC /* MypageTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE5C77BF7D74BC2D6FA8CFC7 /* MypageTesting.framework */; }; + C0FCFB7C0BBF90177410C410 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */; }; C3630ED16D5074B6F2233758 /* FoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5560256FA7A1E81BD9D273D /* FoundationKit.framework */; }; C96DE8049E3D958DCE9AB7C4 /* FindIdPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6B4AFE1CED393D16552571B /* FindIdPagerView.swift */; }; C9FF796F2AA621AE1D66A5DE /* MypageExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7D59C19C10FE12F704316D3 /* MypageExampleApp.swift */; }; @@ -143,6 +148,7 @@ E53CFA17DB251E18A51C8B33 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A19D7843FEFE29BD0819145C /* Shared.framework */; }; E6D1E60D6FC1D14380165736 /* MypageDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = EBD899A674C4500DB831BB6A /* MypageDomain.framework */; }; E7E4E6781091400A8673B6D0 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F22BB87ADE60B2913D547027 /* DesignSystem.framework */; }; + E83BEF1ADB06A3FE6AF0BFA2 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A19D7843FEFE29BD0819145C /* Shared.framework */; }; E954F6CCCF253E1A3D7A7BC2 /* MypageAuthSMSUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC6F734D19F24C06A9D0A06 /* MypageAuthSMSUseCase.swift */; }; ED2944B1EE07AD35BC8D9B0A /* AccountManagementView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435A5C982C020CECF6823250 /* AccountManagementView.swift */; }; F09691BFAB22A01F310F8230 /* MypageInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3F1D4AE93F33C120F2D700D /* MypageInterface.framework */; }; @@ -151,6 +157,7 @@ F7B316BE3528AF02ADA6BE26 /* MypageArticleAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB28F715ACFA56FEC8BEB075 /* MypageArticleAPI.swift */; }; F92448F94E2E371EE28ED903 /* FetchReceivedArticleCountUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15DB3E0D5901EEC8177079D /* FetchReceivedArticleCountUseCase.swift */; }; F9BB0F13EC85B6040261A1EE /* UpdateMypageInterestsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1A3380F7E1997F6692FB3 /* UpdateMypageInterestsUseCase.swift */; }; + FBCFDAB59D1034A0E1336366 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */; }; FD2C381A3E05CF2B36FB61EE /* MypageNicknameResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FA720977B70D1021A11DD2 /* MypageNicknameResponse.swift */; }; FE5425117241183C96A40601 /* MypageProfileError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49A64BCEE1B1F6EA6016D3ED /* MypageProfileError.swift */; }; FF9DE05FB3879F6756D356F3 /* FoundationKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E5560256FA7A1E81BD9D273D /* FoundationKit.framework */; }; @@ -254,8 +261,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 29755FFF0D1C0E7337AE7750 /* Alamofire.framework in Embed Frameworks */, - 9E22CABCDB73D10FFB7CF7CB /* DesignSystem.framework in Embed Frameworks */, 6F952B605A3F6F9FAD334A18 /* Kingfisher.framework in Embed Frameworks */, 173507B404A2246EDE9820C4 /* Moya.framework in Embed Frameworks */, 4309992BBB532C2C4975F91A /* PopupView.framework in Embed Frameworks */, @@ -293,6 +298,17 @@ name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; + 6E92E01C99FEA3A7EBEC8578 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 6BD347A2BB85A7E487BA69AD /* Alamofire_Alamofire.bundle in Dependencies */, + AB77FDBC9BFB70EABB9E90DB /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 738D1A7E8E42B0AF48466AC9 /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; @@ -304,6 +320,17 @@ name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; + 7E085CBD1B1AF405AAF08F4B /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 20015500438B2BF74ADF1E65 /* Alamofire_Alamofire.bundle in Dependencies */, + 73C1C3881BEB27ACA8A98BAD /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; B0E02DDD8BAAA436E95D843A /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -347,6 +374,7 @@ files = ( 0A3699F877328C471254A373 /* MypageDomain.framework in Dependencies */, 10F52C5CD1F56BDD23C40095 /* MypageInterface.framework in Dependencies */, + E83BEF1ADB06A3FE6AF0BFA2 /* Shared.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -366,13 +394,13 @@ /* Begin PBXFileReference section */ 00ADC4E6680A49B2835E0613 /* MypageNewsletterAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MypageNewsletterAPI.swift; sourceTree = ""; }; 00B196FB966DFE35C9E08FDC /* MypageData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "MypageData-Info.plist"; sourceTree = ""; }; + 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 01BFC2AEFC548A0615E91552 /* MypageUserAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MypageUserAPI.swift; sourceTree = ""; }; 05E42E9F8C3622168A7668BD /* ResetMypagePasswordUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetMypagePasswordUseCaseImpl.swift; sourceTree = ""; }; 07B7BEC13FBA38B3C41C987C /* UpdateMypageIndustryUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateMypageIndustryUseCase.swift; sourceTree = ""; }; 0864AA3AB533EA7B497F5F42 /* PhoneNumberRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneNumberRequest.swift; sourceTree = ""; }; 09180759E35FAC99B7E89CD5 /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0C00F0658E4F123B52DD6F08 /* UpdateMypagePhoneNumberUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateMypagePhoneNumberUseCaseImpl.swift; sourceTree = ""; }; - 0C68A206BF4ED627C6FD6913 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0CC1AC7077C6B1C0A295174A /* UpdateMypagePasswordUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateMypagePasswordUseCase.swift; sourceTree = ""; }; 1319F664323C85E6471B77BF /* Mypage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Mypage-Info.plist"; sourceTree = ""; }; 17886E6B7AEAB04E72C50AF7 /* PhoneUpdateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneUpdateView.swift; sourceTree = ""; }; @@ -392,6 +420,7 @@ 3D0A03142C1620014E65140B /* CheckMypageIDDupUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckMypageIDDupUseCaseImpl.swift; sourceTree = ""; }; 4087D8AA34FB12797F2AEA90 /* MypageUserDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MypageUserDTO.swift; sourceTree = ""; }; 435A5C982C020CECF6823250 /* AccountManagementView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountManagementView.swift; sourceTree = ""; }; + 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 46D5FE2366E88552B9AF5EF5 /* CheckMypagePhoneNumberUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckMypagePhoneNumberUseCaseImpl.swift; sourceTree = ""; }; 49A64BCEE1B1F6EA6016D3ED /* MypageProfileError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MypageProfileError.swift; sourceTree = ""; }; 49BDC64B5E330B1D9882B8FB /* MockMypageWithdrawUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMypageWithdrawUseCase.swift; sourceTree = ""; }; @@ -734,7 +763,8 @@ 66C40A27705DCBB89FAF70F8 /* Products */ = { isa = PBXGroup; children = ( - 0C68A206BF4ED627C6FD6913 /* Alamofire.framework */, + 016E05AA5462B5742B38EE2F /* Alamofire_Alamofire.bundle */, + 457F5AE227F7EE7039B169C3 /* DesignSystem_DesignSystem.bundle */, F22BB87ADE60B2913D547027 /* DesignSystem.framework */, E5560256FA7A1E81BD9D273D /* FoundationKit.framework */, 09180759E35FAC99B7E89CD5 /* Kingfisher.framework */, @@ -1013,6 +1043,7 @@ 3635D559ED43F856B224D518 /* Resources */, FF152E317F8015C395A95F74 /* Frameworks */, 1747DA9151D1AC8CC5FCCC94 /* Embed Frameworks */, + 6E92E01C99FEA3A7EBEC8578 /* Dependencies */, ); buildRules = ( ); @@ -1146,6 +1177,7 @@ 6B2333B20EFC57C8B21D464C /* Resources */, 2EC9A9CD77126097DD5F8F1B /* Frameworks */, E74125313A6BC39A42EE4641 /* Embed Frameworks */, + 7E085CBD1B1AF405AAF08F4B /* Dependencies */, ); buildRules = ( ); @@ -1214,6 +1246,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C0FCFB7C0BBF90177410C410 /* Alamofire_Alamofire.bundle in Resources */, + 6425B27665B9D4C1FC44F5B8 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1228,6 +1262,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4EFFD1002113E3F7EDE4839C /* Alamofire_Alamofire.bundle in Resources */, + FBCFDAB59D1034A0E1336366 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1486,6 +1522,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.mypage.tests; PRODUCT_NAME = MypageTests; SDKROOT = iphoneos; @@ -1573,6 +1613,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.mypage.example; PRODUCT_NAME = MypageExample; SDKROOT = iphoneos; @@ -1637,6 +1681,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.mypage.tests; PRODUCT_NAME = MypageTests; SDKROOT = iphoneos; @@ -1903,6 +1951,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.mypage.example; PRODUCT_NAME = MypageExample; SDKROOT = iphoneos; diff --git a/Modules/Features/MyPage/Mypage.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/MyPage/Mypage.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index d135002c..2e0c5ec7 100644 --- a/Modules/Features/MyPage/Mypage.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/MyPage/Mypage.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,28 @@ isShown orderHint - 25 + 27 MypageData.xcscheme_^#shared#^_ isShown orderHint - 26 + 28 MypageDomain.xcscheme_^#shared#^_ isShown orderHint - 27 + 29 MypageExample.xcscheme_^#shared#^_ isShown orderHint - 28 + 30 diff --git a/Modules/Features/Search/Search.xcodeproj/project.pbxproj b/Modules/Features/Search/Search.xcodeproj/project.pbxproj index 05586def..7007c90f 100644 --- a/Modules/Features/Search/Search.xcodeproj/project.pbxproj +++ b/Modules/Features/Search/Search.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 015EA02C07E45A4739DE697E /* FetchPopularKeywordsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCBFAF98AEAA3473A573FDC /* FetchPopularKeywordsUseCase.swift */; }; - 023D9AC7244E888BFA91ABEF /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 689C0AA30BC17A2D6BA3F9CB /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 099AA2BC3A9B9B32EEF2B4A8 /* SearchInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E111FAC845F96C56366564E /* SearchInterface.swift */; }; 0C1B9A4814809B68A971AE15 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6935497B8DBBBC4FEF7F371B /* Moya.framework */; }; 0CA24716D9F70C942AD25477 /* NewsLetterEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30E42EF45439133ED9D52822 /* NewsLetterEmptyView.swift */; }; @@ -23,22 +22,26 @@ 1BAF6D90BE5749101E700080 /* PopupView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F073E43BB17A8E85C5AA8A0 /* PopupView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1C52231AD0F31D01F81FF2EB /* Kingfisher.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 469D051C099D125ABFA94EBD /* Kingfisher.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 20D4BCFA115ABCEB63772C1A /* SearchDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 138503897C437D2E43301F23 /* SearchDomain.framework */; }; + 239DA214A8D5F8EF08B96619 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */; }; 23F862B7360E02A200F2EB0E /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09C6456DA96EB978D6D9D462 /* NetworkKit.framework */; }; + 26843B9D0FF89160D2D21A43 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; 28E36A746E3E061EF9D29291 /* MockSearchNewslettersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C9E8ECB6B925827AD7015D /* MockSearchNewslettersUseCase.swift */; }; 2C0B7FFC91ABE89401F525AD /* MockFetchPopularKeywordsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD06DB1B6FB5A4F669B5F023 /* MockFetchPopularKeywordsUseCase.swift */; }; 2E50C5AF6A3FC0BDC11908E4 /* NoArticleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1C453C66B2CD564B97D5DA /* NoArticleView.swift */; }; + 3187165DDAAF64EC2D98DB4D /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */; }; 3808DDFAFF30FAB52B19E229 /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; 413E3265B6666248C89E2464 /* SearchedNewsletterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD66C7F3ECD7E20BC58F449 /* SearchedNewsletterDTO.swift */; }; 495766BA2FA2D9B062332AFD /* SearchedNewsletter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29151EC654CBDC98F89C56D3 /* SearchedNewsletter.swift */; }; 4E8760D7F7E6A004FA3AAA06 /* SearchMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7814D8BA01A03012E40C5B3 /* SearchMain.swift */; }; 4EF44496ECB05C8E29BD3E70 /* SearchNewslettersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D466383C24C28E9ED01A076 /* SearchNewslettersUseCase.swift */; }; + 5E07E5A979024DA17E38ABC2 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; 6DAE677C5B47001C1B9D09AD /* SearchNewsletterRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1069F9F5D96811C34A580412 /* SearchNewsletterRow.swift */; }; 6EC3658701C5DDB5B88F65AA /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; 7E0A78327C137B933BDCF6D4 /* SearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D97017FB6FE85C21EEC1D8B /* SearchTests.swift */; }; 8181B085CE18A6CEE3A66505 /* SearchedNewsletter+Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F1434D944C3A3F69A716BC /* SearchedNewsletter+Sample.swift */; }; - 81F68122D4E48D1D4D023370 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26CD22AD121507433FA773EF /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 85D3904421F267B473EED884 /* SearchData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 701D52A197B8E7BDBA756946 /* SearchData.framework */; }; 88D874BEEA4169CD598264B3 /* SearchBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0547A521CAE2E81914EFEFDC /* SearchBuilder.swift */; }; + 8A4429053A94EE4A35BBB3F6 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; 8FD1A10CBD16030CA54E0E40 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 469D051C099D125ABFA94EBD /* Kingfisher.framework */; }; 92B199229BC659A599B0B054 /* SearchInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D355E681C0F08758849D9345 /* SearchInterface.framework */; }; 93CFB175583BCC8DBEBE90CB /* SearchData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 701D52A197B8E7BDBA756946 /* SearchData.framework */; }; @@ -46,8 +49,10 @@ 9B30F210F68970DF5127C523 /* SearchDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 138503897C437D2E43301F23 /* SearchDomain.framework */; }; 9EC2625822DA13904C8A29EB /* SearchTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 838EBFAB897D38EC2B391886 /* SearchTesting.framework */; }; A829B59B25970B6991E2848B /* FetchPopularKeywordsUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 473B77528DB0E33CEF09E0D4 /* FetchPopularKeywordsUseCaseImpl.swift */; }; + ABCAA05899B035B10B2F3EF9 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */; }; AC04590E07695AE7A806FAD9 /* Search.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCEA3ABCBA70F49C90FFC61F /* Search.framework */; }; AF288D379585E1C1DFE44FA2 /* SearchInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D355E681C0F08758849D9345 /* SearchInterface.framework */; }; + B69BA5C7B4F7607CBCE8E36B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; B8DD111AE35E4AB671E37148 /* SearchData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 701D52A197B8E7BDBA756946 /* SearchData.framework */; }; BC43CDC0F9DB0F87AA35DE74 /* NetworkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09C6456DA96EB978D6D9D462 /* NetworkKit.framework */; }; BC799AAB44F46FD582E0D5A7 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6935497B8DBBBC4FEF7F371B /* Moya.framework */; }; @@ -58,6 +63,7 @@ CB176EEB1B83EF220AE01544 /* SearchRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAC92F658154DD34F5330B9 /* SearchRepositoryImpl.swift */; }; CBE2E26CBE8FAE616C8A7223 /* SearchDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 138503897C437D2E43301F23 /* SearchDomain.framework */; }; CDB2896D69AF6E8F45D49F86 /* Moya.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6935497B8DBBBC4FEF7F371B /* Moya.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + CE8C647F9935EFA6235BBBBB /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */; }; CEAA9FCA98F56C5C184D94B9 /* SearchAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = E53596DC37AD0977FC3430D7 /* SearchAPI.swift */; }; DD6795FF69CD93B520886A1B /* PopularKeyword.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A2671DE7FC229A2D15ADA9 /* PopularKeyword.swift */; }; E325186C0C85C706AB387F29 /* NetworkKit.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 09C6456DA96EB978D6D9D462 /* NetworkKit.framework */; }; @@ -67,6 +73,7 @@ F7A5889A58EEC388434CCCB3 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26CD22AD121507433FA773EF /* DesignSystem.framework */; }; F87AF19EBB604A1197E6B440 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; F9E0049177AC2A640098B3A7 /* SearchInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D355E681C0F08758849D9345 /* SearchInterface.framework */; }; + FA9C7FB9753FF7AB4039671E /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; FCAE4D5E0C78C551D60B1157 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 26CD22AD121507433FA773EF /* DesignSystem.framework */; }; FE71144B1C50E1D95991A604 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2ACA18D21B051155077DA3 /* SearchViewModel.swift */; }; /* End PBXBuildFile section */ @@ -152,6 +159,17 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 0FD283A6D7CA26DA1D2B6937 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + B69BA5C7B4F7607CBCE8E36B /* Alamofire_Alamofire.bundle in Dependencies */, + 3187165DDAAF64EC2D98DB4D /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 1FDBE93BA4CF4056B2A750B5 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -179,8 +197,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 023D9AC7244E888BFA91ABEF /* Alamofire.framework in Embed Frameworks */, - 81F68122D4E48D1D4D023370 /* DesignSystem.framework in Embed Frameworks */, 1C52231AD0F31D01F81FF2EB /* Kingfisher.framework in Embed Frameworks */, CDB2896D69AF6E8F45D49F86 /* Moya.framework in Embed Frameworks */, 1BAF6D90BE5749101E700080 /* PopupView.framework in Embed Frameworks */, @@ -195,6 +211,18 @@ files = ( CBE2E26CBE8FAE616C8A7223 /* SearchDomain.framework in Dependencies */, 92B199229BC659A599B0B054 /* SearchInterface.framework in Dependencies */, + FA9C7FB9753FF7AB4039671E /* Shared.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 4BFB3AA0E67BFD2A2369A555 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 26843B9D0FF89160D2D21A43 /* Alamofire_Alamofire.bundle in Dependencies */, + CE8C647F9935EFA6235BBBBB /* DesignSystem_DesignSystem.bundle in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -269,6 +297,7 @@ /* Begin PBXFileReference section */ 0547A521CAE2E81914EFEFDC /* SearchBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBuilder.swift; sourceTree = ""; }; 09C6456DA96EB978D6D9D462 /* NetworkKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 1069F9F5D96811C34A580412 /* SearchNewsletterRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNewsletterRow.swift; sourceTree = ""; }; 12466D213C1D03705923D06D /* SearchExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SearchExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -291,7 +320,6 @@ 502AA82AD7833704FDFEB017 /* SearchExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchExampleApp.swift; sourceTree = ""; }; 5DD66C7F3ECD7E20BC58F449 /* SearchedNewsletterDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchedNewsletterDTO.swift; sourceTree = ""; }; 642E610A17539092C8C4A08F /* SearchDIContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDIContainer.swift; sourceTree = ""; }; - 689C0AA30BC17A2D6BA3F9CB /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6935497B8DBBBC4FEF7F371B /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6D2ACA18D21B051155077DA3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 701D52A197B8E7BDBA756946 /* SearchData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -302,6 +330,7 @@ 9AEAA516F8E566FF78FD382B /* PopularKeywordDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularKeywordDTO.swift; sourceTree = ""; }; B3A2671DE7FC229A2D15ADA9 /* PopularKeyword.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularKeyword.swift; sourceTree = ""; }; B4C293EA1BEB83670D260B13 /* SearchExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SearchExample-Info.plist"; sourceTree = ""; }; + CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; CD06DB1B6FB5A4F669B5F023 /* MockFetchPopularKeywordsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchPopularKeywordsUseCase.swift; sourceTree = ""; }; D355E681C0F08758849D9345 /* SearchInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D532402CD48F0D3BAE7ACD48 /* SearchInterface-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SearchInterface-Info.plist"; sourceTree = ""; }; @@ -583,7 +612,8 @@ BEF3F41E9B860D2AF6E4FE8E /* Products */ = { isa = PBXGroup; children = ( - 689C0AA30BC17A2D6BA3F9CB /* Alamofire.framework */, + CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */, + 0EE2D0AEC979E4057EF7FA5A /* DesignSystem_DesignSystem.bundle */, 26CD22AD121507433FA773EF /* DesignSystem.framework */, 469D051C099D125ABFA94EBD /* Kingfisher.framework */, 6935497B8DBBBC4FEF7F371B /* Moya.framework */, @@ -689,6 +719,7 @@ 560638D67118197BA55FDA87 /* Resources */, F271BCF26737FA01F42D78D9 /* Frameworks */, 32006D16C41FDFB2FE09C415 /* Embed Frameworks */, + 4BFB3AA0E67BFD2A2369A555 /* Dependencies */, ); buildRules = ( ); @@ -735,6 +766,7 @@ BFE4DF0124DF27EC3591F41A /* Resources */, 4764E98A0E48BBD1C0A40DE5 /* Frameworks */, 9D9977A71E7C7D1C574D5FE5 /* Embed Frameworks */, + 0FD283A6D7CA26DA1D2B6937 /* Dependencies */, ); buildRules = ( ); @@ -869,6 +901,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5E07E5A979024DA17E38ABC2 /* Alamofire_Alamofire.bundle in Resources */, + ABCAA05899B035B10B2F3EF9 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -897,6 +931,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8A4429053A94EE4A35BBB3F6 /* Alamofire_Alamofire.bundle in Resources */, + 239DA214A8D5F8EF08B96619 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1100,6 +1136,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.search.example; PRODUCT_NAME = SearchExample; SDKROOT = iphoneos; @@ -1128,6 +1168,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.search.example; PRODUCT_NAME = SearchExample; SDKROOT = iphoneos; @@ -1251,6 +1295,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.search.tests; PRODUCT_NAME = SearchTests; SDKROOT = iphoneos; @@ -1638,6 +1686,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.search.tests; PRODUCT_NAME = SearchTests; SDKROOT = iphoneos; diff --git a/Modules/Features/Search/Search.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Search/Search.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index 54e10007..c48dbd89 100644 --- a/Modules/Features/Search/Search.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Search/Search.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,28 @@ isShown orderHint - 32 + 34 SearchData.xcscheme_^#shared#^_ isShown orderHint - 33 + 35 SearchDomain.xcscheme_^#shared#^_ isShown orderHint - 34 + 36 SearchExample.xcscheme_^#shared#^_ isShown orderHint - 35 + 37 diff --git a/Modules/Features/Subscribe/Subscribe.xcodeproj/project.pbxproj b/Modules/Features/Subscribe/Subscribe.xcodeproj/project.pbxproj index b947ee3f..ffb40047 100644 --- a/Modules/Features/Subscribe/Subscribe.xcodeproj/project.pbxproj +++ b/Modules/Features/Subscribe/Subscribe.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 18C097FEE30E087906590A11 /* SubscribeDomain.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = C4490CBDF56FA86E240C6B38 /* SubscribeDomain.framework */; }; 1D808CDF8AF5B904FC97DB9A /* SubscribeInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = A41979B86D33DCE3C96AF5E6 /* SubscribeInterface.swift */; }; 25854157DCA8CBE5626D4678 /* Moya.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4B92346DC382D5960E6BFCD0 /* Moya.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 2876F661347187156292E9DF /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */; }; + 28955AE1A98B7A1F05BABCB6 /* DesignSystem_DesignSystem.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */; }; 2A2CC7861E654128BCF341C1 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 818348BBF6B997119C6F5E6A /* Shared.framework */; }; 2C9F2B1D40235C64AF4842E2 /* Subscribe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5595DBABF800B949A8877D83 /* Subscribe.framework */; }; 3110F4E21938AE7A242D84BF /* SubscribeNewsletter+Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A534C6A232AC46225249EA00 /* SubscribeNewsletter+Sample.swift */; }; @@ -26,6 +28,7 @@ 4ACCBD0A2EAA7E518EF2FB3C /* MockResumeSubscriptionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF719FE89E8FDC35CB2F20CC /* MockResumeSubscriptionUseCase.swift */; }; 4DE577C3AE91C2A7FE749119 /* SubscribeNewsletterAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA341D080AD88E95DC1EFBD /* SubscribeNewsletterAPI.swift */; }; 58D5C2CFA60155CD19084E6E /* FetchPausedSubscriptionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D4AEFBB8D9678A0A33642D7 /* FetchPausedSubscriptionUseCase.swift */; }; + 5DD195D73E348A1AF31C3698 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */; }; 5F9D05B7F1E2203A0BDEA43F /* SubscribeInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 32659030D723322E066C81FA /* SubscribeInterface.framework */; }; 646AFF2CA9E115D116B5636B /* SubscribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255AADBF446AC4625B5B10B7 /* SubscribeTests.swift */; }; 6577BDC6B8C05F2868DFB096 /* FetchSubscriptionCountUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6941CB8A17245A73A120BA0D /* FetchSubscriptionCountUseCaseImpl.swift */; }; @@ -47,7 +50,6 @@ 989A43B3ADEEFACF867ECBC5 /* SubscriptionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2B45BE2400769168823DB3 /* SubscriptionRequest.swift */; }; 9ED4023D5406DC0E465583D7 /* MockFetchPausedSubscriptionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF924BB2C781BBA6D2E123D0 /* MockFetchPausedSubscriptionUseCase.swift */; }; A0179DBE853A8A7F3174C5DC /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77C44007B0D39A42AB4ACE21 /* Kingfisher.framework */; }; - A18295DA317249F7144A9E1B /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A71898F4F86DD408E9654E98 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A1EDAD31829A35641A2646A7 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC1A311498193AE6DF677F49 /* DesignSystem.framework */; }; A8D3077CAB611B4EAF820E6B /* PauseSubscriptionUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 550ED7054D9A6D9D260531A9 /* PauseSubscriptionUseCaseImpl.swift */; }; AC2E314D9F7BB541918AE29C /* SubscribeData.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = DF5FF2A79CAAD6E1707060E8 /* SubscribeData.framework */; }; @@ -57,8 +59,10 @@ BC5D9A3AB6139B6790305DC5 /* SubscribeExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67523DDB4CDDB4A9B5775D1D /* SubscribeExampleApp.swift */; }; C4D403ADB487A63B26DEBCBD /* SubscribeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7D112BBF7502924041ED21 /* SubscribeView.swift */; }; C80E01B0867DE460720744E0 /* MockPauseSubscriptionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52C6C8C86219782C79D3BD07 /* MockPauseSubscriptionUseCase.swift */; }; + C9FFFA2C52AF78ABDECF998B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */; }; CB0B7570D2E7DCF3D9385631 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B92346DC382D5960E6BFCD0 /* Moya.framework */; }; CBCED34E905FF64C06915E3A /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B92346DC382D5960E6BFCD0 /* Moya.framework */; }; + CBD1E4831C5CA195DD24BC84 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */; }; D4AB4A546B907E1C6A744C01 /* SubscribeDomain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4490CBDF56FA86E240C6B38 /* SubscribeDomain.framework */; }; D863D5A1D86640B66ADDE802 /* SubscribeData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF5FF2A79CAAD6E1707060E8 /* SubscribeData.framework */; }; DB5C9D560E785B286AAA4E2E /* SubscribeRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 518873D08881857BF9308510 /* SubscribeRow.swift */; }; @@ -71,11 +75,14 @@ EA6088EE736EA710C61A29C6 /* SubscribeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210E740423E2557577E07549 /* SubscribeViewModel.swift */; }; EA6395FFFF6759BD38A8252A /* SubscribeNewsletterRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5478AD7CFD21E8DFD1DAAB8A /* SubscribeNewsletterRepositoryImpl.swift */; }; ECB3A6D8A5EE4F0D5BDA3B5A /* SubscribeMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 601DDD48F11BCA082BCDC946 /* SubscribeMain.swift */; }; - F19F0F05C353E24561393294 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AC1A311498193AE6DF677F49 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + ED87ACF2C48CBCD9FA816100 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */; }; + EDB26E33DE561926E9D1C2A4 /* DesignSystem_DesignSystem.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */; }; + F14B81EA5BFF0F05FF2156FE /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */; }; F34D9DBEC1E48FCAFAEF3336 /* SubscribeNewsletterRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80AC022782541B311A1C6B99 /* SubscribeNewsletterRepository.swift */; }; F3CB6A79FD601706C034F708 /* SegmentPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BE4372D9C9BB0DAF5A3985 /* SegmentPickerView.swift */; }; F9E18925131A335A18BDAC8C /* SubscribeError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28774BD95118989809A32F82 /* SubscribeError.swift */; }; FAE8DCC1FABFF0F0FE9BE8BB /* ResumeSubscriptionUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB58445B89F114633E08BD2 /* ResumeSubscriptionUseCaseImpl.swift */; }; + FD946B80E197F38EE50F199A /* Shared.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 818348BBF6B997119C6F5E6A /* Shared.framework */; }; FDB9C9A8EA11ED7D892A2B48 /* DesignSystem.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = AC1A311498193AE6DF677F49 /* DesignSystem.framework */; }; FE5D7DB06470DBA2B3DD9C6F /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 818348BBF6B997119C6F5E6A /* Shared.framework */; }; /* End PBXBuildFile section */ @@ -171,14 +178,34 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 17724452884607EE74BED1FD /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 5DD195D73E348A1AF31C3698 /* Alamofire_Alamofire.bundle in Dependencies */, + ED87ACF2C48CBCD9FA816100 /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 2085267526EB0E32B527F413 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + C9FFFA2C52AF78ABDECF998B /* Alamofire_Alamofire.bundle in Dependencies */, + EDB26E33DE561926E9D1C2A4 /* DesignSystem_DesignSystem.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; 374F2BB2E1D2FA7F1C9C4CDB /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - A18295DA317249F7144A9E1B /* Alamofire.framework in Embed Frameworks */, - F19F0F05C353E24561393294 /* DesignSystem.framework in Embed Frameworks */, 47153128BB9B7F991DDC15C3 /* Kingfisher.framework in Embed Frameworks */, 25854157DCA8CBE5626D4678 /* Moya.framework in Embed Frameworks */, 41148B83A433BA12D1036EE1 /* PopupView.framework in Embed Frameworks */, @@ -257,6 +284,7 @@ buildActionMask = 8; dstSubfolderSpec = 16; files = ( + FD946B80E197F38EE50F199A /* Shared.framework in Dependencies */, 834BB2CBE006EA0013B984F5 /* SubscribeDomain.framework in Dependencies */, 760849803B870DD2D9E68B91 /* SubscribeInterface.framework in Dependencies */, ); @@ -296,6 +324,7 @@ 5478AD7CFD21E8DFD1DAAB8A /* SubscribeNewsletterRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeNewsletterRepositoryImpl.swift; sourceTree = ""; }; 550ED7054D9A6D9D260531A9 /* PauseSubscriptionUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PauseSubscriptionUseCaseImpl.swift; sourceTree = ""; }; 5595DBABF800B949A8877D83 /* Subscribe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Subscribe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 601DDD48F11BCA082BCDC946 /* SubscribeMain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeMain.swift; sourceTree = ""; }; 67523DDB4CDDB4A9B5775D1D /* SubscribeExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeExampleApp.swift; sourceTree = ""; }; 6941CB8A17245A73A120BA0D /* FetchSubscriptionCountUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchSubscriptionCountUseCaseImpl.swift; sourceTree = ""; }; @@ -306,6 +335,7 @@ 80C0B3B0D19108DC3253B219 /* SubscribeInterface-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SubscribeInterface-Info.plist"; sourceTree = ""; }; 818348BBF6B997119C6F5E6A /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8630490A9341AB3457AEA349 /* FetchActiveSubscriptionUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchActiveSubscriptionUseCaseImpl.swift; sourceTree = ""; }; + 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DesignSystem_DesignSystem.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 8D51B34F0FB31FC07BA7A661 /* ResumeSubscriptionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeSubscriptionUseCase.swift; sourceTree = ""; }; 902DD38A5009735AFD6ABECD /* SubscribeNewsletterDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeNewsletterDTO.swift; sourceTree = ""; }; 905D13D71D11FFC0A126A1AD /* SubscribeExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SubscribeExample-Info.plist"; sourceTree = ""; }; @@ -315,7 +345,6 @@ A41979B86D33DCE3C96AF5E6 /* SubscribeInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeInterface.swift; sourceTree = ""; }; A534C6A232AC46225249EA00 /* SubscribeNewsletter+Sample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SubscribeNewsletter+Sample.swift"; sourceTree = ""; }; A60CF944F586955460558986 /* MockFetchActiveSubscriptionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFetchActiveSubscriptionUseCase.swift; sourceTree = ""; }; - A71898F4F86DD408E9654E98 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A80D97104AC5352523E57C90 /* SubscribeData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SubscribeData-Info.plist"; sourceTree = ""; }; AC1A311498193AE6DF677F49 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AF719FE89E8FDC35CB2F20CC /* MockResumeSubscriptionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockResumeSubscriptionUseCase.swift; sourceTree = ""; }; @@ -451,7 +480,8 @@ 46A85862377EC9F7C2F801A2 /* Products */ = { isa = PBXGroup; children = ( - A71898F4F86DD408E9654E98 /* Alamofire.framework */, + 597FEA69136238C9DCCDE9B0 /* Alamofire_Alamofire.bundle */, + 88725C861E43B9844D9D4D87 /* DesignSystem_DesignSystem.bundle */, AC1A311498193AE6DF677F49 /* DesignSystem.framework */, 77C44007B0D39A42AB4ACE21 /* Kingfisher.framework */, 4B92346DC382D5960E6BFCD0 /* Moya.framework */, @@ -738,6 +768,7 @@ 362F04D734D17695F7B75B43 /* Resources */, B4BCF0AB15B1EB025E7CBEAE /* Frameworks */, 374F2BB2E1D2FA7F1C9C4CDB /* Embed Frameworks */, + 2085267526EB0E32B527F413 /* Dependencies */, ); buildRules = ( ); @@ -828,6 +859,7 @@ ED60597D7D1B55395C12B6D7 /* Resources */, A1D89E331889E56366446D38 /* Frameworks */, AFD814EEF955823CAF55FD20 /* Embed Frameworks */, + 17724452884607EE74BED1FD /* Dependencies */, ); buildRules = ( ); @@ -889,6 +921,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + CBD1E4831C5CA195DD24BC84 /* Alamofire_Alamofire.bundle in Resources */, + 2876F661347187156292E9DF /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -924,6 +958,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + F14B81EA5BFF0F05FF2156FE /* Alamofire_Alamofire.bundle in Resources */, + 28955AE1A98B7A1F05BABCB6 /* DesignSystem_DesignSystem.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1320,6 +1356,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.subscribe.tests; PRODUCT_NAME = SubscribeTests; SDKROOT = iphoneos; @@ -1348,6 +1388,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.subscribe.example; PRODUCT_NAME = SubscribeExample; SDKROOT = iphoneos; @@ -1470,6 +1514,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.subscribe.tests; PRODUCT_NAME = SubscribeTests; SDKROOT = iphoneos; @@ -1502,6 +1550,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-L$(DT_TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.newdok.subscribe.example; PRODUCT_NAME = SubscribeExample; SDKROOT = iphoneos; diff --git a/Modules/Features/Subscribe/Subscribe.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Features/Subscribe/Subscribe.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index 2328eba9..27807d04 100644 --- a/Modules/Features/Subscribe/Subscribe.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Features/Subscribe/Subscribe.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,28 +9,28 @@ isShown orderHint - 37 + 39 SubscribeData.xcscheme_^#shared#^_ isShown orderHint - 38 + 40 SubscribeDomain.xcscheme_^#shared#^_ isShown orderHint - 39 + 41 SubscribeExample.xcscheme_^#shared#^_ isShown orderHint - 40 + 42 diff --git a/Modules/NetworkKit/Sources/Network/APIRequest.swift b/Modules/NetworkKit/Sources/Network/APIRequest.swift index f37d8d1d..37c2ea5b 100644 --- a/Modules/NetworkKit/Sources/Network/APIRequest.swift +++ b/Modules/NetworkKit/Sources/Network/APIRequest.swift @@ -28,6 +28,10 @@ public protocol APIRequest: Sendable { var method: HTTPMethod { get } var task: RequestTask { get } var headers: [String: String]? { get } + + /// 이 요청의 401이 "세션 만료"(전역 로그아웃)로 해석되어야 하는지 여부. + /// 로그인/회원가입처럼 미인증 진입 엔드포인트는 401이 자격 증명 실패이므로 false. + var emitsUnauthorizedEvent: Bool { get } } public extension APIRequest { @@ -37,4 +41,6 @@ public extension APIRequest { "Accept": "application/json" ] } + + var emitsUnauthorizedEvent: Bool { true } } diff --git a/Modules/NetworkKit/Sources/Network/Core/MoyaTarget.swift b/Modules/NetworkKit/Sources/Network/Core/MoyaTarget.swift index 1a4efb49..5a94872c 100644 --- a/Modules/NetworkKit/Sources/Network/Core/MoyaTarget.swift +++ b/Modules/NetworkKit/Sources/Network/Core/MoyaTarget.swift @@ -8,12 +8,14 @@ struct MoyaTarget: Moya.TargetType { let task: Moya.Task let headers: [String: String]? let sampleData: Data + let emitsUnauthorizedEvent: Bool init(_ request: R) { baseURL = request.baseURL path = request.path headers = request.headers sampleData = Data() + emitsUnauthorizedEvent = request.emitsUnauthorizedEvent switch request.method { case .get: method = .get diff --git a/Modules/NetworkKit/Sources/Network/Core/Plugin/AccessTokenPlugin.swift b/Modules/NetworkKit/Sources/Network/Core/Plugin/AccessTokenPlugin.swift index 51db3895..e0f23e11 100644 --- a/Modules/NetworkKit/Sources/Network/Core/Plugin/AccessTokenPlugin.swift +++ b/Modules/NetworkKit/Sources/Network/Core/Plugin/AccessTokenPlugin.swift @@ -36,6 +36,12 @@ final class AuthPlugin: PluginType { guard statusCode == 401 else { return } + // 로그인/회원가입 같은 미인증 엔드포인트의 401은 자격 증명 실패이지 + // 세션 만료가 아니므로 전역 로그아웃을 트리거하지 않는다. + if let target = target as? MoyaTarget, !target.emitsUnauthorizedEvent { + return + } + AuthEvent.notifyUnauthorized() } } diff --git a/Modules/Shared/Shared.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist b/Modules/Shared/Shared.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist index 848af3e3..5180a124 100644 --- a/Modules/Shared/Shared.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Modules/Shared/Shared.xcodeproj/xcuserdata/minjae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,7 +9,7 @@ isShown orderHint - 36 + 38 diff --git a/Newdok.xcworkspace/xcshareddata/xcschemes/Newdok-Workspace.xcscheme b/Newdok.xcworkspace/xcshareddata/xcschemes/Newdok-Workspace.xcscheme index d4bc4a7e..8901f954 100644 --- a/Newdok.xcworkspace/xcshareddata/xcschemes/Newdok-Workspace.xcscheme +++ b/Newdok.xcworkspace/xcshareddata/xcschemes/Newdok-Workspace.xcscheme @@ -20,6 +20,20 @@ ReferencedContainer = "container:Tuist/.build/tuist-derived/Alamofire/Alamofire.xcodeproj"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + isShown orderHint - 19 + 21 Newdok-Workspace.xcscheme_^#shared#^_ isShown orderHint - 31 + 33