From 7ceb4755a51545cc619f6e223f8fee9fd82af132 Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Mon, 3 Apr 2023 23:17:45 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[Feat]=20#123=20-=20Signup=EA=B3=BC=20Login?= =?UTF-8?q?=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Utils/RNUtils/UserManager.swift | 2 +- .../SignIn/VC/SignInSocialLoginVC.swift | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift index 93811ba6..7dae3f8f 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift @@ -47,7 +47,7 @@ final class UserManager { self.accessToken = data.accessToken self.refreshToken = data.refreshToken self.isKakao = provider == "KAKAO" ? true : false - completion(.success(data.nickname ?? "")) + completion(.success(data.type)) // 로그인인지 회원가입인지 전달 } catch { print(error.localizedDescription) completion(.failure(.networkFail)) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift index 2d73d8ef..70afda7b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift @@ -85,9 +85,8 @@ extension SignInSocialLoginVC { guard let oauthToken = oauthToken else { return } UserManager.shared.signIn(token: oauthToken.accessToken, provider: "KAKAO") { [weak self] result in switch result { - case .success(let nickname): - print(nickname) - self?.pushToNickNameSetUpVC() + case .success(let type): + type == "Signup" ? self?.pushToNickNameSetUpVC() : self?.pushToTabBarController() case .failure(let error): print(error) self?.showNetworkFailureToast() @@ -105,9 +104,8 @@ extension SignInSocialLoginVC { guard let oauthToken = oauthToken else { return } UserManager.shared.signIn(token: oauthToken.accessToken, provider: "KAKAO") { [weak self] result in switch result { - case .success(let nickname): - print(nickname) - self?.pushToNickNameSetUpVC() + case .success(let type): + type == "Signup" ? self?.pushToNickNameSetUpVC() : self?.pushToTabBarController() case .failure(let error): print(error) self?.showNetworkFailureToast() @@ -131,6 +129,12 @@ extension SignInSocialLoginVC { let nicknameSetUpVC = NickNameSetUpVC() self.navigationController?.pushViewController(nicknameSetUpVC, animated: true) } + + private func pushToTabBarController() { + let tabBarController = TabBarController() + guard let window = self.view.window else { return } + ViewControllerUtils.setRootViewController(window: window, viewController: tabBarController, withAnimation: true) + } } // MARK: - UI & Layout From 9ffe2f82cad3f1509f76f316488752dc94169de5 Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Mon, 3 Apr 2023 23:36:30 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[Feat]=20#123=20-=20=EC=86=8C=EC=85=9C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=B7=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Literal/ImageLiterals.swift | 2 ++ .../img_apple_login.imageset/Contents.json | 23 ++++++++++++++++++ .../img_apple_login.imageset/Group 9514.png | Bin 0 -> 1856 bytes .../Group 9514@2x.png | Bin 0 -> 3671 bytes .../Group 9514@3x.png | Bin 0 -> 5691 bytes .../img_kakao_login.imageset/Contents.json | 23 ++++++++++++++++++ .../img_kakao_login.imageset/Kakao Login.png | Bin 0 -> 1808 bytes .../Kakao Login@2x.png | Bin 0 -> 3526 bytes .../Kakao Login@3x.png | Bin 0 -> 5374 bytes .../SignIn/VC/SignInSocialLoginVC.swift | 17 ++++++------- 10 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Contents.json create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514@2x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514@3x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Contents.json create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Kakao Login.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Kakao Login@2x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Kakao Login@3x.png diff --git a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift index b3bf5bc6..7e9eba31 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift @@ -67,6 +67,8 @@ enum ImageLiterals { static var imgSpaceship: UIImage { .load(named: "img_spaceship") } static var imgAppIcon: UIImage { .load(named: "img_app_icon") } static var imgAd: UIImage { .load(named: "img_ad") } + static var imgAppleLogin: UIImage { .load(named: "img_apple_login")} + static var imgKakaoLogin: UIImage { .load(named: "img_kakao_login")} } extension UIImage { diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Contents.json new file mode 100644 index 00000000..e04c2538 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 9514.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 9514@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 9514@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b189713bf00bd8caf09642ea8da7240f60186 GIT binary patch literal 1856 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 literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_apple_login.imageset/Group 9514@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b815b5b42f62be15bc181fc40c5551d44d347c71 GIT binary patch literal 5691 zcmdT|2Un9xxc*QSS(=M$K}uW;EYcJt2uJ`C5LU{fH0cV0Xh1rF1W*)qMToQjVklCj zw}jqgC4>MWR3QOWAfbg`1A+U6J@+r%b8gN_=9_0G@4W9jGvCbf{9|gYFYwFxUjP6Q zFt~fi3;?)c;B(%I>0+)sf*_ZVnf`5{q(^KPtZ=(( z8)*YTIht?J=@`F)NhKVLc#zi~%kAAP5Vb<9ga`fggkS5404(k7OCAtfW{Y9wf$aE_R>FA3IA*?9 z9Rz`Kk4&2N45Z-wL`HFa$41?MI>Ic%ZdwOC14 zIe>`3j6`c zg~WM}!=6o@?~~M3LPG~vyl&*PIRo`NSkpJr-u)XCU*y8+F$oaT65n57ZU3P2@o)@f z2wH#MwBDz1LrnNMjT(y#G{4`7OhheM12$?CW6%vJ+KKX1bC!war5Kd0Ca=0O!0{4GkOi&gVJydVr`~wZqlm~riS!MFi zRg_uqs;6m&+HY=cm3~2g8yVp&lNN7wP8rnbdu%fpLfGIbWD$`<`3teRV9g0>NPoHf zkw~XE_)#u$`6vW|{RX0rJKPYNgx<-$y@mxQ)2M;=^{XzYH-=mwFSE|tnE#xq-w?c2 z0zv>uYTGLI-XqrXk2d2Z4Gj%B5Nlbr?(sj?H@!03pJ$weTB92wR;LUOEtn7pzhqOh z3MVHgIe9LMh(TZJXL6cSbqItwKj!B4-i{Aq<>%pm7NC31JUl#D`J~=UKRCHBQwx=r z?cU!H$(w$5D#$q*oZ7L4#YIfD=fwWbL03F|?Ki;g1Pqh^Y{n}v&TBi%PJm7_eus4QFn=rk|`}FHGirGHaA*|WF3c-0=9{*snIeuwn zlHg*uicH23;KML8=A?mZnb%m=vQV5b8 zahCVy2O++lU|NA(w`k}hW0Ogp{`vFg9Nq_Fx5$%0_HI!Ma!gQaK?odc!jOO2!CL1b zUZL|$(tFm`Ke9WQCtj-wN!%*y69;6jY}dpJ{ZJ)gDo;-KbX-p8hzA=T^#U9!4}}&nu(7 z)~qGb1cm0kRrBQ${!HNzpv=$)g1r29M`WCQafwl$Ub~o7a)&4@`+7lb_iORmJy~XP z+g5+oOV%}D;6iCF`~x)5=XZEX!|>qd+H4zanjMft5{S$mC`*WMEC*n6_hi z0#yQfGqtafU@4t5>fZP4ano=f%34?8%VKeeZNzjV&V)K{0j@mPiNR_pTZ zLRs=GE33KRt~7m@y*}G-Iov&o>x7#dO5+-FiQme8yA>=E(NIw`IQ@KCv#E*()OkIsEctT_uRo{*Ly6nfmzDBJFslfoN zH^sa##XS9_L>txxh_Kji04mNYBFj6s8a|GGU0>PIKHcKCzM(OO>gF=9{J6c$o(le4 z1iS7bvg!oq>8Q20*mQ47PrM#sv!P^Zus8|sp=V5J7c|>P^7p>w$v8L>>KaT(2@%Ek zm5G!0sjzOtUZ4g4twzK$$u32=@k}_taNkIVY3v(*W|lNO!4ZEEfKQOztt%UPaK*pH zC*tc$#uEp1yhjYSuGgvQ`!ph#W@g;xP|h1~pZ8axtewr1w0kKC-SX$;DwIc|-$O!y zJX~|weDq&)yEE2^C+jY^U zY)p9WrAr4Ai|rjEGkeXmxygjF`he016@S%K?C>CMBAiF)iTkigwN@Q3b<>mPqO>!4 zH9|U-fINExh$x?$Qm>G84 z43^HB=~V0YXu%Mx*}%FHRZQYKt(yWp_*#L%b=?xJWj93R_IX`jeCOL^K~_h&dMH(o z(a72IZ(WS5u!I0x9s|5IHO?6GoLU2)8x_&P>ViHgYbxg|{gGA7;7upnvxJ!uw%#xyC^-hL=Dr@_gb~bmK*xwEpU}*;mlC(I zOJ^9(ZkuwZ(0pu#f`6+uF?Fv~&GINqH*C}Av({wGH1yPAPwX&IAMYtu71?Ho6dn4^ z%nX_F^r}y1HtF%nAX`5xfr-2x3%~+C*`I=VMoYoNQe29P%?#mYI6s4I(M)E=Y(>YG zo}cP2ZD^x6N7RXi!rKMd67-V@Kfu#u!q(H)l_)C?fsfrlOr!=h*B7mNt4@2(?fUqN zs>3QC(u&Bl`18ZM%H6Uu{QnywbtTq|{24|Pd9Q1s3~Z;3szKWub6xCT;s?d*ijoye zX|6VT9IJL!OrM?#1(w7h9t*dV&1%;eB8_{poN6W?V|Fz3a!8XsSaqzrp0~p+tS(?_ zyvt4!xK`*Mj{b3`v+0AM!ObwE*l-qpx>`yubQD_d^d;WhxM5^dt$v{wNn8CG)nGDR z2d9qsN%uxYMR_(s=R+8b)Z;JBhZLn=F)waa&!I-ETxKKFBctT6qym?I=tl%zc}-#p zL`rw_V)>(q)4~{8VLYH^87iGv@cZ^nb#)m4H87-ctvE_{I*8fst zy(vAW-`3_?p^36bz;A3X*B%XfXfBEzXyG}Tfo>PTSvh-zyOPt41dQnAojW>?{n3Jm zheM1Q3NKxs!2-hkP9cG^2ZiT6R=_g{cN{{3-L=_VCV5c<=7;2Xl70QR7RO5Wn~O5# zc~v8i_TF=zL-4k2Jzy5dE5DEwo=KI}tbePDSq-XrtCa(fBa3CotzCfA`fyQV&N1pr z4sHLA7m>j;sw9GSIk}^v;tMa}o-_G4T%=!c-AMAHxU$Ln-ZQ^B_w~D!{^oVC&j#7a z0N}hgmcwL;2;U$*oyh)dne^ZyoD z1Ru$O4f-Q(ZEX{p3Y`q>9fRMAzU@2n=w5u;WuBEbZ>@C498#L#*|8rDqa)tM#Kfo-r^RVW%EUSE#-P!BslRKs8S!PW20MT8 z16W0)-?Jh%303dZQ@Pf^x|#mE<`2Dm&P}wFvf+1qm~$5dFG_A2j(<8*&fJ}*oP6{^(0-x`MGb0n;T9O_8F1TS3Qq3TRg=kFA?|?_Yk{;TRQ<+xO((Mui?$_|kvzPU+FIvi`3yI% z^7#F%K7qYqzDr_4YkVX^K(y^whw4`Vp-O&catL zM8Vb>Ev-Cej`27w(d1@%2iJXjLaOl_CxqR{GbhrqSUW!zUyb_o-49aE#+HV|C4V=> zxbF12K<-Eu5#f@1$+*01~eUSL4Iw z)Y1a))9M4rqUvR_-lqM~X8r#1^1sDoag8xT0hg*8hw}J7S&v+%V!|%21>f*4ODK77 zTk_{wZI5R77a|smEyXMO1mAcW?4jZla@lcaRFwkFbUS6{JIJl``3EZImdD7Ft`zSZ z1K|%wd`FXVc-esC2hziN@T5q>o%`6>Acj1*I5=6FU^btxePN~h8GU}ZG${xYell|d zhZx%}cmQ!fi3CRsIoMtQ_D4kSmVaHEXjZ@(Y{$CroeHZm z`r`zM+ZMvM^J@ncl{Wb}qKjk0TsWFPzUmtU2ajc%hIPc+=TlEL} zHey#6B$YveA2ti#p6||3wurOBfenbYT(A$&5AUAJZR;VENg&gl&5|-nJHZJgBdeGn zCMYP_NhBJ~rpl57m&O}8HhtG7GXzN(;)__DYLCR`{f*Kbll{%=W^o>0sk-y{-=)8pgg?V84h z(mCMmQ91`)VTG1{B2tBo&b8F~fF+E!qu1ceSOYzBPfsUUFR8mlPdx1`0Yh4WNi6Yb zw*E`9I^_p6iUtLTTUP#0T#@rZf;C`J`2R^^xV)0Xad?0c^_`=@*n#K{x!h$|xQdMC;Q5-EKpWwCst#-#G zq8?edBMJf;WSG#L@jj?^IoFU1IkVFnO6b<~k7&xD=L|Yi52|@D)&h3CW<(Fp4?x0M zhbq^4zo(1auSr-8-$(wr46q-tPI_9qxVe4bX1UxF)ZPx4Z?8}~srO`3drvaoQquf# z8NwL&diZRfhkV}71uIZ)%BF}{jpUvT2xW`17RC_9+BJlnXhIrGhU|0fF_t2R zY=fa@#u7InjEI@c&|K%ueRc1P=lT79&*%60`=mQLS_=!x2m%0vZLV5e2Y@5+$m{X* z9&OTEW6hBWJiK}<0stZLzlQ_7d?j^s5PZTScDj}aWn`B-}nU&B%j0y)mknF>w zQ?@rQqbVIK_{b%O^DezYv{i+@HAruVbwJMx#q{7xp2}Yx} z$+LJVN#%drwtg;pxH=yT-P06mv68Eki4?<+O8X++Lsj98rPv*9#cb+vKUO8Bn7(b&=tDbP`u!96+sMJm z*SjUTLsAK2fJ`lUn#Hy8IlVUfyVrJYQ(s#PBXBEpxSKYs&UFdaK>}k2ll!zFVs&Qg-V~FTj}!wD?R`XN}8ftJu8sM+%?`7}VarjXxflO)LM@%HCzUS1*pQ-tweF;<64hoL5lt=a;4_B!4N+uTvtD3H>1Ni4DmmV~5?xAnvo zR}C6uhFz76CDW+-??h5x3_OK4*~YB1FnK%em@iJd;U*D(tz@sr{qQ^4#ud4>y@RZc zw`GPUom6Y@T-eOLiT54OTY+sx_y*LRBn{JsX3X#e4+4=H?3tEpPU-UC3vC-7lDIS= zS6grV2IoHwCqKzts?Lr>TcdTX!lqF;aG+o%d8>={VR3ttNfA#FopgOg=~?f~>xhgQ zRxsE}5>--Hi%{#WLoFn%LA=}ude}U-bNkT-$ou^+f|wUN%)2*rY%6Kq50ng0!N3-ID8F7IA8Z50o%|6{i1By!{^ru9Or>fKxZ8 zgjHUOf>Vx4WwHU)zDEG9B9rFNU`RW=5QkLOFb_x@a-Jl5oqpszWmE0V0bWnqYyXY( z0+`~EIa5C*&>ke7d)&JF1EW;fg&BFYl*8=JwSHa=1&M{~6BA$EDzPrBs~hGa*p=pr sM<}Mb7fu3v8L)#lhB=7WabQ>?HwVQW`;ExHM-L3xSUOtNU-3%*4+MOEXaE2J literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Kakao Login@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_kakao_login.imageset/Kakao Login@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a87ee34f5919b1994d3cf9860ee00fd80e486cea GIT binary patch literal 3526 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 Date: Mon, 3 Apr 2023 23:56:01 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[Feat]=20#123=20-=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runnect-iOS.xcodeproj/project.pbxproj | 4 ++++ .../Global/Utils/RNUtils/UserManager.swift | 16 ++++++---------- .../ResponseDto/GetNewTokenResponseDto.swift | 15 +++++++++++++++ .../Runnect-iOS/Network/Router/AuthRouter.swift | 9 +++++++++ .../SignIn/VC/SignInSocialLoginVC.swift | 5 ++--- .../Presentation/Splash/VC/SplashVC.swift | 11 ++++++++++- 6 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 Runnect-iOS/Runnect-iOS/Network/Dto/SignInDto/ResponseDto/GetNewTokenResponseDto.swift diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index a8ffdaee..ebf39e47 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ CE0D9FD329648DA300CEB5CD /* CustomAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0D9FD229648DA300CEB5CD /* CustomAlertVC.swift */; }; CE10065529680F7000FD31FB /* DepartureSearchingResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE10065429680F7000FD31FB /* DepartureSearchingResponseDto.swift */; }; CE1006572968230800FD31FB /* DepartureLocationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1006562968230800FD31FB /* DepartureLocationModel.swift */; }; + CE102C4829DB1D6B00E23E69 /* GetNewTokenResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE102C4729DB1D6B00E23E69 /* GetNewTokenResponseDto.swift */; }; CE146770296568DC00DCEA1B /* RunTrackingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE14676F296568DC00DCEA1B /* RunTrackingVC.swift */; }; CE14677829658C7200DCEA1B /* Stopwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE14677729658C7200DCEA1B /* Stopwatch.swift */; }; CE14677A2965A80700DCEA1B /* CustomBottomSheetVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1467792965A80700DCEA1B /* CustomBottomSheetVC.swift */; }; @@ -180,6 +181,7 @@ CE10065229680D4400FD31FB /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; CE10065429680F7000FD31FB /* DepartureSearchingResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DepartureSearchingResponseDto.swift; sourceTree = ""; }; CE1006562968230800FD31FB /* DepartureLocationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DepartureLocationModel.swift; sourceTree = ""; }; + CE102C4729DB1D6B00E23E69 /* GetNewTokenResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNewTokenResponseDto.swift; sourceTree = ""; }; CE14676F296568DC00DCEA1B /* RunTrackingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunTrackingVC.swift; sourceTree = ""; }; CE14677729658C7200DCEA1B /* Stopwatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stopwatch.swift; sourceTree = ""; }; CE1467792965A80700DCEA1B /* CustomBottomSheetVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomBottomSheetVC.swift; sourceTree = ""; }; @@ -373,6 +375,7 @@ isa = PBXGroup; children = ( A3D1A77D29CF09B600DD54EC /* SignInResponseDto.swift */, + CE102C4729DB1D6B00E23E69 /* GetNewTokenResponseDto.swift */, ); path = ResponseDto; sourceTree = ""; @@ -1391,6 +1394,7 @@ CE6655E6295D887F00C64E12 /* UIStackView+.swift in Sources */, A3BC2F34296303A600198261 /* GoalRewardInfoCVC.swift in Sources */, CEB8416E2962C45300BF8080 /* LocationSearchResultTVC.swift in Sources */, + CE102C4829DB1D6B00E23E69 /* GetNewTokenResponseDto.swift in Sources */, CE6655CA295D84DD00C64E12 /* UserDefaultKeyList.swift in Sources */, CE6655F2295D894D00C64E12 /* UIView+.swift in Sources */, CE9291252965C9FB0010959C /* CourseDetailInfoView.swift in Sources */, diff --git a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift index 7dae3f8f..f337129d 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift @@ -17,7 +17,7 @@ enum RNError: Error { final class UserManager { static let shared = UserManager() - private var signInProvider = MoyaProvider( + private var authProvider = MoyaProvider( plugins: [NetworkLoggerPlugin(verbose: true)] ) @@ -35,7 +35,7 @@ final class UserManager { } func signIn(token: String, provider: String, completion: @escaping(Result) -> Void) { - signInProvider.request(.signIn(token: token, provider: provider)) { [weak self] response in + authProvider.request(.signIn(token: token, provider: provider)) { [weak self] response in guard let self = self else { return } switch response { case .success(let result): @@ -64,23 +64,19 @@ final class UserManager { } } - func autoSignIn(completion: @escaping(Result) -> Void) { - guard let accessToken = self.accessToken else { return } - guard let isKakao = self.isKakao else { return } - let provider = isKakao ? "KAKAO" : "APPLE" - signInProvider.request(.signIn(token: accessToken, provider: provider)) { [weak self] response in + func getNewToken(completion: @escaping(Result) -> Void) { + authProvider.request(.getNewToken) { [weak self] response in guard let self = self else { return } switch response { case .success(let result): let status = result.statusCode if 200..<300 ~= status { do { - let responseDto = try result.map(BaseResponse.self) + let responseDto = try result.map(BaseResponse.self) guard let data = responseDto.data else { return } self.accessToken = data.accessToken self.refreshToken = data.refreshToken - self.isKakao = provider == "KAKAO" ? true : false - completion(.success(data.nickname ?? "")) + completion(.success(true)) } catch { print(error.localizedDescription) completion(.failure(.networkFail)) diff --git a/Runnect-iOS/Runnect-iOS/Network/Dto/SignInDto/ResponseDto/GetNewTokenResponseDto.swift b/Runnect-iOS/Runnect-iOS/Network/Dto/SignInDto/ResponseDto/GetNewTokenResponseDto.swift new file mode 100644 index 00000000..b30dcaf3 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Network/Dto/SignInDto/ResponseDto/GetNewTokenResponseDto.swift @@ -0,0 +1,15 @@ +// +// GetNewTokenResponseDto.swift +// Runnect-iOS +// +// Created by sejin on 2023/04/03. +// + +import Foundation + +// MARK: - GetNewTokenResponseDto + +struct GetNewTokenResponseDto: Codable { + let accessToken: String + let refreshToken: String +} diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift index 06cfc2a8..13a823a0 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift @@ -11,6 +11,7 @@ import Moya enum AuthRouter { case signIn(token: String, provider: String) + case getNewToken } extension AuthRouter: TargetType { @@ -26,6 +27,8 @@ extension AuthRouter: TargetType { switch self { case .signIn: return "/auth" + case .getNewToken: + return "/auth/getNewToken" } } @@ -33,6 +36,8 @@ extension AuthRouter: TargetType { switch self { case .signIn: return .post + case .getNewToken: + return .get } } @@ -40,6 +45,8 @@ extension AuthRouter: TargetType { switch self { case .signIn(let token, let provider): return .requestParameters(parameters: ["token": token, "provider": provider], encoding: JSONEncoding.default) + case .getNewToken: + return .requestPlain } } @@ -47,6 +54,8 @@ extension AuthRouter: TargetType { switch self { case .signIn: return Config.defaultHeader + case .getNewToken: + return Config.headerWithAccessToken } } } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift index 5e4f5e99..5509f4c9 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/SignInSocialLoginVC.swift @@ -193,9 +193,8 @@ extension SignInSocialLoginVC: ASAuthorizationControllerPresentationContextProvi UserManager.shared.signIn(token: tokeStr, provider: "APPLE") { [weak self] result in switch result { - case .success(let nickname): - print(nickname) - self?.pushToNickNameSetUpVC() + case .success(let type): + type == "Signup" ? self?.pushToNickNameSetUpVC() : self?.pushToTabBarController() case .failure(let error): print(error) self?.showNetworkFailureToast() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift index b8dc1c89..a3eea8ea 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift @@ -41,8 +41,17 @@ extension SplashVC { private func checkDidSignIn() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { if UserManager.shared.hasAccessToken { + UserManager.shared.getNewToken { [weak self] result in + switch result { + case .success(let _): + print("SplashVC - 토큰 재발급 성공") + self?.pushToTabBarController() + case .failure(let error): + print(error) + self?.pushToSignInView() + } + } // accessToken 재발급 - self.pushToTabBarController() } else { self.pushToSignInView() } From c4d28ae31c49ca635b08b4cf179dd9e6ba4edb6f Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Tue, 4 Apr 2023 00:11:33 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[Chore]=20#123=20-=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EB=B0=9C=EA=B2=AC=EC=9D=98=20+=20=EB=B2=84=ED=8A=BC=EC=9D=84?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=93=9C=ED=95=98=EA=B8=B0=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/VC/CourseDiscoveryVC.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift index 4686de86..332f1fb7 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift @@ -32,8 +32,8 @@ final class CourseDiscoveryVC: UIViewController { $0.setImage(ImageLiterals.icSearch, for: .normal) $0.tintColor = .g1 } - private let plusButton = UIButton(type: .system).then { - $0.setImage(ImageLiterals.icPlus, for: .normal) + private let uploadButton = CustomButton(title: "업로드하기").then { + $0.layer.cornerRadius = 20 } // MARK: - collectionview @@ -88,10 +88,8 @@ extension CourseDiscoveryVC { } private func setAddTarget() { - self.searchButton.addTarget(self, action: #selector(pushToSearchVC), for: .touchUpInside) - self.plusButton.addTarget(self, action: #selector(pushToDiscoveryVC), for: .touchUpInside) - + self.uploadButton.addTarget(self, action: #selector(pushToDiscoveryVC), for: .touchUpInside) } } @@ -128,17 +126,19 @@ extension CourseDiscoveryVC { private func layout() { view.backgroundColor = .w1 mapCollectionView.backgroundColor = .w1 - view.addSubviews(plusButton, mapCollectionView) - view.bringSubviewToFront(plusButton) + view.addSubviews(uploadButton, mapCollectionView) + view.bringSubviewToFront(uploadButton) mapCollectionView.snp.makeConstraints { $0.top.equalTo(self.navibar.snp.bottom) $0.leading.bottom.trailing.equalTo(view.safeAreaLayoutGuide) } - plusButton.snp.makeConstraints { make in + uploadButton.snp.makeConstraints { make in make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(16) make.bottom.equalTo(self.view.safeAreaLayoutGuide).inset(20) + make.height.equalTo(40) + make.width.equalTo(136) } } } From 9a95b2005bb8a4af80df1d50eb83fb054f4cefa6 Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Wed, 5 Apr 2023 00:34:00 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[Feat]=20#123-=20Retrier=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runnect-iOS.xcodeproj/project.pbxproj | 4 ++ .../Global/Utils/RNUtils/UserManager.swift | 1 + .../Network/Service/AuthInterceptor.swift | 67 +++++++++++++++++++ .../Presentation/Splash/VC/SplashVC.swift | 12 +--- 4 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index ebf39e47..3684f590 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ CE10065529680F7000FD31FB /* DepartureSearchingResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE10065429680F7000FD31FB /* DepartureSearchingResponseDto.swift */; }; CE1006572968230800FD31FB /* DepartureLocationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1006562968230800FD31FB /* DepartureLocationModel.swift */; }; CE102C4829DB1D6B00E23E69 /* GetNewTokenResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE102C4729DB1D6B00E23E69 /* GetNewTokenResponseDto.swift */; }; + CE102C4A29DBAD3D00E23E69 /* AuthInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE102C4929DBAD3D00E23E69 /* AuthInterceptor.swift */; }; CE146770296568DC00DCEA1B /* RunTrackingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE14676F296568DC00DCEA1B /* RunTrackingVC.swift */; }; CE14677829658C7200DCEA1B /* Stopwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE14677729658C7200DCEA1B /* Stopwatch.swift */; }; CE14677A2965A80700DCEA1B /* CustomBottomSheetVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1467792965A80700DCEA1B /* CustomBottomSheetVC.swift */; }; @@ -182,6 +183,7 @@ CE10065429680F7000FD31FB /* DepartureSearchingResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DepartureSearchingResponseDto.swift; sourceTree = ""; }; CE1006562968230800FD31FB /* DepartureLocationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DepartureLocationModel.swift; sourceTree = ""; }; CE102C4729DB1D6B00E23E69 /* GetNewTokenResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetNewTokenResponseDto.swift; sourceTree = ""; }; + CE102C4929DBAD3D00E23E69 /* AuthInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInterceptor.swift; sourceTree = ""; }; CE14676F296568DC00DCEA1B /* RunTrackingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunTrackingVC.swift; sourceTree = ""; }; CE14677729658C7200DCEA1B /* Stopwatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stopwatch.swift; sourceTree = ""; }; CE1467792965A80700DCEA1B /* CustomBottomSheetVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomBottomSheetVC.swift; sourceTree = ""; }; @@ -894,6 +896,7 @@ isa = PBXGroup; children = ( CE6655BE295D82E200C64E12 /* .gitkeep */, + CE102C4929DBAD3D00E23E69 /* AuthInterceptor.swift */, ); path = Service; sourceTree = ""; @@ -1337,6 +1340,7 @@ CE6655FE295D912300C64E12 /* calculateTopInset.swift in Sources */, CEEC6B492961C5E200D00E1E /* SplashVC.swift in Sources */, CE6655D0295D85FF00C64E12 /* CancelBag.swift in Sources */, + CE102C4A29DBAD3D00E23E69 /* AuthInterceptor.swift in Sources */, A3BC2F432966A93100198261 /* CourseDetailVC.swift in Sources */, DAD5A3D8296C6D9600C8166B /* AdImageCollectionViewCell.swift in Sources */, CE18E890296C76C100FEB569 /* RNLocationModel.swift in Sources */, diff --git a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift index f337129d..6e971823 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift @@ -18,6 +18,7 @@ final class UserManager { static let shared = UserManager() private var authProvider = MoyaProvider( + session: Moya.Session(interceptor: AuthRetrier.shared), plugins: [NetworkLoggerPlugin(verbose: true)] ) diff --git a/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift b/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift new file mode 100644 index 00000000..de4c9a2c --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift @@ -0,0 +1,67 @@ +// +// AuthInterceptor.swift +// Runnect-iOS +// +// Created by sejin on 2023/04/04. +// + +import Foundation + +import Alamofire +import Moya + +final class AuthRetrier: Retrier { + + static let shared = AuthRetrier() + + private init() { + super.init { request, _, error, completion in + print("인잇") + guard let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 else { + completion(.doNotRetry) + return + } + UserManager.shared.getNewToken { result in + switch result { + case .success: + print("토큰 재발급 성공") + completion(.retry) + case .failure(let error): + print("실패실패") + completion(.doNotRetryWithError(error)) + } + } + } + } +} + +/// 토큰 만료 시 자동으로 refresh를 위한 서버 통신 +final class AuthInterceptor: RequestInterceptor { + + static let shared = AuthInterceptor() + + private init() {} + + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + completion(.success(urlRequest)) + } + + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + print("retry 진입") + guard let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 + else { + completion(.doNotRetryWithError(error)) + return + } + + UserManager.shared.getNewToken { result in + switch result { + case .success: + print("토큰 재발급 성공") + completion(.retry) + case .failure(let error): + completion(.doNotRetryWithError(error)) + } + } + } +} diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift index a3eea8ea..228ab8a5 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift @@ -41,17 +41,7 @@ extension SplashVC { private func checkDidSignIn() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { if UserManager.shared.hasAccessToken { - UserManager.shared.getNewToken { [weak self] result in - switch result { - case .success(let _): - print("SplashVC - 토큰 재발급 성공") - self?.pushToTabBarController() - case .failure(let error): - print(error) - self?.pushToSignInView() - } - } - // accessToken 재발급 + self.pushToTabBarController() } else { self.pushToSignInView() } From bac0e1933359c2c3a39735229f80433322a23354 Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Wed, 5 Apr 2023 17:57:11 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[Feat]=20#123=20-=20AuthInterceptor=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Utils/RNUtils/UserManager.swift | 1 - .../Network/Router/PublicCourseRouter.swift | 6 ++- .../Network/Service/AuthInterceptor.swift | 52 +++++++------------ .../Views/VC/CourseDiscoveryVC.swift | 1 + .../Presentation/Splash/VC/SplashVC.swift | 13 ++++- 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift index 6e971823..f337129d 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift @@ -18,7 +18,6 @@ final class UserManager { static let shared = UserManager() private var authProvider = MoyaProvider( - session: Moya.Session(interceptor: AuthRetrier.shared), plugins: [NetworkLoggerPlugin(verbose: true)] ) diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift index 57b20f0b..c52c8bd3 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift @@ -59,7 +59,11 @@ extension PublicCourseRouter: TargetType { var headers: [String: String]? { switch self { default: - return Config.headerWithAccessToken + return Config.defaultHeader } } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift b/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift index de4c9a2c..32017703 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Service/AuthInterceptor.swift @@ -10,42 +10,29 @@ import Foundation import Alamofire import Moya -final class AuthRetrier: Retrier { - - static let shared = AuthRetrier() - - private init() { - super.init { request, _, error, completion in - print("인잇") - guard let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 else { - completion(.doNotRetry) - return - } - UserManager.shared.getNewToken { result in - switch result { - case .success: - print("토큰 재발급 성공") - completion(.retry) - case .failure(let error): - print("실패실패") - completion(.doNotRetryWithError(error)) - } - } - } - } -} - -/// 토큰 만료 시 자동으로 refresh를 위한 서버 통신 +///// 토큰 만료 시 자동으로 refresh를 위한 서버 통신 final class AuthInterceptor: RequestInterceptor { - + static let shared = AuthInterceptor() - + private init() {} - + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + guard urlRequest.url?.absoluteString.hasPrefix(Config.baseURL) == true, + let accessToken = UserManager.shared.accessToken, + let refreshToken = UserManager.shared.refreshToken + else { + completion(.success(urlRequest)) + return + } + + var urlRequest = urlRequest + urlRequest.setValue(accessToken, forHTTPHeaderField: "accessToken") + urlRequest.setValue(refreshToken, forHTTPHeaderField: "refreshToken") + print("adator 적용 \(urlRequest.headers)") completion(.success(urlRequest)) } - + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { print("retry 진입") guard let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 @@ -53,13 +40,14 @@ final class AuthInterceptor: RequestInterceptor { completion(.doNotRetryWithError(error)) return } - + UserManager.shared.getNewToken { result in switch result { case .success: - print("토큰 재발급 성공") + print("Retry-토큰 재발급 성공") completion(.retry) case .failure(let error): + // 세션 만료 -> 로그인 화면으로 전환 completion(.doNotRetryWithError(error)) } } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift index 332f1fb7..82e85742 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift @@ -16,6 +16,7 @@ final class CourseDiscoveryVC: UIViewController { // MARK: - Properties private let PublicCourseProvider = MoyaProvider( + session: Moya.Session(interceptor: AuthInterceptor.shared), plugins: [NetworkLoggerPlugin(verbose: true)] ) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift index 228ab8a5..621e5052 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Splash/VC/SplashVC.swift @@ -11,7 +11,7 @@ import SnapKit import Then final class SplashVC: UIViewController { - + // MARK: - UI Components private let backgroundImageView = UIImageView().then { @@ -41,7 +41,16 @@ extension SplashVC { private func checkDidSignIn() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { if UserManager.shared.hasAccessToken { - self.pushToTabBarController() + UserManager.shared.getNewToken { [weak self] result in + switch result { + case .success: + print("SplashVC-토큰 재발급 성공") + self?.pushToTabBarController() + case .failure(let error): + print(error) + self?.pushToSignInView() + } + } } else { self.pushToSignInView() } From 60da78e6b24e162a13e022f2731321bf8bf78b8a Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Wed, 5 Apr 2023 18:10:10 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[Feat]=20#123=20-=20Provider=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=ED=86=A4=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runnect-iOS.xcodeproj/project.pbxproj | 4 +++ .../Network/Service/Providers.swift | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 Runnect-iOS/Runnect-iOS/Network/Service/Providers.swift diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index 3684f590..4aeb993e 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -132,6 +132,7 @@ CEC2A6902962B06C00160BF7 /* convertLocationObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC2A68F2962B06C00160BF7 /* convertLocationObject.swift */; }; CEC2A6922962BE2900160BF7 /* DepartureSearchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC2A6912962BE2900160BF7 /* DepartureSearchVC.swift */; }; CECA695C296E61D6002AF05C /* PrivateCourseNotUploadedResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECA695B296E61D6002AF05C /* PrivateCourseNotUploadedResponseDto.swift */; }; + CEE59FDA29DD6F7D00C791F1 /* Providers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE59FD929DD6F7D00C791F1 /* Providers.swift */; }; CEEC6B3A2961C4F300D00E1E /* CourseDrawingHomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC6B392961C4F300D00E1E /* CourseDrawingHomeVC.swift */; }; CEEC6B3C2961C51A00D00E1E /* CourseStorageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC6B3B2961C51A00D00E1E /* CourseStorageVC.swift */; }; CEEC6B3E2961C53700D00E1E /* CourseDiscoveryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC6B3D2961C53700D00E1E /* CourseDiscoveryVC.swift */; }; @@ -287,6 +288,7 @@ CEC2A68F2962B06C00160BF7 /* convertLocationObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = convertLocationObject.swift; sourceTree = ""; }; CEC2A6912962BE2900160BF7 /* DepartureSearchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DepartureSearchVC.swift; sourceTree = ""; }; CECA695B296E61D6002AF05C /* PrivateCourseNotUploadedResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateCourseNotUploadedResponseDto.swift; sourceTree = ""; }; + CEE59FD929DD6F7D00C791F1 /* Providers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Providers.swift; sourceTree = ""; }; CEEC6B392961C4F300D00E1E /* CourseDrawingHomeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseDrawingHomeVC.swift; sourceTree = ""; }; CEEC6B3B2961C51A00D00E1E /* CourseStorageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseStorageVC.swift; sourceTree = ""; }; CEEC6B3D2961C53700D00E1E /* CourseDiscoveryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseDiscoveryVC.swift; sourceTree = ""; }; @@ -897,6 +899,7 @@ children = ( CE6655BE295D82E200C64E12 /* .gitkeep */, CE102C4929DBAD3D00E23E69 /* AuthInterceptor.swift */, + CEE59FD929DD6F7D00C791F1 /* Providers.swift */, ); path = Service; sourceTree = ""; @@ -1319,6 +1322,7 @@ CE17F0382961BF8B00E1DED0 /* FontLiterals.swift in Sources */, CE6655E8295D889600C64E12 /* UISwitch+.swift in Sources */, CE0C23772966D64D00B45063 /* PageCVC.swift in Sources */, + CEE59FDA29DD6F7D00C791F1 /* Providers.swift in Sources */, CE5875A029601500005D967E /* Toast.swift in Sources */, CE40BB1E2968054F0030ABCA /* BaseResponse.swift in Sources */, CE14677C2965C1B100DCEA1B /* RunningRecordVC.swift in Sources */, diff --git a/Runnect-iOS/Runnect-iOS/Network/Service/Providers.swift b/Runnect-iOS/Runnect-iOS/Network/Service/Providers.swift new file mode 100644 index 00000000..eeb361cc --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Network/Service/Providers.swift @@ -0,0 +1,32 @@ +// +// Providers.swift +// Runnect-iOS +// +// Created by sejin on 2023/04/05. +// + +import Foundation + +import Moya + +struct Providers { + static let departureSearchingProvider = MoyaProvider(withAuth: false) + static let authProvider = MoyaProvider(withAuth: true) + static let userProvider = MoyaProvider(withAuth: true) + static let courseProvider = MoyaProvider(withAuth: true) + static let publicCourseProvider = MoyaProvider(withAuth: true) + static let recordProvider = MoyaProvider(withAuth: true) + static let scrapProvider = MoyaProvider(withAuth: true) + static let stampProvider = MoyaProvider(withAuth: true) +} + +extension MoyaProvider { + convenience init(withAuth: Bool) { + if withAuth { + self.init(session: Session(interceptor: AuthInterceptor.shared), + plugins: [NetworkLoggerPlugin(verbose: true)]) + } else { + self.init() + } + } +} From 2b0abe99f1efd079915378ef983a6232dfc90233 Mon Sep 17 00:00:00 2001 From: Sejin Lee Date: Wed, 5 Apr 2023 18:31:45 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[Refactor]=20#123=20-=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=9D=98=20Provider=EB=93=A4=EC=9D=84=20=EC=8B=B1=EA=B8=80?= =?UTF-8?q?=ED=86=A4=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Utils/RNUtils/UserManager.swift | 4 +--- .../Runnect-iOS/Network/Router/AuthRouter.swift | 8 +++++--- .../Runnect-iOS/Network/Router/CourseRouter.swift | 10 ++++++---- .../Network/Router/PublicCourseRouter.swift | 7 ++++++- .../Runnect-iOS/Network/Router/RecordRouter.swift | 6 +++++- .../Runnect-iOS/Network/Router/ScrapRouter.swift | 6 +++++- .../Runnect-iOS/Network/Router/StampRouter.swift | 8 ++++++-- .../Runnect-iOS/Network/Router/UserRouter.swift | 6 +++++- .../CourseDetail/VC/CourseDetailVC.swift | 12 +++--------- .../CourseDiscovery/Views/VC/CourseDiscoveryVC.swift | 9 ++------- .../CourseDiscovery/Views/VC/CourseSearchVC.swift | 8 ++------ .../CourseDiscovery/Views/VC/CourseUploadVC.swift | 5 ++--- .../CourseDiscovery/Views/VC/MyCourseSelectVC.swift | 4 +--- .../CourseDrawing/VC/CourseDrawingVC.swift | 4 +--- .../CourseDrawing/VC/DepartureSearchVC.swift | 4 +--- .../CourseStorage/VC/CourseStorageVC.swift | 8 ++------ .../MyPage/VC/InfoVC/ActivityRecordInfoVC.swift | 4 +--- .../MyPage/VC/InfoVC/GoalRewardInfoVC.swift | 4 +--- .../MyPage/VC/InfoVC/UploadedCourseInfoVC.swift | 4 +--- .../Presentation/MyPage/VC/MyPageVC.swift | 4 +--- .../Presentation/MyPage/VC/NicknameEditorVC.swift | 4 +--- .../Presentation/Running/VC/RunningRecordVC.swift | 4 +--- .../Presentation/Running/VC/RunningWaitingVC.swift | 8 ++------ .../Presentation/SignIn/VC/NickNameSetUpVC.swift | 4 +--- 24 files changed, 62 insertions(+), 83 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift index f337129d..861e77d3 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Utils/RNUtils/UserManager.swift @@ -17,9 +17,7 @@ enum RNError: Error { final class UserManager { static let shared = UserManager() - private var authProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var authProvider = Providers.authProvider @UserDefaultWrapper(key: "accessToken") public var accessToken @UserDefaultWrapper(key: "refreshToken") public var refreshToken diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift index 13a823a0..17254689 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/AuthRouter.swift @@ -52,10 +52,12 @@ extension AuthRouter: TargetType { var headers: [String: String]? { switch self { - case .signIn: + case .signIn, .getNewToken: return Config.defaultHeader - case .getNewToken: - return Config.headerWithAccessToken } } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/CourseRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/CourseRouter.swift index dd36f92a..ca17dfe5 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/CourseRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/CourseRouter.swift @@ -89,11 +89,13 @@ extension CourseRouter: TargetType { var headers: [String: String]? { switch self { case .uploadCourseDrawing: - return ["Content-Type": "multipart/form-data", - "accessToken": Config.accessToken, - "refreshToken": Config.refreshToken] + return ["Content-Type": "multipart/form-data"] default: - return Config.headerWithAccessToken + return Config.defaultHeader } } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift index c52c8bd3..57143719 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift @@ -7,6 +7,7 @@ import Foundation import Moya + enum PublicCourseRouter { case getCourseData case getCourseSearchData(keyword: String) @@ -16,12 +17,14 @@ enum PublicCourseRouter { } extension PublicCourseRouter: TargetType { + var baseURL: URL { guard let url = URL(string: Config.baseURL) else {fatalError("baseURL could not be configured") } return url } + var path: String { switch self { case .getCourseData, .courseUploadingData: @@ -34,6 +37,7 @@ extension PublicCourseRouter: TargetType { return "/public-course/user" } } + var method: Moya.Method { switch self { case .getCourseData, .getCourseSearchData, .getUploadedCourseDetail, .getUploadedCourseInfo: @@ -41,8 +45,8 @@ extension PublicCourseRouter: TargetType { case .courseUploadingData: return .post } - } + var task: Moya.Task { switch self { case .getCourseSearchData(let keyword): @@ -56,6 +60,7 @@ extension PublicCourseRouter: TargetType { return .requestPlain } } + var headers: [String: String]? { switch self { default: diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/RecordRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/RecordRouter.swift index 3f896268..c635164c 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/RecordRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/RecordRouter.swift @@ -57,7 +57,11 @@ extension RecordRouter: TargetType { var headers: [String: String]? { switch self { case .recordRunning, .getActivityRecordInfo: - return Config.headerWithAccessToken + return Config.defaultHeader } } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/ScrapRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/ScrapRouter.swift index fc23a636..8f0ca82d 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/ScrapRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/ScrapRouter.swift @@ -53,7 +53,11 @@ extension ScrapRouter: TargetType { var headers: [String: String]? { switch self { case .createAndDeleteScrap, .getScrapCourse: - return Config.headerWithAccessToken + return Config.defaultHeader } } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/StampRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/StampRouter.swift index 36b09646..cb25ae3f 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/StampRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/StampRouter.swift @@ -46,7 +46,11 @@ extension StampRouter: TargetType { var headers: [String: String]? { switch self { case .getGoalRewardInfo: - return Config.headerWithAccessToken + return Config.defaultHeader } - } + } + + var validationType: ValidationType { + return .successCodes + } } diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/UserRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/UserRouter.swift index 9da8a5be..b3bcce38 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/UserRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/UserRouter.swift @@ -49,6 +49,10 @@ extension UserRouter: TargetType { } var headers: [String: String]? { - return Config.headerWithAccessToken + return Config.defaultHeader + } + + var validationType: ValidationType { + return .successCodes } } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift index ce70efcb..f7b51f86 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift @@ -16,17 +16,11 @@ final class CourseDetailVC: UIViewController { // MARK: - Properties - private let scrapProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let scrapProvider = Providers.scrapProvider - private let PublicCourseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let PublicCourseProvider = Providers.publicCourseProvider - private let courseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let courseProvider = Providers.courseProvider private var courseModel: Course? diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift index 82e85742..e5e1eda2 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseDiscoveryVC.swift @@ -15,14 +15,9 @@ import Moya final class CourseDiscoveryVC: UIViewController { // MARK: - Properties - private let PublicCourseProvider = MoyaProvider( - session: Moya.Session(interceptor: AuthInterceptor.shared), - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let PublicCourseProvider = Providers.publicCourseProvider - private let scrapProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let scrapProvider = Providers.scrapProvider private var courseList = [PublicCourse]() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseSearchVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseSearchVC.swift index 9146e531..5d3d7fa4 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseSearchVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseSearchVC.swift @@ -15,13 +15,9 @@ final class CourseSearchVC: UIViewController { // MARK: - Properties - private let PublicCourseRouter = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let PublicCourseRouter = Providers.publicCourseProvider - private let scrapProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let scrapProvider = Providers.scrapProvider private var courseList = [PublicCourse]() private var keyword: String? diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseUploadVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseUploadVC.swift index 4d5eaf5f..75a4b26e 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseUploadVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/CourseUploadVC.swift @@ -15,9 +15,8 @@ class CourseUploadVC: UIViewController { // MARK: - Properties // private var runningModel: RunningModel? - private let PublicCourseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let PublicCourseProvider = Providers.publicCourseProvider + private var courseModel: Course? private let courseTitleMaxLength = 20 diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/MyCourseSelectVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/MyCourseSelectVC.swift index 902e38ca..d397bd9e 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/MyCourseSelectVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/VC/MyCourseSelectVC.swift @@ -14,9 +14,7 @@ class MyCourseSelectVC: UIViewController { // MARK: - Properties - private let courseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let courseProvider = Providers.courseProvider private var courseList = [Course]() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift index 417e95ef..a6e2456c 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift @@ -14,9 +14,7 @@ final class CourseDrawingVC: UIViewController { // MARK: - Properties - private let courseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let courseProvider = Providers.courseProvider private var departureLocationModel: DepartureLocationModel? diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift index 1ff6f618..d135000a 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift @@ -13,9 +13,7 @@ final class DepartureSearchVC: UIViewController { // MARK: - Properties - private let departureSearchingProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let departureSearchingProvider = Providers.departureSearchingProvider private var addressList = [KakaoAddressResult]() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseStorage/VC/CourseStorageVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseStorage/VC/CourseStorageVC.swift index 85de924e..e72b546b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseStorage/VC/CourseStorageVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseStorage/VC/CourseStorageVC.swift @@ -14,13 +14,9 @@ final class CourseStorageVC: UIViewController { // MARK: - Properties - private let courseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let courseProvider = Providers.courseProvider - private let scrapProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let scrapProvider = Providers.scrapProvider private let cancelBag = CancelBag() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index 5dc24c5c..eab49a64 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -15,9 +15,7 @@ final class ActivityRecordInfoVC: UIViewController { // MARK: - Properties - private var recordProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var recordProvider = Providers.recordProvider private var activityRecordList = [ActivityRecord]() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/GoalRewardInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/GoalRewardInfoVC.swift index caed83c7..ecd9e045 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/GoalRewardInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/GoalRewardInfoVC.swift @@ -14,9 +14,7 @@ import Moya final class GoalRewardInfoVC: UIViewController { // MARK: - Properties - private var stampProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var stampProvider = Providers.stampProvider var stampNameList: [GoalRewardInfoModel] = GoalRewardInfoModel.stampNameList diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/UploadedCourseInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/UploadedCourseInfoVC.swift index 4dea323a..2a13d3d7 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/UploadedCourseInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/UploadedCourseInfoVC.swift @@ -15,9 +15,7 @@ final class UploadedCourseInfoVC: UIViewController { // MARK: - Properties - private var uploadedCourseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var uploadedCourseProvider = Providers.publicCourseProvider private var uploadedCourseList = [PublicCourse]() diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift index d66fb775..e969717c 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift @@ -15,9 +15,7 @@ final class MyPageVC: UIViewController { // MARK: - Properties - private var userProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var userProvider = Providers.userProvider let stampNameImageDictionary: [String: UIImage] = GoalRewardInfoModel.stampNameImageDictionary diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift index 5bd10471..d01a8c34 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift @@ -19,9 +19,7 @@ final class NicknameEditorVC: UIViewController { // MARK: - Properties - private var userProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var userProvider = Providers.userProvider weak var delegate: NicknameEditorVCDelegate? diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningRecordVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningRecordVC.swift index c0ee546f..108df439 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningRecordVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningRecordVC.swift @@ -15,9 +15,7 @@ final class RunningRecordVC: UIViewController { private var runningModel: RunningModel? - private let recordProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let recordProvider = Providers.recordProvider private let courseTitleMaxLength = 20 diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift index 7bfa5151..c5f95be7 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift @@ -18,13 +18,9 @@ final class RunningWaitingVC: UIViewController { private var publicCourseId: Int? private var courseModel: Course? - private let courseProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let courseProvider = Providers.courseProvider - private let recordProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private let recordProvider = Providers.recordProvider // MARK: - UI Components diff --git a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/NickNameSetUpVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/NickNameSetUpVC.swift index 6006e1e7..78d08a3b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/NickNameSetUpVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/SignIn/VC/NickNameSetUpVC.swift @@ -13,9 +13,7 @@ final class NickNameSetUpVC: UIViewController { // MARK: - Properties - private var userProvider = MoyaProvider( - plugins: [NetworkLoggerPlugin(verbose: true)] - ) + private var userProvider = Providers.userProvider private let nicknameMaxLength = 7