From b0319e1d5f66108d3d1e0a611e8d67daf38c5364 Mon Sep 17 00:00:00 2001 From: linyudan <1031378945@qq.com> Date: Wed, 22 Nov 2023 17:22:04 -0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=A1=B5=E9=9D=A2=E7=9A=84UI=E5=92=8C?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=85=85=E5=80=BC?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84UI=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yinmeng-ios.xcodeproj/project.pbxproj | 16 + .../AppDelegate/AppDelegate+ThirdConfig.m | 8 + .../mew_login_apple.imageset/Contents.json | 22 + .../mew_login_apple@2x.png | Bin 0 -> 1337 bytes .../mew_login_apple@3x.png | Bin 0 -> 2118 bytes .../Contents.json | 22 + .../mew_login_full_man_normal@2x.png | Bin 0 -> 8070 bytes .../mew_login_full_man_normal@3x.png | Bin 0 -> 11266 bytes .../Contents.json | 22 + .../mew_login_full_man_select@2x.png | Bin 0 -> 9380 bytes .../mew_login_full_man_select@3x.png | Bin 0 -> 13009 bytes .../Contents.json | 22 + .../mew_login_full_waman_normal@2x.png | Bin 0 -> 8146 bytes .../mew_login_full_waman_normal@3x.png | Bin 0 -> 11113 bytes .../Contents.json | 22 + .../mew_login_full_waman_select@2x.png | Bin 0 -> 9121 bytes .../mew_login_full_waman_select@3x.png | Bin 0 -> 12805 bytes .../mew_login_line_bg.imageset/Contents.json | 22 + .../mew_login_line_bg@2x.png | Bin 0 -> 1682 bytes .../mew_login_line_bg@3x.png | Bin 0 -> 2269 bytes .../mew_login_next.imageset/Contents.json | 22 + .../mew_login_next@2x.png | Bin 0 -> 482 bytes .../mew_login_next@3x.png | Bin 0 -> 679 bytes yinmeng-ios/yinmeng-ios/Base/MVP/Api/Api.h | 8 + yinmeng-ios/yinmeng-ios/Base/MVP/Api/Api.m | 12 +- .../Base/MVP/Model/UserInfoModel.h | 2 + .../Base/Tool/IAPHelper/YMIAPHelper.h | 24 +- .../Base/Tool/IAPHelper/YMIAPHelper.m | 84 ++++ .../Login/View/MewLoginNumberViewController.h | 3 - .../Login/View/MewLoginNumberViewController.m | 32 +- .../Mew/Login/View/MewLoginViewController.m | 446 +++++++++--------- .../Login/View/SubView/MewLoginPasswordView.m | 38 +- .../Login/View/SubView/MewLoginPhoneView.m | 67 +-- .../Main/Mew/Mine/View/MewRechargeSubView.h | 7 + .../Main/Mew/Mine/View/MewRechargeSubView.m | 61 ++- .../Mew/Mine/View/MewRechargeViewController.m | 56 ++- .../Main/Tabbar/View/TabbarViewController.m | 42 +- .../Login/Presenter/LoginPasswordPresent.m | 2 + .../YinMeng/Login/Presenter/LoginPresenter.h | 2 + .../YinMeng/Login/Presenter/LoginPresenter.m | 14 + .../Login/Protocol/LoginPasswordProtocol.h | 2 + .../View/LoginForgetPasswordViewController.m | 108 ++++- .../Login/View/LoginFullInfoViewController.m | 169 +++++-- .../Main/YinMeng/Mine/Api/Api+Mine.h | 37 ++ .../Main/YinMeng/Mine/Api/Api+Mine.m | 34 ++ .../Mine/Presenter/MineRechargePresenter.h | 36 ++ .../Mine/Presenter/MineRechargePresenter.m | 80 ++++ .../Mine/Protocol/MineRechargeProtocol.h | 27 ++ .../yinmeng-ios/yinmeng-ios.entitlements | 10 + 49 files changed, 1226 insertions(+), 355 deletions(-) create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_select.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_select.imageset/mew_login_full_man_select@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_select.imageset/mew_login_full_man_select@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/mew_login_full_waman_normal@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/mew_login_full_waman_normal@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_select.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_select.imageset/mew_login_full_waman_select@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_select.imageset/mew_login_full_waman_select@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_line_bg.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_line_bg.imageset/mew_login_line_bg@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_line_bg.imageset/mew_login_line_bg@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_next.imageset/Contents.json create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_next.imageset/mew_login_next@2x.png create mode 100644 yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_next.imageset/mew_login_next@3x.png create mode 100644 yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.h create mode 100644 yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.m create mode 100644 yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Protocol/MineRechargeProtocol.h create mode 100644 yinmeng-ios/yinmeng-ios/yinmeng-ios.entitlements diff --git a/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj b/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj index 26b36ff..13eae36 100644 --- a/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj +++ b/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj @@ -184,6 +184,8 @@ 8C9C84AA2B0D930B00A601BC /* MicroNobleWaveView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C84A92B0D930B00A601BC /* MicroNobleWaveView.m */; }; 8C9C84AD2B0D9AB900A601BC /* XPRoomMessageHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C84AC2B0D9AB900A601BC /* XPRoomMessageHeaderView.m */; }; 8C9C84B12B0DEAE100A601BC /* YMIButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C84B02B0DEAE100A601BC /* YMIButton.m */; }; + 8C9C84B42B0E951200A601BC /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9C84B32B0E951200A601BC /* StoreKit.framework */; }; + 8C9C84BA2B0ECD2100A601BC /* MineRechargePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C84B92B0ECD2100A601BC /* MineRechargePresenter.m */; }; FFDAAB800AD6BB4653B4427F /* Pods_yinmeng_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1797344FB85F47F60D0CC2A0 /* Pods_yinmeng_ios.framework */; }; /* End PBXBuildFile section */ @@ -567,6 +569,11 @@ 8C9C84AC2B0D9AB900A601BC /* XPRoomMessageHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPRoomMessageHeaderView.m; sourceTree = ""; }; 8C9C84AF2B0DEAE100A601BC /* YMIButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YMIButton.h; sourceTree = ""; }; 8C9C84B02B0DEAE100A601BC /* YMIButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YMIButton.m; sourceTree = ""; }; + 8C9C84B22B0E94FA00A601BC /* yinmeng-ios.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "yinmeng-ios.entitlements"; sourceTree = ""; }; + 8C9C84B32B0E951200A601BC /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 8C9C84B82B0ECD2100A601BC /* MineRechargePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineRechargePresenter.h; sourceTree = ""; }; + 8C9C84B92B0ECD2100A601BC /* MineRechargePresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineRechargePresenter.m; sourceTree = ""; }; + 8C9C84BE2B0ED1D000A601BC /* MineRechargeProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineRechargeProtocol.h; sourceTree = ""; }; A22C3BCB2715A2E8FDECEA30 /* Pods-yinmeng-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-yinmeng-ios.release.xcconfig"; path = "Target Support Files/Pods-yinmeng-ios/Pods-yinmeng-ios.release.xcconfig"; sourceTree = ""; }; E9E8A33E3FDD457C53D1E6D7 /* Pods-yinmeng-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-yinmeng-ios.debug.xcconfig"; path = "Target Support Files/Pods-yinmeng-ios/Pods-yinmeng-ios.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -579,6 +586,7 @@ 8C9C847F2B0C6A6A00A601BC /* TXSoundTouch.xcframework in Frameworks */, 8C9C847D2B0C6A6400A601BC /* TXFFmpeg.xcframework in Frameworks */, FFDAAB800AD6BB4653B4427F /* Pods_yinmeng_ios.framework in Frameworks */, + 8C9C84B42B0E951200A601BC /* StoreKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -734,6 +742,7 @@ 8C4D534E2AFD4CF600238AE6 /* yinmeng-ios */ = { isa = PBXGroup; children = ( + 8C9C84B22B0E94FA00A601BC /* yinmeng-ios.entitlements */, 8C9C847B2B0C697F00A601BC /* Sources */, 8C9C82DE2B0C697A00A601BC /* Main */, 8C9C82DD2B0C697000A601BC /* Library */, @@ -1421,6 +1430,8 @@ 8C9C835B2B0C697A00A601BC /* YMMineSettingPresenter.m */, 8C9C835C2B0C697A00A601BC /* YMMineSettingPresenter.h */, 8C9C835D2B0C697A00A601BC /* YMMineCollectRoomPresenter.h */, + 8C9C84B82B0ECD2100A601BC /* MineRechargePresenter.h */, + 8C9C84B92B0ECD2100A601BC /* MineRechargePresenter.m */, ); path = Presenter; sourceTree = ""; @@ -1430,6 +1441,7 @@ children = ( 8C9C835F2B0C697A00A601BC /* YMMineSettingProtocol.h */, 8C9C83602B0C697A00A601BC /* YMMineCollectRoomProtocol.h */, + 8C9C84BE2B0ED1D000A601BC /* MineRechargeProtocol.h */, ); path = Protocol; sourceTree = ""; @@ -2093,6 +2105,7 @@ B603F71B608343F0E1A79C4B /* Frameworks */ = { isa = PBXGroup; children = ( + 8C9C84B32B0E951200A601BC /* StoreKit.framework */, 8C9C847E2B0C6A6A00A601BC /* TXSoundTouch.xcframework */, 8C9C847C2B0C6A6400A601BC /* TXFFmpeg.xcframework */, 1797344FB85F47F60D0CC2A0 /* Pods_yinmeng_ios.framework */, @@ -2319,6 +2332,7 @@ 8C9C84A32B0D894100A601BC /* RoomFaceSendInfoModel.m in Sources */, 8C9C84222B0C697A00A601BC /* MicroExtModel.m in Sources */, 8C9C843C2B0C697A00A601BC /* RtcManager.m in Sources */, + 8C9C84BA2B0ECD2100A601BC /* MineRechargePresenter.m in Sources */, 8C9C84182B0C697A00A601BC /* YMHomePresenter.m in Sources */, 8C9C841E2B0C697A00A601BC /* YMRoomSendTextView.m in Sources */, 8C9C843E2B0C697A00A601BC /* YMMineSettingPresenter.m in Sources */, @@ -2545,6 +2559,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "yinmeng-ios/yinmeng-ios.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 48UCG35Q9W; @@ -2580,6 +2595,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "yinmeng-ios/yinmeng-ios.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 48UCG35Q9W; diff --git a/yinmeng-ios/yinmeng-ios/AppDelegate/AppDelegate+ThirdConfig.m b/yinmeng-ios/yinmeng-ios/AppDelegate/AppDelegate+ThirdConfig.m index b18134e..a1ccce4 100644 --- a/yinmeng-ios/yinmeng-ios/AppDelegate/AppDelegate+ThirdConfig.m +++ b/yinmeng-ios/yinmeng-ios/AppDelegate/AppDelegate+ThirdConfig.m @@ -7,6 +7,7 @@ #import "AppDelegate+ThirdConfig.h" #import +#import #import "YMConstant.h" #import "CustomAttachmentDecoder.h" @@ -37,4 +38,11 @@ // } [[UIApplication sharedApplication] registerForRemoteNotifications]; } + +- (void)configQIYUSDK { + [[QYSDK sharedSDK] registerAppId:@"b6b7ca22f8ce319dea3a7456dc211fec" appName:@"音萌"]; + [QYSDK sharedSDK].customUIConfig.showAudioEntry = NO; + [QYSDK sharedSDK].customUIConfig.autoShowKeyboard = NO; + [QYSDK sharedSDK].customUIConfig.serviceHeadImage = [UIImage imageNamed:@"ming_setting_about_us"]; +} @end diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/Contents.json new file mode 100644 index 0000000..6954d03 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mew_login_apple@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mew_login_apple@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@2x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed7decce069c334647ad8e62059cc8b434fc5b3 GIT binary patch literal 1337 zcmeAS@N?(olHy`uVBq!ia0vp^aUjgW3?%3B1jhiWbpbvhu0Z<#&;hz#U$lTOwk!$q z3ugH9>6@u5=Y`BCm25pK_t)!+@9-2BxY@oc_x0^s4TWnbmNg|t2Us82Tpo6BQn3{8 z?m1d=^WQG?krjC`t%-qwh0)W+F(l*Onrko17C8vCJ$#iWEE*Vi=ew<2vY7Gbd;fdS zo~$quE#UVE7uoA;H=aUbPi_OUlF3R+iz433t zYA(JnLML@!HU>}7?qYis{*!;b;fzHYUa1RWgpTSqpZ>+NNoVhxIoBSa4%_kQ=w!Cy z(|5l{tEBgby<}AR|7IE2l&5K_EB-9r|Ht%*>dr{bwypa2zb^c)RsP{tGtli(GXC!l z6>oUAUG-|BR=H8@ugWvV9J7kl&oZQ?&%er*Hc|b4>n=+@o~gHf-nN=}W>L}k7t{S0 zRG3vpPhIm&^MbhV)w;R=`0lB$?qd$Wzp4DjUrpDp$6jvyd1v2p(18>kmH^-f3sq7ZWJ$R{j6|DdqB)eBQrYm=5jjsQ93>$}!Q%ulius z<9~A7=g4hyua@x@d$nfXLF-nN@a~W`2Rwh6`KNsp^qX_C``Vr5lh$ou)}2;`1>^^U+%<%&&>P1j_) z0##-)XbksZ^`%SAT6h;h~k`^{Gtu*D^O zYlLBmet5=W_x0VoX2hS3y3N((AmEzItF3gJYjM!7`yP{4Jo{h2hCP1Cr#Y??pK1=+ z?RYom_JhaPOa|L6_x(Fw8Brrsvo)J>hRdIvsbGN>vmwcG{H{WM&!?4 zg*&xoA}2gvbK2RfDEIO_nW!%Cax*u((Zb0qbS3VIUE)+eJT<{*S_hBj)aQ*3GKy1+ z6^jI0o^Z8tOb_hd$8f~Otx!v*VOl`4kQ9uU&gv%6aGC-^iGhEt2PK%zKTq?!M`LzDaai1Jc|kM(1|EHWKeQ%p)uY)vJQnO@3w)5eZ2vTiWoF(o dr?fTlI}5_EBzAr|04z}$JYD@<);T3K0RW>)%Par@ literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@3x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_apple.imageset/mew_login_apple@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd183249cf215beb942f8a9d2136ee6af7217b4 GIT binary patch literal 2118 zcmd6o`9Bj51IJfxS&mGRtDHHf4PP~EnA?mYSzfLlLqyF@&S5O(D9c%iMl?pwuXRmx zJ-%3pmh+hoEYTzyc|8Bc^Lf4ApZBky-#+~p;jhnmHDqA&n~$lwm}$C9|7Y*V7b?CAQc$4{E-nHeQhf4C;; z9r99xaZSZVa%ObMC!F)k-mdmkJSvRn6ZusU01#7hvO{IO zO4T~2Z2DRBjc-C`r)yT@CUbR4Kq%wo9TgbQ0x3#nIZpTGUJ9!o3=L#er|-c7sG=~b z&}bdQy}S<}-9=pzIt^KqJu|e~Pl4^q(GVaiAf!frsy{r{apfnVTWOpdIt z(w#W&5u9n@Bc}qDzxVqqiere=o$$++^ExMH2o&ikMTGS8Wh9<*IWfn&K28>&s%5a8 zRyR1!Yq#f=W+UfpvJ&ja-mS6Ximn{14D5}29^9Q-$>&UchT+`aP{zkN-z;W_j05`7 z)Mz;VcA5j>!$BOjyxdVZdz(@4UL78s#LUQNBEOIp)9mWFH+7C6+xxr|Fg-fq-PhL@ zbxlA>?bOT^zFYwtA|ev;W>+>lg?aWxyr^TxN8+%n;;fn(=l|^PSNr7&uRzr=e_{`?wjl`njc0z|-4Lf#gu_V#Kxx9AI7p$^rd0LfZIR9a{ zNzd4#w~63@Dec(#k!ODyds@{!YAYHWh6<3-5GCg!&oC1I6o&O_R-P0c&tMeC_8m}) z^sVx6XXfW}4!{M&sBFJU)dlAQ>(M#Nmk;|Y5dO`LIgAVGV)8S}z9dMiX)b{cJK7;)W{ zEicrS62BDFZm1|T z+{0dZeV52&G~aaJwzrSKG>OZ4G-N1Eo*PII7E6G3o@|{f%>51~hwN@_$(q#L{~3`L zazV7MqnX#TYH89;vU_K3l@nDDzT66EkpucGMa$F~1l`Thd{*D&%UHz@Q^OVOU=Q`H zTD%!Yw;cb`SRr1=>XMU)SGB-rLsE)=6CVRhd5)0w$XPExa##LWY9KyGd#d)vU1;Z& zAE-MhkC@{Ao@ki^^;R6>P96;xyUyq;epKM05EYPhG`KKM;p6usWl}h?1_?=YCU78k zk3e)O*5K$8w2x?&6BCctY#XT$l2Yq-*q;8aXI2+AZVvwkHwI0zMLu8^X#AEr`{QZ- z3wK>NV=>b%WfS2OCgt*1;^E;JBpN*ih}to`wmGq6_E*(LgoBwfbQeG2mA)8x_JY># zSij;oZE;}_=tZOUEa5s}goiMlh4%B3IyeX~bmLS$mQE=*TSWd7WyWvXu*ykJ zv}H}exR%Oe=HbWNJz7t|79M>$QNz{EBg)ud?UAHSy)HEXWQb(pLcwAC?pEit$I>9P(8wxu z)JU8t?Ny6|&&m#DNl9v&T95U;r9)o9&^R@8xK4x`_}f4J(|6X3?4Qup?vKPQFYx76 zjGAaGv|ZObo3rTxB6;UWvc9{2T!6e!U6l6=wTkonMpdf` zef3Em$6)N&eYZaTGwf*|=+ycnnUecnP>muh$#s*ZSC-nd>HKEZfg4Bqo&M@Em)Plw z30!z@{p%US6h8zF9OCR_`2X`A-wBfToHaW^fVD)2F4Wd kyI>^V#i(;s!>YIO2?e};z1QVyhd&E&LZa+wHi23H1rsMvd;kCd literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/Contents.json new file mode 100644 index 0000000..36c08a7 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mew_login_full_man_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mew_login_full_man_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@2x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4268458e49cee5ec933983673c9a0a7cdfebb8 GIT binary patch literal 8070 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 U@Fnw2UjP6A07*qoM6N<$f>VI>_W%F@ literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@3x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_man_normal.imageset/mew_login_full_man_normal@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c22ee26bd11f57d8ee27e871c38b668327823a GIT binary patch literal 11266 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%0AU<;bj->x&>VkAi| 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 TfFa`h00000NkvXXu0mjf`LSr{ literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/Contents.json new file mode 100644 index 0000000..24c3c55 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mew_login_full_waman_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mew_login_full_waman_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/mew_login_full_waman_normal@2x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_normal.imageset/mew_login_full_waman_normal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..28059a9fa2b4f94531c4b8e11e6dd3387b8d2514 GIT binary patch literal 8146 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 literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_select.imageset/mew_login_full_waman_select@3x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_full_waman_select.imageset/mew_login_full_waman_select@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ea53211c5e45eaacd293a776a612018d8c36df GIT binary patch literal 12805 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 NCkJQyQoD;0zXPqG^dJBL literal 0 HcmV?d00001 diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_line_bg.imageset/mew_login_line_bg@3x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Mew/Login/mew_login_line_bg.imageset/mew_login_line_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd304231b1b48b3869910b8af3dfd1a8e5027f4d GIT binary patch literal 2269 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 WC>aOgP1*qxhOm(HA0SK~cRgJbnwd!U|o zo-U3d9>0_Es)AQOH{^Gh?5llQ|0ZeuAyvtZ zXLlSvb+X0u`wG*CHyHV+%}Ch8ynp9IYtEm|&KlBUQci^tD{`53ZYpTh-6(XrlKXmB z+R1{`PCDxS4n=1-HS4x6jf~k5XL4F_yGs&hG}F%CNh>cUUaVc`Hu1=?KrC3gKdwJB%_2&7{ zj32`q%vJZ;KI)Z{m)y*wU(@r5S+-xS;>5wn*Y+IrS9vqMI&WQ(mO!@s;z(=5`e3>Z%LAIK6Abf_{H3 z)h%o1v~#^?U|{U_ba4!cIDGYHW>J%a0PBP04R5S9-W7KKp7iA}|MVp$YCNq!C%#-c z>pfF!?}L*42kTRJN=IFOz!kPM`@(b$^MmTWFV4kRK6u3Y;^4{O37h6!;8!;|_*f=r zEnl#GtMmRy?Rj-pc2{qB^7Cx!c(sPr+unQjtDcs{eUj#{=D1DB7nTl5KW=;Cy7Ubd ziOp9mBULIq731^o{HX1d`8%U<^L*YX#*-(oG%FqmaDQ{W;(5jTy{)cI%-(Yks2{wo z{p7X2?8lvNjSV;+2T7&>OEBV}04kN5{&o zcJIHQxk=UUBJ2E9mWH#ZIc!re%WG>A(ReV4Nv|g8K)W;7j~SDh^t6H&IP6j`%VR51 zN>Zqs_hFrTw}q?toh8rrXuFphME$c0m0_`x%U;{QrBB)YHN(>T7B}qfyfR;9A8E5C zdhr#V*0ZA5>(=bprTfPJ5&PRiQ|gSRr1}dM$6okqvhA{7ONhwId4In(MC{-3d;N#F j^{Y8J#kGUhciJ(O2lRZ6pKu-+Ees5vu6{1-oD!M + +///当前充值的状态 +- (void)rechargeProcessStatus:(PaymentStatus)status; + +///充值成功回调id +- (void)rechargeSuccess:(NSString *)transactionIdentifier; @end +@interface YMIAPHelper : NSObject + ++ (instancetype)shareHelper; +///代理 +@property (nonatomic,weak) id delegate; +///购买商品 +- (void)buyAppProductWithAppProductId:(NSString *)appProductId; +@end + + NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/Tool/IAPHelper/YMIAPHelper.m b/yinmeng-ios/yinmeng-ios/Base/Tool/IAPHelper/YMIAPHelper.m index 998af21..13bd3b2 100644 --- a/yinmeng-ios/yinmeng-ios/Base/Tool/IAPHelper/YMIAPHelper.m +++ b/yinmeng-ios/yinmeng-ios/Base/Tool/IAPHelper/YMIAPHelper.m @@ -6,7 +6,91 @@ // #import "YMIAPHelper.h" +#import +#import @implementation YMIAPHelper ++ (instancetype)shareHelper { + static dispatch_once_t onceToken; + static YMIAPHelper * helper; + dispatch_once(&onceToken, ^{ + helper = [[YMIAPHelper alloc] init]; + }); + return helper; +} + + +- (void)buyAppProductWithAppProductId:(NSString *)appProductId { + NSSet* dataSet = [[NSSet alloc] initWithObjects:appProductId, nil]; + [IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet]; + [[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest *request, SKProductsResponse *response) { + if (response != nil && response.products.count) { + ///有这个内购的产品 + } else if (!response.products.count) { + ///请求内购产品失败,无产品数量 +#warning to do 此处埋点一个 没有内购产品 + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; + } + return; + } else if (!response) { +#warning to do 此处埋点一个 请求内购没有响应 + ///请求内购产品失败,内购无响应 + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; + } + return; + } else { +#warning to do 此处埋点一个 异常 发起付款失败 + ///异常 发起付款失败 + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; + } + return; + } + if (response.products.firstObject) { + [[IAPShare sharedHelper].iap buyProduct:response.products.firstObject onCompletion:^(SKPaymentTransaction *transcation) { + NSLog(@"%@",transcation.error.description); + switch(transcation.transactionState) { + case SKPaymentTransactionStatePurchased: { + NSLog(@"付款完成状态, 要做出相关的处理"); + [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Purchased]; + } + + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeSuccess:)]) { + [self.delegate rechargeSuccess:transcation.transactionIdentifier]; + } + //同步返回购买成功后,需要请求服务器二次校验 + } + break; + case SKPaymentTransactionStateFailed: { + [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; + } + } + break; + case SKPaymentTransactionStatePurchasing: { + NSLog(@"正在购买中"); + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Purchasing]; + } + } + break; + default: { + [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; + if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { + [self.delegate rechargeProcessStatus:PaymentStatus_Deferred]; + } + NSLog(@"其它"); + } + } + }]; + } + }]; +} + @end diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.h b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.h index c6de152..f5f2fd9 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.h +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.h @@ -11,9 +11,6 @@ NS_ASSUME_NONNULL_BEGIN @interface MewLoginNumberViewController : BaseViewController - - - @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.m index 41ce957..348d4d4 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginNumberViewController.m @@ -15,6 +15,7 @@ #import "YMMacro.h" @interface MewLoginNumberViewController () +@property (nonatomic, strong) UIImageView *bgImageView; /// 返回按钮 @property (nonatomic, strong) UIButton *backButton; /// 手机号登录 @@ -22,7 +23,7 @@ /// 账号登录 @property (nonatomic, strong) UIButton *passwordButton; /// 下划线 -@property (nonatomic, strong) UIView *lineView; +@property (nonatomic, strong) UIImageView *lineView; /// 是否选中了手机号登录 @property (nonatomic, assign, getter=isPhoneSelect) BOOL phoneSelect; /// 手机登录View @@ -98,6 +99,7 @@ #pragma mark - Init View - (void)initSubView { + [self.view addSubview:self.bgImageView]; [self.view addSubview:self.backButton]; [self.view addSubview:self.phoneButton]; [self.view addSubview:self.passwordButton]; @@ -108,6 +110,9 @@ } - (void)initSubViewConstraints { + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.view); + }]; [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(self.view).mas_offset(10); make.top.mas_equalTo(statusbarHeight); @@ -151,8 +156,8 @@ - (void)setPhoneSelect:(BOOL)phoneSelect { _phoneSelect = phoneSelect; /// 更新样式 - self.phoneButton.titleLabel.font = _phoneSelect ? kFontBold(20) : kFontRegular(14); - self.passwordButton.titleLabel.font = _phoneSelect ? kFontRegular(14) : kFontBold(20); + self.phoneButton.titleLabel.font = _phoneSelect ? kFontSemibold(18) : kFontSemibold(16); + self.passwordButton.titleLabel.font = _phoneSelect ? kFontSemibold(16) : kFontSemibold(18); self.phoneLoginView.hidden = !_phoneSelect; self.passwordLoginView.hidden = _phoneSelect; @@ -163,11 +168,16 @@ } #pragma mark - Get +- (UIImageView *)bgImageView { + if (!_bgImageView) { + _bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mew_home_bg"]]; + } + return _bgImageView; +} - (UIButton *)backButton { if (!_backButton) { _backButton = [[UIButton alloc] init]; - [_backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; - _backButton.backgroundColor = UIColor.blueColor; + [_backButton setImage:[UIImage imageNamed:@"common_back_white_left"] forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; @@ -177,7 +187,8 @@ if (!_phoneButton) { _phoneButton = [[UIButton alloc] init]; [_phoneButton setTitle:@"手机号登录" forState:UIControlStateNormal]; - [_phoneButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal]; + [_phoneButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + _phoneButton.titleLabel.font = kFontSemibold(16); [_phoneButton addTarget:self action:@selector(phoneButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _phoneButton; @@ -187,16 +198,17 @@ if (!_passwordButton) { _passwordButton = [[UIButton alloc] init]; [_passwordButton setTitle:@"账号登录" forState:UIControlStateNormal]; - [_passwordButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal]; + [_passwordButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + _phoneButton.titleLabel.font = kFontSemibold(16); [_passwordButton addTarget:self action:@selector(passwordButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _passwordButton; } -- (UIView *)lineView { +- (UIImageView *)lineView { if (!_lineView) { - _lineView = [[UIView alloc] init]; - _lineView.backgroundColor = UIColor.blackColor; + _lineView = [[UIImageView alloc] init]; + _lineView.image = [UIImage imageNamed:@"mew_login_line_bg"]; } return _lineView; } diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginViewController.m index b06a4ac..87081e7 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/MewLoginViewController.m @@ -10,6 +10,8 @@ #import "YMIButton.h" //apple #import +#import +#import ///Third #import #import @@ -18,9 +20,16 @@ #import "ThemeColor.h" #import "YMHUDTool.h" #import "UIImage+Utils.h" +#import "YMConstant.h" +#import "GCDHelper.h" +#import "Base.h" +#import "AccountInfoStorage.h" +#import "Api+Login.h" ///Present #import "LoginPresenter.h" #import "LoginProtocol.h" +#import "ThirdUserInfo.h" + UIKIT_EXTERN NSString * const kYinyouPrivateKey; @@ -35,17 +44,14 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { }; -@interface MewLoginViewController () +@interface MewLoginViewController () @property (nonatomic, strong) UIView *contentView; /** 登录按钮*/ @property (nonatomic, strong) UIButton *loginButton; -@property (nonatomic, strong) UIStackView *stackView; -/// 手机 -@property (nonatomic, strong) YMIButton *phoneButtonView; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 -@property (nonatomic, strong) ASAuthorizationAppleIDButton *appleButton; -#endif +//@property (nonatomic, strong) UIStackView *stackView; +/// 苹果 +@property (nonatomic, strong) YMIButton *appleButtonView; /** 同意勾选按钮*/ @property (nonatomic, strong) UIButton *agreeButton; @@ -77,7 +83,7 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { [super viewDidLoad]; [self initView]; [self setUpConstraints]; - [self setEvents]; +// [self setEvents]; // [self loginAnimation]; } @@ -99,7 +105,7 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { // [self.view addSubview:self.logoImageView]; [self.view addSubview:self.contentView]; [self.contentView addSubview:self.loginButton]; - [self.contentView addSubview:self.stackView]; +// [self.contentView addSubview:self.stackView]; [self.view addSubview:self.agreeButton]; [self.view addSubview:self.agreeLabel]; [self.view addSubview:self.authBubbleView]; @@ -107,23 +113,19 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { [self.view addSubview:self.leftLineView]; [self.view addSubview:self.rightLineView]; [self.view addSubview:self.otherLoginTitleLabel]; + [self.view addSubview:self.appleButtonView]; // [self.stackView addArrangedSubview:self.qqButtonView]; - [self.stackView addArrangedSubview:self.phoneButtonView]; -// [self.stackView addArrangedSubview:self.wxButtonView]; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 - [self.stackView addArrangedSubview:self.appleButton]; -#endif +// [self.stackView addArrangedSubview:self.phoneButtonView]; +//// [self.stackView addArrangedSubview:self.wxButtonView]; +//#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +// [self.stackView addArrangedSubview:self.appleButton]; +//#endif } - (void)setUpConstraints { CGFloat kscale = 363.0 / 375.0; -// [self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) { -// make.left.right.top.mas_equalTo(self.view); -// make.height.mas_equalTo(KScreenWidth * kscale); -// }]; - [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; @@ -157,15 +159,20 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { - [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { +// [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 60); +// make.centerX.mas_equalTo(self.view); +// make.height.mas_equalTo(75); +// }]; + + [self.appleButtonView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 60); make.centerX.mas_equalTo(self.view); make.height.mas_equalTo(75); }]; - [self.agreeLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.appleButton.mas_bottom).offset(20); + make.top.mas_equalTo(self.appleButtonView.mas_bottom).offset(20); make.height.mas_equalTo(40); make.width.mas_equalTo(220); make.centerX.mas_equalTo(self.view).mas_offset(15 - 6); @@ -190,7 +197,7 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { }]; [self.otherLoginTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.bottom.equalTo(self.stackView.mas_top).offset(-32); + make.bottom.equalTo(self.appleButtonView.mas_top).offset(-32); make.centerX.equalTo(self.view); }]; [self.leftLineView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -208,16 +215,31 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { } -- (void)setEvents { - // 手机登陆按钮点击 - UITapGestureRecognizer *phoneTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)]; - [self.phoneButtonView addGestureRecognizer:phoneTap]; - UITapGestureRecognizer * appleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)]; - [self.appleButton addGestureRecognizer:appleTap]; +- (void)setViewHidden { + + if (@available(iOS 13.0, *)) { + self.leftLineView.hidden = NO; + self.rightLineView.hidden = NO; + self.otherLoginTitleLabel.hidden = NO; + self.appleButtonView.hidden = NO; + } else { + self.leftLineView.hidden = YES; + self.rightLineView.hidden = YES; + self.otherLoginTitleLabel.hidden = YES; + self.appleButtonView.hidden = YES; + } } +//- (void)setEvents { + // 手机登陆按钮点击 +// UITapGestureRecognizer *phoneTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)]; +// [self.appleButtonView addGestureRecognizer:phoneTap]; +// UITapGestureRecognizer * appleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)]; +// [self.appleButton addGestureRecognizer:appleTap]; +//} + - (void)setConfigPrivacyAlertView { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; +// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // NSString *isShow = [defaults objectForKey:kYinyouPrivateKey]; // 隐私协议弹出 // if (!isShow && isShow.length <= 0) { @@ -231,150 +253,23 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { } -#pragma mark - Private Method -- (void)phoneQuickLogin { -// [self showLoading]; - // 在使用一键登录之前,请先调用shouldQuickLogin方法,判断当前上网卡的网络环境和运营商是否可以一键登录 -// @weakify(self) -// NTESQuickLoginManager *qlManager = [NTESQuickLoginManager sharedInstance]; -// BOOL shouldQL = [qlManager shouldQuickLogin]; -// if (!shouldQL) { -// [self phoneQuickLoginFail]; -// return; -// } -// [qlManager registerWithBusinessID:KeyWithType(KeyType_NTESQuickLoginBusinessId) configURL:nil extData:nil]; -// [qlManager getPhoneNumberCompletion:^(NSDictionary * _Nonnull resultDic) { -// @strongify(self) -// NSNumber *boolNum = [resultDic objectForKey:@"success"]; -// NSString * token = [resultDic objectForKey:@"token"]; -// BOOL getPhoneNumberSuccess = [boolNum boolValue]; -// if (!getPhoneNumberSuccess || token.length <= 0) { -// dispatch_main_sync_safe(^{ -// [self phoneQuickLoginFail]; -// }); -// return; -// } -// -// [self configQuickLogin]; -// [qlManager CUCMCTAuthorizeLoginCompletion:^(NSDictionary * _Nonnull resultDic) { -// @strongify(self) -// NSNumber *boolNum = [resultDic objectForKey:@"success"]; -// BOOL authSuccess = [boolNum boolValue]; -// if (!authSuccess) { -// dispatch_main_sync_safe(^{ -// NSString *resultCode = [resultDic objectForKey:@"resultCode"]; -// //取消一键登录 -// if ([resultCode isEqualToString:@"200020"] || -// [resultCode isEqualToString:@"10104"]) { -// [self hideHUD]; -// } else { -// [self phoneQuickLoginFail]; -// } -// }); -// return; -// } -// dispatch_main_sync_safe(^{ -// @strongify(self) -// [StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventOneClickLoginSuccess]; -// // // 取号成功,获取acessToken -// [self hideHUD]; -// [self dismissViewControllerAnimated:YES completion:nil]; -// [self.presenter phoneQuickLogin:resultDic[@"accessToken"] token:token]; -// }); -// }]; -// }]; -} -- (void)phoneQuickLoginFail { - [self showErrorToast:@"一键登录失败,请检查手机网络状态。"]; -// LoginPhoneViewController *inputPhoneVC = [[LoginPhoneViewController alloc] init]; -// [self.navigationController pushViewController:inputPhoneVC animated:YES]; -} - -- (void)configQuickLogin { - // 获取当前上网卡的运营商,0:未知 1:电信 2.移动 3.联通 -// NSInteger currentCarrier = [[NTESQuickLoginManager sharedInstance] getCarrier]; -// NTESQuickLoginModel *CMModel = [[NTESQuickLoginModel alloc] init]; -// CMModel.currentVC = self; -// CMModel.presentDirectionType = NTESPresentDirectionPresent; -// if (currentCarrier == XYLoginTypeUnicom) { // 联通 -// CMModel.logoImg = [UIImage imageNamed:@"login_unicom_mobile"]; -// }else if (currentCarrier == XYLoginTypeChinaMobile) { //移动 -// CMModel.logoImg = [UIImage imageNamed:@"login_china_mobile"]; -// }else { //电信 -// CMModel.logoImg = [UIImage imageNamed:@"login_ct_mobile"]; -// } -// CMModel.backgroundColor = [ThemeColor appBackgroundColor]; -// -// CMModel.logoWidth = 95; -// CMModel.logoHeight = 95; -// CMModel.logoOffsetTopY = 30; -// CMModel.navText = @"一键登录"; -// CMModel.navTextColor = [ThemeColor mainTextColor]; -// CMModel.navTextFont = [UIFont boldSystemFontOfSize:18]; -// -// CMModel.navReturnImg = [UIImage imageNamed:@"common_nav_back"]; -// CMModel.navBgColor = [ThemeColor appBackgroundColor]; -// -// CMModel.logBtnHeight = 45; -// CMModel.logBtnRadius = 45.f / 2; -// CMModel.logBtnOffsetTopY= 260; -// CMModel.logBtnOriginLeft = 52; -// CMModel.logBtnOriginRight = 52; -// CMModel.logBtnUsableBGColor = [ThemeColor appMainColor]; -// CMModel.logBtnText = @"本机号码一键登录"; -// CMModel.logBtnTextColor = [ThemeColor mainTextColor]; -// CMModel.logBtnTextFont = [UIFont systemFontOfSize:18 weight:UIFontWeightMedium]; -// -// CMModel.numberOffsetTopY = 170; -// CMModel.numberColor = [ThemeColor mainTextColor]; -// CMModel.numberFont = [UIFont boldSystemFontOfSize:20]; -// CMModel.brandColor = [ThemeColor mainTextColor]; -// -// CMModel.uncheckedImg = [UIImage imageNamed:@"common_checkbox_uncheck"]; -// CMModel.checkedImg = [UIImage imageNamed:@"common_checkbox_checked"]; -// CMModel.checkboxWH = 20; -// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; -// NSString * hadAgree = [defaults stringForKey:kPhoneQuickPrivacyKey]; -// if (hadAgree.length > 0) { -// CMModel.privacyState = YES; -// } -// -// CMModel.privacyColor = [ThemeColor secondTextColor]; -// CMModel.appPrivacyText = [NSString stringWithFormat:@"同意《默认》,并授权%@获取本机号码。",AppName]; -// CMModel.privacyFont = [UIFont systemFontOfSize:12]; -// CMModel.protocolColor = [ThemeColor mainTextColor]; -// CMModel.appPrivacyOriginBottomMargin = 30; -// -// CMModel.backActionBlock = ^{ //点击了返回按钮 -// [self hideHUD]; -// }; -// -// CMModel.checkActionBlock = ^(BOOL isChecked) { -// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; -// if (isChecked) { -// [defaults setObject:@"phonequickhadAgree" forKey:kPhoneQuickPrivacyKey]; -// [defaults synchronize]; -// } else { -// NSString * hadAgree = [defaults stringForKey:kPhoneQuickPrivacyKey]; -// if (hadAgree.length > 0) { -// [defaults removeObjectForKey:kPhoneQuickPrivacyKey]; -// } -// } -// }; -// dispatch_main_sync_safe(^{ -// [[NTESQuickLoginManager sharedInstance] setupModel:CMModel]; -// }); -} #pragma mark - LoginProtocol - (void)loginSuccess { [self dismissViewControllerAnimated:YES completion:nil]; [self showSuccessToast:@"登录成功"]; } + + #pragma mark - Event Response -/// 手机号码一键登录 - (void)loginButtonAction:(UIButton *)sender { + if (!self.agreeButton.isSelected) { + [YMHUDTool showErrorWithMessage:@"请勾选协议"]; + return; + } + MewLoginNumberViewController *controller = [[MewLoginNumberViewController alloc] init]; + [self.navigationController pushViewController:controller animated:NO]; } /// 同意隐私政策 - (void)agreeButtonAction:(UIButton *)sender { @@ -394,36 +289,153 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { } } } -/// 一键登录 -- (void)loginQuickButtonAction:(UIButton *)sender { - if (self.agreeButton.isSelected) { - [self phoneQuickLogin]; - } else { - [UIView animateWithDuration:0.5 animations:^{ - self.authBubbleView.alpha = 1.0; - }]; - } -} -/// 手机 || 密码登录 || Apple -- (void)didClickRecognizer:(UITapGestureRecognizer *)tap { - UIView * view = tap.view; +/// 苹果登录 +- (void)loginWithApple { if (!self.agreeButton.isSelected) { [YMHUDTool showErrorWithMessage:@"请勾选协议"]; return; } - MewLoginNumberViewController *controller = [[MewLoginNumberViewController alloc] init]; - [self.navigationController pushViewController:controller animated:NO]; + + if (@available(iOS 13.0, *)) { + // 基于用户的Apple ID授权用户,生成用户授权请求的一种机制 + ASAuthorizationAppleIDProvider * appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; + // 创建新的AppleID 授权请求 + ASAuthorizationAppleIDRequest * authAppleIDRequest = [appleIDProvider createRequest]; + // 在用户授权期间请求的联系信息 +// authAppleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; + //如果 KeyChain 里面也有登录信息的话,可以直接使用里面保存的用户名和密码进行登录。 +// ASAuthorizationPasswordRequest * passwordRequest = [[[ASAuthorizationPasswordProvider alloc] init] createRequest]; + + NSMutableArray * array = [NSMutableArray arrayWithCapacity:2]; + if (authAppleIDRequest) { + [array addObject:authAppleIDRequest]; + } +// if (passwordRequest) { +// [array addObject:passwordRequest]; +// } + NSArray * requests = [array copy]; + // 由ASAuthorizationAppleIDProvider创建的授权请求 管理授权请求的控制器 + ASAuthorizationController * authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:requests]; + // 设置授权控制器通知授权请求的成功与失败的代理 + authorizationController.delegate = self; + // 设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户 + authorizationController.presentationContextProvider = self; + // 在控制器初始化期间启动授权流 + [authorizationController performRequests]; + + } + } +/// 手机 || 密码登录 || Apple +//- (void)didClickRecognizer:(UITapGestureRecognizer *)tap { +// if (!self.agreeButton.isSelected) { +// [YMHUDTool showErrorWithMessage:@"请勾选协议"]; +// return; +// } +// +// MewLoginNumberViewController *controller = [[MewLoginNumberViewController alloc] init]; +// [self.navigationController pushViewController:controller animated:NO]; +//} + +#pragma mark - ASAuthorizationControllerDelegate +// 授权成功 +- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) { + + if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { + ThirdUserInfo *userInfo = [[ThirdUserInfo alloc] init]; + + ASAuthorizationAppleIDCredential * credential = (ASAuthorizationAppleIDCredential *)authorization.credential; + + // 苹果用户唯一标识符,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来。 + NSString * userID = credential.user; + //把用户的唯一标识 传给后台 判断该用户是否绑定手机号,如果绑定了直接登录,如果没绑定跳绑定手机号页面 +// // 苹果用户信息 如果授权过,可能无法再次获取该信息 + NSPersonNameComponents * fullName = credential.fullName; + NSString * email = credential.email; +// +// // 服务器验证需要使用的参数 + NSString * authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding]; + NSString * identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding]; +// + NSString *tokenStr = [@"ios" stringByAppendingString:userID]; +// // 用于判断当前登录的苹果账号是否是一个真实用户,取值有:unsupported、unknown、likelyReal + ASUserDetectionStatus realUserStatus = credential.realUserStatus; + + if (fullName.familyName.length > 0 && fullName.givenName.length > 0) { + userInfo.userName = [NSString stringWithFormat:@"%@%@",fullName.familyName, fullName.givenName]; + } + + [AccountInfoStorage instance].thirdUserInfo = userInfo; + [YMHUDTool showLoadingWithMessage:@"正在登录中"]; + [self.presenter thirdLoginWithApple:identityToken unionId:userID]; +// [Api loginWithThirdPart:^(BaseModel * _Nonnull data, NSInteger code, NSString * _Nonnull msg) { +// +// +// } openid:identityToken unionid:userID access_token:identityToken type:@"5"]; + +// NSLog(@"userID: %@", userID); +// NSLog(@"fullName: %@", fullName); +// NSLog(@"email: %@", email); +// NSLog(@"authorizationCode: %@", authorizationCode); +// NSLog(@"identityToken: %@", identityToken); +// NSLog(@"realUserStatus: %@", @(realUserStatus)); + }else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) { + // 这个获取的是iCloud记录的账号密码,需要输入框支持iOS 12 记录账号密码的新特性,如果不支持,可以忽略 + // 用户登录使用现有的密码凭证 + ASPasswordCredential * passwordCredential = (ASPasswordCredential *)authorization.credential; + // 密码凭证对象的用户标识 用户的唯一标识 + NSString * user = passwordCredential.user; + + //把用户的唯一标识 传给后台 判断该用户是否绑定手机号,如果绑定了直接登录,如果没绑定跳绑定手机号页面 + +// // 密码凭证对象的密码 +// NSString * password = passwordCredential.password; +// NSLog(@"userID: %@", user); +// NSLog(@"password: %@", password); + + } else { + + } +} +// 授权失败 +- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) { + NSString *errorMsg = nil; + switch (error.code) { + case ASAuthorizationErrorCanceled: + errorMsg = @"用户取消了授权请求"; + break; + case ASAuthorizationErrorFailed: + errorMsg = @"授权请求失败"; + break; + case ASAuthorizationErrorInvalidResponse: + errorMsg = @"授权请求响应无效"; + break; + case ASAuthorizationErrorNotHandled: + errorMsg = @"未能处理授权请求"; + break; + case ASAuthorizationErrorUnknown: + errorMsg = @"授权请求失败未知原因"; + break; + } + NSLog(@"%@", errorMsg); +} + +#pragma mark- ASAuthorizationControllerPresentationContextProviding +- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0)){ + return self.view.window; +} + + #pragma mark - Getters And Setters - (UIButton *)loginButton{ //手机号码一键登录 if (!_loginButton) { _loginButton = [UIButton buttonWithType:UIButtonTypeCustom]; _loginButton.layer.masksToBounds = YES; _loginButton.layer.cornerRadius = 45/2.f; - [_loginButton setTitle:@"手机号码一键登录" forState:UIControlStateNormal]; + [_loginButton setTitle:@"账号登录" forState:UIControlStateNormal]; [_loginButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; _loginButton.titleLabel.font = kFontMedium(16); _loginButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; @@ -524,45 +536,45 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { return _contentView; } -- (UIStackView *)stackView { - if (!_stackView) { - _stackView = [[UIStackView alloc] init]; - _stackView.distribution = UIStackViewDistributionEqualSpacing; - _stackView.spacing = 32; - _stackView.axis = UILayoutConstraintAxisHorizontal; - _stackView.alignment = UIStackViewAlignmentFill; +//- (UIStackView *)stackView { +// if (!_stackView) { +// _stackView = [[UIStackView alloc] init]; +// _stackView.distribution = UIStackViewDistributionEqualSpacing; +// _stackView.spacing = 32; +// _stackView.axis = UILayoutConstraintAxisHorizontal; +// _stackView.alignment = UIStackViewAlignmentFill; +// } +// return _stackView; +//} + +- (YMIButton *)appleButtonView { //手机号登录 + if (!_appleButtonView) { + _appleButtonView = [[YMIButton alloc] initWithImagePosition:XPButtonImagePositionTop]; + [_appleButtonView setImage: [UIImage imageNamed:@"mew_login_apple"] forState:UIControlStateNormal]; + [_appleButtonView setTitle:@"苹果登录" forState:UIControlStateNormal]; + [_appleButtonView setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + _appleButtonView.titleLabel.font = kFontRegular(12); + _appleButtonView.imageTitleSpace = 5.0; + [_appleButtonView addTarget:self action:@selector(loginWithApple) forControlEvents:UIControlEventTouchUpInside]; } - return _stackView; + return _appleButtonView; } -- (YMIButton *)phoneButtonView { //手机号登录 - if (!_phoneButtonView) { - _phoneButtonView = [[YMIButton alloc] initWithImagePosition:XPButtonImagePositionTop]; - [_phoneButtonView setImage: [UIImage imageNamed:@"mew_login_account"] forState:UIControlStateNormal]; - [_phoneButtonView setTitle:@"账号登录" forState:UIControlStateNormal]; - [_phoneButtonView setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; - _phoneButtonView.titleLabel.font = kFontRegular(12); - _phoneButtonView.imageTitleSpace = 5.0; -// [_phoneButtonView addTarget:self action:@selector(loginWithNumberButtonAction) forControlEvents:UIControlEventTouchUpInside]; - } - return _phoneButtonView; -} - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 -- (ASAuthorizationAppleIDButton *)appleButton API_AVAILABLE(ios(13.0)){ //苹果登录 - if (!_appleButton) { - if (@available(iOS 13.0, *)) { - _appleButton = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeSignIn authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleWhite]; - } else { - // Fallback on earlier versions - } - _appleButton.cornerRadius = 25; - _appleButton.tag = 1000 + ThirdLoginType_Apple; -// _appleButton.hidden = NO; - } - return _appleButton; -} -#endif +//#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +//- (ASAuthorizationAppleIDButton *)appleButton API_AVAILABLE(ios(13.0)){ //苹果登录 +// if (!_appleButton) { +// if (@available(iOS 13.0, *)) { +// _appleButton = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeSignIn authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleWhite]; +// } else { +// // Fallback on earlier versions +// } +// _appleButton.cornerRadius = 25; +// _appleButton.tag = 1000 + ThirdLoginType_Apple; +//// _appleButton.hidden = NO; +// } +// return _appleButton; +//} +//#endif - (UIImageView *)bgImageView { if (!_bgImageView) { diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPasswordView.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPasswordView.m index ec14ca4..51f09c8 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPasswordView.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPasswordView.m @@ -12,6 +12,9 @@ /// Tool #import "ThemeColor.h" #import "YMHUDTool.h" +#import "UIImage+Utils.h" +#import "YMConstant.h" +#import "YMMacro.h" ///View #import "LoginInputView.h" ///present @@ -57,11 +60,24 @@ } +- (void)phoneAndPasswordLoginFail:(NSString *)error { + [YMHUDTool showErrorWithMessage:error]; +} #pragma mark - Action Event /// 登录 - (void)nextButtonAction { + if (self.phoneView.textField.text.length == 0 || [self.phoneView.textField.text isEqualToString:@""]) { + [YMHUDTool showErrorWithMessage:@"请输入账号"]; + return; + } + + if (self.codeView.textField.text.length == 0 || [self.codeView.textField.text isEqualToString:@""]) { + [YMHUDTool showErrorWithMessage:@"请输入密码"]; + return; + } + [self.present loginWithPhone:self.phoneView.textField.text password:self.codeView.textField.text]; } @@ -106,8 +122,9 @@ }]; [self.forgetPasswordButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerY.mas_equalTo(self.codeView.mas_bottom).offset(8); +// make.centerY.mas_equalTo(self.codeView.mas_bottom).offset(8); make.right.mas_equalTo(self.codeView); + make.top.equalTo(self.codeView.mas_bottom).offset(10); }]; } @@ -124,16 +141,11 @@ _nextButton = [UIButton buttonWithType:UIButtonTypeCustom]; _nextButton.layer.masksToBounds = YES; _nextButton.layer.cornerRadius = 45/2.f; - [_nextButton setTitle:@"下一步" forState:UIControlStateNormal]; + [_nextButton setImage:[UIImage imageNamed:@"mew_login_next"] forState:UIControlStateNormal]; _nextButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; - _nextButton.enabled = NO; [_nextButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal]; -// UIImage *disableImage = [UIImage gradientColorImageFromColors:@[[ThemeColor disableButtonColor],[ThemeColor disableButtonColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; -// [_nextButton setBackgroundImage:disableImage forState:UIControlStateDisabled]; -// [_nextButton setTitleColor:[ThemeColor disableButtonTextColor] forState:UIControlStateDisabled]; -// UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor confirmButtonGradientStartColor],[ThemeColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; -// [_nextButton setBackgroundImage:image forState:UIControlStateNormal]; -// [_nextButton setTitleColor:[ThemeColor confirmButtonTextColor] forState:UIControlStateNormal]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor colorWithHexString:@"#FF60FD"], [ThemeColor colorWithHexString:@"#8974FF"],[ThemeColor colorWithHexString:@"#69EBFF"]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(KScreenWidth - 2*36, 52)]; + _nextButton.backgroundColor = [UIColor colorWithPatternImage:image]; [_nextButton addTarget:self action:@selector(nextButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _nextButton; @@ -145,8 +157,8 @@ if (!_forgetPasswordButton) { _forgetPasswordButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_forgetPasswordButton setTitle:@"忘记密码?" forState:UIControlStateNormal]; - [_forgetPasswordButton setTitleColor:[ThemeColor secondTextColor] forState:UIControlStateNormal]; - _forgetPasswordButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Regular" size:11]; + [_forgetPasswordButton setTitleColor:UIColorRGBAlpha(0xFFFFFF, 0.8) forState:UIControlStateNormal]; + _forgetPasswordButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Regular" size:14]; // _forgetPasswordButton.hidden = NO; [_forgetPasswordButton addTarget:self action:@selector(forgetPasswordButtonAction) forControlEvents:UIControlEventTouchUpInside]; } @@ -156,7 +168,7 @@ - (LoginInputView *)phoneView { if (!_phoneView) { _phoneView = [[LoginInputView alloc] init]; - _phoneView.backgroundColor = [ThemeColor colorWithHexString:@"#F8F8FB"]; + _phoneView.backgroundColor = UIColor.whiteColor; _phoneView.layer.masksToBounds = YES; _phoneView.layer.cornerRadius = 45/2; _phoneView.titleLabel.hidden = YES; @@ -176,7 +188,7 @@ - (LoginInputView *)codeView { if (!_codeView) { _codeView = [[LoginInputView alloc] init]; - _codeView.backgroundColor = [ThemeColor colorWithHexString:@"#F8F8FB"]; + _codeView.backgroundColor = UIColor.whiteColor; _codeView.layer.masksToBounds = YES; _codeView.layer.cornerRadius = 51.0/2; _codeView.placeHolder = @"请输入密码"; diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPhoneView.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPhoneView.m index 794a673..bb8e383 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPhoneView.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Login/View/SubView/MewLoginPhoneView.m @@ -17,6 +17,7 @@ #import "ThemeColor.h" #import "YMMacro.h" #import "YMHUDTool.h" +#import "UIImage+Utils.h" /// View #import "LoginInputView.h" @@ -30,7 +31,7 @@ ///验证码View @property (nonatomic,strong) UIView *codeView; ///重新获取验证码 和 倒计时 -@property (nonatomic,strong) UIStackView *codeStackView; +//@property (nonatomic,strong) UIStackView *codeStackView; ///显示倒计时 @property (nonatomic,strong) UILabel *cutdownLabel; ///重新获得验证码 @@ -169,18 +170,20 @@ - (void)initSubViews { [self addSubview:self.phoneInputView]; [self addSubview:self.codeView]; - [self.codeView addSubview:self.codeStackView]; - [self.codeStackView addArrangedSubview:self.codeTextField]; - [self.codeStackView addArrangedSubview:self.cutdownLabel]; - [self.codeStackView addArrangedSubview:self.retryCodeButton]; +// [self.codeView addSubview:self.codeStackView]; + [self.codeView addSubview:self.codeTextField]; + [self.codeView addSubview:self.cutdownLabel]; + [self.codeView addSubview:self.retryCodeButton]; [self addSubview:self.confirmButton]; } - (void)initSubViewConstraints { CGFloat kscale = 363.0 / 375.0; [self.phoneInputView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.left.right.equalTo(self); - make.height.mas_equalTo(51); + make.top.equalTo(self); + make.left.mas_equalTo(36); + make.right.mas_equalTo(-36); + make.height.mas_equalTo(52); }]; [self.codeView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -188,14 +191,26 @@ make.left.right.height.equalTo(self.phoneInputView); }]; - [self.codeStackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.codeView).inset(15); - make.top.bottom.mas_equalTo(self.codeView); + [self.retryCodeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.codeView).offset(-15); + make.centerY.equalTo(self.codeView); }]; + [self.cutdownLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.retryCodeButton); + }]; + [self.codeTextField mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.codeView).offset(15); + make.centerY.equalTo(self.codeView); + }]; + +// [self.codeStackView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.right.mas_equalTo(self.codeView).inset(15); +// make.top.bottom.mas_equalTo(self.codeView); +// }]; [self.confirmButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.codeView.mas_bottom).offset(15); - make.left.right.height.mas_equalTo(self.codeStackView); + make.left.right.height.mas_equalTo(self.codeView); }]; } @@ -244,8 +259,7 @@ - (UIView *)codeView { if (!_codeView) { _codeView = [[UIView alloc] init]; -// _codeView.backgroundColor = UIColor.redColor; - //[ThemeColor colorWithHexString:@"#F8F8FB"]; + _codeView.backgroundColor = UIColor.whiteColor; _codeView.layer.masksToBounds = YES; _codeView.layer.cornerRadius = 51.0/2; @@ -283,7 +297,7 @@ if (!_retryCodeButton) { _retryCodeButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_retryCodeButton setTitle:@"获取验证码" forState:UIControlStateNormal]; - [_retryCodeButton setTitleColor:[ThemeColor mainTextColor] forState:UIControlStateNormal]; + [_retryCodeButton setTitleColor:[ThemeColor colorWithHexString:@"#9552FF"] forState:UIControlStateNormal]; _retryCodeButton.titleLabel.font = [UIFont systemFontOfSize:11 weight:UIFontWeightMedium]; [_retryCodeButton addTarget:self action:@selector(getSmsCodeButtonAction) forControlEvents:UIControlEventTouchUpInside]; _retryCodeButton.hidden = NO; @@ -291,31 +305,18 @@ return _retryCodeButton; } -- (UIStackView *)codeStackView { - if (!_codeStackView) { - _codeStackView = [[UIStackView alloc] init]; - _codeStackView.axis = UILayoutConstraintAxisHorizontal; - _codeStackView.distribution = UIStackViewDistributionFill; - _codeStackView.alignment = UIStackViewAlignmentCenter; - _codeStackView.spacing = 0; - } - return _codeStackView; -} + - (UIButton *)confirmButton{ if (!_confirmButton) { _confirmButton = [UIButton buttonWithType:UIButtonTypeCustom]; _confirmButton.layer.masksToBounds = YES; - _confirmButton.layer.cornerRadius = 51/2.f; - [_confirmButton setTitle:@"验证" forState:UIControlStateNormal]; + _confirmButton.layer.cornerRadius = 52/2.f; + [_confirmButton setImage:[UIImage imageNamed:@"mew_login_next"] forState:UIControlStateNormal]; _confirmButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; -// [_confirmButton setTitleColor:[ThemeColor disableButtonTextColor] forState:UIControlStateDisabled]; -// [_confirmButton setTitleColor:[ThemeColor confirmButtonTextColor] forState:UIControlStateNormal]; - _confirmButton.enabled = NO; -// UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor confirmButtonGradientStartColor], [ThemeColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; -// [_confirmButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[ThemeColor disableButtonColor], [ThemeColor disableButtonColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateDisabled]; -// [_confirmButton setBackgroundImage:image forState:UIControlStateNormal]; - [_confirmButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor colorWithHexString:@"#FF60FD"], [ThemeColor colorWithHexString:@"#8974FF"],[ThemeColor colorWithHexString:@"#69EBFF"]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(KScreenWidth - 2*36, 52)]; + _confirmButton.backgroundColor = [UIColor colorWithPatternImage:image]; + [_confirmButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; [_confirmButton addTarget:self action:@selector(confirmButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _confirmButton; diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.h b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.h index 680f9fe..375c7e1 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.h +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.h @@ -10,11 +10,18 @@ NS_ASSUME_NONNULL_BEGIN +@protocol MewRechargeSubViewDelegate + +- (void)didSelectMewRechargeChargeProdId:(NSString *)chargeProdId; + +@end + @interface MewRechargeSubView : UIView // 充值模型 @property (nonatomic, copy) NSArray *rechargeModels; // 钱包 @property (nonatomic, strong) WalletInfoModel *walletModel; +@property (nonatomic, weak) id delegate; @end diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.m index ce7785d..7aaf6a3 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeSubView.m @@ -16,6 +16,7 @@ #import "ThemeColor.h" #import "YMMacro.h" #import "UIImage+Utils.h" +#import "YMHUDTool.h" @interface MewRechargeSubView() //余额 @@ -32,6 +33,7 @@ @property (nonatomic,strong) YYLabel *rechargePrivacyLabel; //@property (nonatomic, strong) UIStackView *rechargeStackView; @property (nonatomic, strong) UIButton *rechargeButton; +@property (nonatomic, strong) RechargeListModel *selectModel; @end @@ -50,6 +52,30 @@ #pragma mark - Action Event - (void)rechargeButtonAction { //立即充值 + if (self.selectModel == nil) { + [YMHUDTool showErrorWithMessage:@"请选择充值的钻石"]; + return; + } + + if (self.delegate) { + [self.delegate didSelectMewRechargeChargeProdId:self.selectModel.chargeProdId]; + } +} + +- (void)didRechargeButtonAction:(UITapGestureRecognizer *)tap { + for (UIView *rechargeView in self.rechargeBgViewArrays) { + rechargeView.layer.borderColor = UIColor.clearColor.CGColor; + rechargeView.layer.borderWidth = 0.0; + } + + UIView *currentRechargeView = tap.view; + currentRechargeView.layer.borderColor = [ThemeColor colorWithHexString:@"#9552FF"].CGColor; + currentRechargeView.layer.borderWidth = 1.0; + + NSInteger selectIndex = tap.view.tag; + self.selectModel = self.rechargeModels[selectIndex]; + + } #pragma mark - Set @@ -67,8 +93,8 @@ - (void)initView { [self addSubview:self.balanceBgImageView]; [self addSubview:self.balanceStackView]; - [self.balanceStackView addSubview:self.balanceImageView]; - [self.balanceStackView addSubview:self.balanceTitleLabel]; + [self.balanceStackView addArrangedSubview:self.balanceImageView]; + [self.balanceStackView addArrangedSubview:self.balanceTitleLabel]; [self addSubview:self.balanceMoneyLabel]; [self addSubview:self.rechargeView]; [self addSubview:self.rechargePrivacyLabel]; @@ -90,29 +116,39 @@ rechargeBgView.backgroundColor = UIColorRGBAlpha(0x525566, 0.8); rechargeBgView.layer.cornerRadius = 8.0; rechargeBgView.layer.masksToBounds = YES; + rechargeBgView.tag = i; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didRechargeButtonAction:)]; + [rechargeBgView addGestureRecognizer:tap]; [self.rechargeBgViewArrays addObject:rechargeBgView]; [self.rechargeView addSubview:rechargeBgView]; - UIStackView *rechargeStackView = [[UIStackView alloc] initWithFrame:CGRectMake(0, 0, viewWidth, 25)]; - rechargeStackView.axis = UILayoutConstraintAxisHorizontal; - rechargeStackView.distribution = UIStackViewDistributionFill; - rechargeStackView.alignment = UIStackViewAlignmentFill; - rechargeStackView.spacing = 2; + UIView *rechargeStackView = [[UIView alloc] initWithFrame:CGRectMake(5, 14, viewWidth, 25)]; [rechargeBgView addSubview:rechargeStackView]; UIImageView *rechargeImageView = [[UIImageView alloc] init]; +// rechargeImageView.frame.size = CGSizeMake(20, 20); rechargeImageView.image = [UIImage imageNamed:@"mew_recharge_diamond_small"]; [rechargeStackView addSubview:rechargeImageView]; UILabel *rechargeDiamondLabel = [[UILabel alloc] init]; - rechargeDiamondLabel.text = [NSString stringWithFormat:@"%@钻石",model.giftGoldNum]; + rechargeDiamondLabel.text = [NSString stringWithFormat:@"%@",model.prodName]; +// [rechargeDiamondLabel sizeToFit]; rechargeDiamondLabel.textColor = UIColor.whiteColor; - rechargeDiamondLabel.font = kFontMedium(18); + rechargeDiamondLabel.font = kFontMedium(16); [rechargeStackView addSubview:rechargeDiamondLabel]; + [rechargeDiamondLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.top.height.equalTo(rechargeStackView); + }]; + [rechargeImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(20); + make.centerY.equalTo(rechargeDiamondLabel); + make.right.equalTo(rechargeDiamondLabel.mas_left).offset(-5); + }]; - UILabel *rechargeMoneyLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(rechargeStackView.frame) + 10.0, viewWidth, 20)]; + UILabel *rechargeMoneyLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(rechargeStackView.frame) + 13.0, viewWidth, 20)]; rechargeMoneyLabel.text = [NSString stringWithFormat:@"%@元",model.money]; rechargeMoneyLabel.textColor = UIColorRGBAlpha(0xFFFFFF, 0.8); rechargeMoneyLabel.font = kFontRegular(14); + rechargeMoneyLabel.textAlignment = NSTextAlignmentCenter; [rechargeBgView addSubview:rechargeMoneyLabel]; } @@ -127,12 +163,13 @@ [self.balanceBgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(KScreenWidth - 2*19); make.height.mas_equalTo(124*kScreenScale); - make.top.mas_equalTo(41); + make.top.mas_equalTo(self); make.left.mas_equalTo(19); }]; [self.balanceStackView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.balanceBgImageView).offset(27); - make.left.right.equalTo(self.balanceImageView); +// make.width.mas_equalTo(self); + make.centerX.mas_equalTo(self); make.height.mas_equalTo(25); }]; [self.balanceMoneyLabel mas_makeConstraints:^(MASConstraintMaker *make) { diff --git a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeViewController.m index 51d7368..56a4090 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mew/Mine/View/MewRechargeViewController.m @@ -11,11 +11,18 @@ /// Third #import #import "YMMacro.h" +#import "YMIAPHelper.h" +/// P +#import "MineRechargeProtocol.h" +#import "MineRechargePresenter.h" -@interface MewRechargeViewController () +@interface MewRechargeViewController () @property (nonatomic, strong) UIImageView *rechargeBgImageView; @property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) MewRechargeSubView *rechageView; + +///订单编号 +@property (nonatomic,copy) NSString *orderId; @end @implementation MewRechargeViewController @@ -24,13 +31,57 @@ return YES; } + +- (MineRechargePresenter *)createPresenter { + return [[MineRechargePresenter alloc] init]; +} + +- (void)dealloc { + [YMIAPHelper shareHelper].delegate = nil; +} + #pragma mark - Life Cycle - (void)viewDidLoad { [super viewDidLoad]; [self initView]; - + [self loadData]; + [YMIAPHelper shareHelper].delegate = self; } + + +#pragma mark - Load Data +- (void)loadData { + [self.presenter requestRechargeListWithChannel:@"1"]; + [self.presenter getUserWalletInfo]; +} + +#pragma mark - MineRechargeProtocol +- (void)getUserWalletInfo:(WalletInfoModel *)balanceInfo { + self.rechageView.walletModel = balanceInfo; +} + +- (void)requestRechargeListSucccess:(NSArray *)list { + self.rechageView.rechargeModels = list; +} + +- (void)requestIAPRechargeOrderSuccess:(NSString *)orderId chargeProdId:(NSString *)chargeProdId { + if (orderId.length > 0) { + self.orderId = orderId; + + } +} + + +#pragma mark - MewRechargeSubViewDelegate +- (void)didSelectMewRechargeChargeProdId:(NSString *)chargeProdId { + [self.presenter requestIAPRechargeOrderWithChargeProdId:chargeProdId]; +} + +#pragma mark - YMIAPHelperDelegate + + + #pragma mark - Action Event - (void)backButtonAction { [self.navigationController popViewControllerAnimated:NO]; @@ -81,6 +132,7 @@ - (MewRechargeSubView *)rechageView { if (!_rechageView) { _rechageView = [[MewRechargeSubView alloc] init]; + _rechageView.delegate = self; } return _rechageView; } diff --git a/yinmeng-ios/yinmeng-ios/Main/Tabbar/View/TabbarViewController.m b/yinmeng-ios/yinmeng-ios/Main/Tabbar/View/TabbarViewController.m index 1fe9c85..e6fcb56 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Tabbar/View/TabbarViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Tabbar/View/TabbarViewController.m @@ -17,6 +17,7 @@ /// Third #import #import +#import ///VC #import "TabbarViewController.h" #import "BaseNavigationController.h" @@ -33,12 +34,16 @@ /// Model //#import "UserInfoModel.h" +NSString * const kNetworkReachabilityKey = @"kNetworkReachabilityKey"; + @interface TabbarViewController () < BaseMvpProtocol, MainProtocol, NIMLoginManagerDelegate, NIMSystemNotificationManagerDelegate, NIMChatManagerDelegate,NIMBroadcastManagerDelegate> @property (nonatomic, strong) MainPresenter *presenter; +///是否是的第一次链接网络 +@property (nonatomic,assign) BOOL isFirstReachability; @end @@ -150,10 +155,10 @@ [self pushBindPhoneController]; } - if (userInfo.nick == nil || userInfo.avatar == nil) { - [self completeUserInfo]; - return; - } +// if (userInfo.nick == nil || userInfo.avatar == nil) { +// [self completeUserInfo]; +// return; +// } [self initTabs:YES]; // [self setUserInfoToQYWithUserInfo:userInfo]; @@ -196,6 +201,35 @@ [YMHUDTool hideHUD]; } +#pragma mark - 网络状态监听 +- (void)networkReachability{ + [[AFNetworkReachabilityManager sharedManager] startMonitoring]; + [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusUnknown: + self.isFirstReachability = YES; + break; + case AFNetworkReachabilityStatusNotReachable: + self.isFirstReachability = YES; + break; + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + { + if (self.isFirstReachability) { + [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkReachabilityKey object:nil userInfo:nil]; + [self.presenter autoLogin]; + [[ClientConfig shareConfig] clientInit]; + } + self.isFirstReachability = YES; + } + break; + default: + break; + } + }]; +} + + #pragma mark - Pirvate Method // 去到绑定手机号码页面 - (void)pushBindPhoneController { diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPasswordPresent.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPasswordPresent.m index cdcc399..5396b5d 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPasswordPresent.m +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPasswordPresent.m @@ -31,6 +31,8 @@ [[AccountInfoStorage instance] saveAccountInfo:model]; } [[self getView] phoneAndPasswordLoginSuccess]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [[self getView] phoneAndPasswordLoginFail:msg]; } showLoading:YES] phone:desPhone password:desPassword client_secret:@"uyzjdhds" version:@"1" client_id:@"erban-client" grant_type:@"password"]; } @end diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.h b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.h index c9e5809..b2e8997 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.h +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.h @@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN /// @param type 登录的类型 - (void)thirdLoginWithType:(ThirdLoginType)type; +- (void)thirdLoginWithApple:(NSString *)token unionId:(NSString *)unionId; + @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.m index 10f18d5..d0445c6 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.m +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Presenter/LoginPresenter.m @@ -12,6 +12,7 @@ #import "Api+Login.h" ///P #import "LoginProtocol.h" +#import "AccountModel.h" @implementation LoginPresenter @@ -33,5 +34,18 @@ } +- (void)thirdLoginWithApple:(NSString *)token unionId:(NSString *)unionId { + [Api loginWithThirdPart:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + AccountModel *model = [AccountModel modelWithDictionary:data.data]; + if (model != nil) { + [[AccountInfoStorage instance] saveAccountInfo:model]; + [[self getView] loginSuccess]; + } + + } fail:^(NSInteger code, NSString * _Nullable msg) { + + } showLoading:YES] openid:token unionid:unionId access_token:token type:@"5"]; +} + @end diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Protocol/LoginPasswordProtocol.h b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Protocol/LoginPasswordProtocol.h index 03e3ee0..175d65c 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Protocol/LoginPasswordProtocol.h +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/Protocol/LoginPasswordProtocol.h @@ -12,6 +12,8 @@ NS_ASSUME_NONNULL_BEGIN @protocol LoginPasswordProtocol ///手机号密码登录成功 - (void)phoneAndPasswordLoginSuccess; +///手机号密码登录失败 +- (void)phoneAndPasswordLoginFail:(NSString *)error; @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginForgetPasswordViewController.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginForgetPasswordViewController.m index d2ceda1..ac59db3 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginForgetPasswordViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginForgetPasswordViewController.m @@ -17,9 +17,12 @@ ///Tool #import "ThemeColor.h" #import "CountDownHelper.h" +#import "YMMacro.h" +#import "UIImage+Utils.h" @interface LoginForgetPasswordViewController () +@property (nonatomic, strong) UIImageView *bgImageView; ///容器 @property (nonatomic,strong) UIStackView *stackView; ///手机号 @@ -30,6 +33,7 @@ @property (nonatomic,strong) LoginForgetEditView *passwordView; ///完成 @property (nonatomic,strong) UIButton *finishButton; +@property (nonatomic, strong) UILabel *titleLabel; /// 返回按钮 @property (nonatomic, strong) UIButton *backButton; @@ -45,9 +49,9 @@ [[CountDownHelper shareHelper] stopCountDown]; } -//- (BOOL)isHiddenNavBar { -// return YES; -//} +- (BOOL)isHiddenNavBar { + return YES; +} #pragma mark - Life Cycle - (void)viewDidLoad { @@ -108,29 +112,66 @@ #pragma mark - Private Method - (void)initSubViews { - self.title = @"忘记密码"; +// self.titleLabel.text = @"忘记密码"; [CountDownHelper shareHelper].delegate = self; + [self.view addSubview:self.bgImageView]; + [self.view addSubview:self.backButton]; + [self.view addSubview:self.titleLabel]; + [self.view addSubview:self.stackView]; [self.view addSubview:self.finishButton]; - [self.stackView addArrangedSubview:self.phoneView]; [self.stackView addArrangedSubview:self.codeView]; [self.stackView addArrangedSubview:self.passwordView]; } - (void)initSubViewConstraints { + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.view); + }]; + + [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.view).mas_offset(10); + make.top.mas_equalTo(statusbarHeight); + make.height.width.mas_equalTo(44); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.backButton); + make.centerX.equalTo(self.view); + }]; + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.top.mas_equalTo(self.view); + make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(60); + make.width.mas_equalTo(KScreenWidth - 2 *36); + make.centerX.equalTo(self.view); }]; [self.finishButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.view).inset(52); - make.height.mas_equalTo(45); + make.left.right.mas_equalTo(self.view).inset(36); + make.height.mas_equalTo(52); make.top.mas_equalTo(self.stackView.mas_bottom).offset(20); }]; +// [self.phoneView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.height.mas_equalTo(52); +// make.width.mas_equalTo(KScreenWidth - 2 * 36); +// make.centerX.equalTo(self.view); +// make.top.mas_equalTo(60); +// }]; +// +// [self.codeView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.height.width.centerX.mas_equalTo(self.phoneView); +// make.top.equalTo(self.phoneView.mas_bottom).offset(20); +// }]; +// +// [self.passwordView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.height.width.centerX.mas_equalTo(self.phoneView); +// make.top.equalTo(self.codeView.mas_bottom).offset(20); +// }]; + [self.phoneView mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(45); + make.height.mas_equalTo(52); }]; [self.codeView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -144,35 +185,49 @@ - (void)initEvents { // @weakify(self); - RAC(self.finishButton, enabled) = [RACSignal combineLatest:@[self.phoneView.textField.rac_textSignal, self.codeView.textField.rac_textSignal, self.passwordView.textField.rac_textSignal] reduce:^id _Nonnull(NSString *phone, NSString *code, NSString *password){ - return @(phone.length == 11 && code.length > 0 && password.length >= 6 && password.length <= 16); - }]; +// RAC(self.finishButton, enabled) = [RACSignal combineLatest:@[self.phoneView.textField.rac_textSignal, self.codeView.textField.rac_textSignal, self.passwordView.textField.rac_textSignal] reduce:^id _Nonnull(NSString *phone, NSString *code, NSString *password){ +// return @(phone.length == 11 && code.length > 0 && password.length >= 6 && password.length <= 16); +// }]; } #pragma mark - Getters And Setters +- (UIImageView *)bgImageView { + if (!_bgImageView) { + _bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mew_home_bg"]]; + } + return _bgImageView; +} + - (UIButton *)backButton { if (!_backButton) { _backButton = [[UIButton alloc] init]; - [_backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; - _backButton.backgroundColor = UIColor.blueColor; + [_backButton setImage:[UIImage imageNamed:@"common_back_white_left"] forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.text = @"忘记密码"; + _titleLabel.font = kFontMedium(18); + _titleLabel.textColor = UIColor.whiteColor; + } + return _titleLabel; +} + - (UIButton *)finishButton{ if (!_finishButton) { _finishButton = [UIButton buttonWithType:UIButtonTypeCustom]; _finishButton.layer.masksToBounds = YES; - _finishButton.layer.cornerRadius = 45/2.f; - [_finishButton setTitle:@"提交" forState:UIControlStateNormal]; + _finishButton.layer.cornerRadius = 52/2.f; + [_finishButton setImage:[UIImage imageNamed:@"mew_login_next"] forState:UIControlStateNormal]; _finishButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; [_finishButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal]; - _finishButton.enabled = NO; -// UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor confirmButtonGradientStartColor], [ThemeColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; -// [_finishButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[ThemeColor disableButtonColor], [ThemeColor disableButtonColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateDisabled]; -// [_finishButton setBackgroundImage:image forState:UIControlStateNormal]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor colorWithHexString:@"#FF60FD"], [ThemeColor colorWithHexString:@"#8974FF"],[ThemeColor colorWithHexString:@"#69EBFF"]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(KScreenWidth - 2*36, 52)]; + _finishButton.backgroundColor = [UIColor colorWithPatternImage:image]; [_finishButton addTarget:self action:@selector(finishButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _finishButton; @@ -185,7 +240,7 @@ _stackView.axis = UILayoutConstraintAxisVertical; _stackView.distribution = UIStackViewDistributionFill; _stackView.alignment = UIStackViewAlignmentFill; - _stackView.spacing = 0; + _stackView.spacing = 20; } return _stackView; } @@ -195,6 +250,9 @@ _phoneView = [[LoginForgetEditView alloc] init]; _phoneView.placeholder = @"请输入手机号"; _phoneView.type = LoginForgetEditViewTypeNormal; + _phoneView.backgroundColor = UIColor.whiteColor; + _phoneView.layer.cornerRadius = 52/2.f; + _phoneView.layer.masksToBounds = YES; } return _phoneView; } @@ -204,7 +262,12 @@ _codeView = [[LoginForgetEditView alloc] init]; _codeView.placeholder = @"请输入验证码"; _codeView.type = LoginForgetEditViewTypeSms; + _codeView.backgroundColor = UIColor.whiteColor; + [_codeView.authCodeButton setTitleColor:[ThemeColor colorWithHexString:@"#9552FF"] forState:UIControlStateNormal]; + _codeView.layer.cornerRadius = 52/2.f; + _codeView.layer.masksToBounds = YES; [_codeView.authCodeButton addTarget:self action:@selector(authCodeButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } return _codeView; } @@ -217,6 +280,9 @@ _passwordView.textField.keyboardType = UIKeyboardTypeASCIICapable; _passwordView.textField.secureTextEntry = YES; _passwordView.textField.clearButtonMode = UITextFieldViewModeAlways; + _passwordView.backgroundColor = UIColor.whiteColor; + _passwordView.layer.cornerRadius = 52/2.f; + _passwordView.layer.masksToBounds = YES; } return _passwordView; } diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginFullInfoViewController.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginFullInfoViewController.m index 9584ba5..2d5c17d 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginFullInfoViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Login/View/LoginFullInfoViewController.m @@ -13,6 +13,8 @@ #import "ThemeColor.h" #import "YMMacro.h" #import "AccountInfoStorage.h" +#import "UIImage+Utils.h" +#import "YMHUDTool.h" ///Model #import "ThirdUserInfo.h" /// presenter @@ -20,6 +22,11 @@ #import "LoginFullInfoProtocol.h" @interface LoginFullInfoViewController () +@property (nonatomic, strong) UIImageView *bgImageView; +@property (nonatomic, strong) UILabel *titleLabel; +/// 返回按钮 +@property (nonatomic, strong) UIButton *backButton; +@property (nonatomic, strong) UIView *textFileBgView; ///输入框 @property (nonatomic,strong) UITextField *textField; ///性别的容器 @@ -37,9 +44,9 @@ @implementation LoginFullInfoViewController -//- (BOOL)isHiddenNavBar { -// return YES; -//} +- (BOOL)isHiddenNavBar { + return YES; +} - (LoginFullInfoPresenter *)createPresenter { return [[LoginFullInfoPresenter alloc] init]; @@ -48,10 +55,11 @@ #pragma mark - Life Cycle - (void)viewDidLoad { [super viewDidLoad]; - self.title = @"填写资料"; +// self.title = @"填写资料"; + self.sexString = @""; [self initSubViews]; [self initSubViewConstraints]; - [self initEvents]; +// [self initEvents]; } #pragma mark - LoginFullInfoProtocol @@ -60,6 +68,10 @@ [self dissMissVC]; } +- (void)requestRandomNickSuccess:(NSString *)nick { + self.textField.text = nick; +} + #pragma mark - Action Event /// 男 - (void)maleButtonAction { @@ -77,6 +89,17 @@ /// 下一步 - (void)nextButtonAction { + if (self.sexString.length == 0 || [self.sexString isEqualToString:@""]) { + [YMHUDTool showErrorWithMessage:@"请选择性别"]; + return; + } + + if (self.textField.text.length == 0 || [self.textField.text isEqualToString:@""]) { + [YMHUDTool showErrorWithMessage:@"请输入昵称"]; + return; + } + + [self updateUserInfo]; } @@ -105,6 +128,7 @@ if (self.textField.text.length > 0 && self.sexString.length > 0) { self.nextButton.enabled = YES; } else { +// [YMHUDTool showErrorWithMessage:@"请填写资料"]; self.nextButton.enabled = NO; } } @@ -117,38 +141,70 @@ while (vc.presentingViewController) { vc = vc.presentingViewController; } - [vc dismissViewControllerAnimated:YES completion:^{ - }]; + [vc dismissViewControllerAnimated:YES completion:nil]; +// NSString * inviteCode = @""; +// [[NSNotificationCenter defaultCenter] postNotificationName:kUserCompleteInfoFinishKey object:inviteCode]; } #pragma mark - Init View - (void)initSubViews { - [self.view addSubview:self.textField]; + [self.view addSubview:self.bgImageView]; + [self.view addSubview:self.backButton]; + [self.view addSubview:self.titleLabel]; + [self.view addSubview:self.textFileBgView]; + [self.textFileBgView addSubview:self.textField]; [self.view addSubview:self.sexStackView]; [self.sexStackView addArrangedSubview:self.maleButton]; [self.sexStackView addArrangedSubview:self.femaleButton]; [self.view addSubview:self.nextButton]; [self initSubViewConstraints]; + if ([self.presenter getThirdUserInfo] && [self.presenter getThirdUserInfo].userName.length > 0) { + self.textField.text = [self.presenter getThirdUserInfo].userName; + } else { + [self.presenter randomRequestNick]; + } } - (void)initSubViewConstraints { - [self.textField mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(kStatusBarHeight + 100); - make.left.mas_equalTo(24); - make.right.mas_equalTo(24); - make.height.mas_equalTo(25); + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.view); }]; + [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.view).mas_offset(10); + make.top.mas_equalTo(statusbarHeight); + make.height.width.mas_equalTo(44); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.backButton); + make.centerX.equalTo(self.view); + }]; + + [self.sexStackView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(self.textField); - make.top.mas_equalTo(self.textField.mas_bottom).offset(15); + make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(60); }]; + [self.textFileBgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.sexStackView.mas_bottom).offset(32); + make.left.mas_equalTo(36); + make.right.mas_equalTo(-36); + make.height.mas_equalTo(52); + }]; + + [self.textField mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.textFileBgView).inset(20); + make.height.mas_equalTo(self.textFileBgView); + }]; + + [self.nextButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.view).inset(52); - make.height.mas_equalTo(45); - make.top.mas_equalTo(self.sexStackView.mas_bottom).offset(75); + make.left.right.mas_equalTo(self.view).inset(36); + make.height.mas_equalTo(52); + make.top.mas_equalTo(self.textField.mas_bottom).offset(40); }]; } @@ -167,25 +223,65 @@ } - - -#pragma mark - Set -- (void)setSexString:(NSString *)sexString { - _sexString = sexString; - [self updateNextButton]; +// 返回 +- (void)backButtonAction { + [self dismissViewControllerAnimated:NO completion:nil]; } + + +#pragma mark - Set +//- (void)setSexString:(NSString *)sexString { +// _sexString = sexString; +// [self updateNextButton]; +//} + + #pragma mark - Get +- (UIImageView *)bgImageView { + if (!_bgImageView) { + _bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mew_home_bg"]]; + } + return _bgImageView; +} + +- (UIButton *)backButton { + if (!_backButton) { + _backButton = [[UIButton alloc] init]; + [_backButton setImage:[UIImage imageNamed:@"common_back_white_left"] forState:UIControlStateNormal]; + [_backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _backButton; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.text = @"填写资料"; + _titleLabel.font = kFontMedium(18); + _titleLabel.textColor = UIColor.whiteColor; + } + return _titleLabel; +} + +- (UIView *)textFileBgView { + if (!_textFileBgView) { + _textFileBgView = [[UIView alloc] init]; + _textFileBgView.layer.cornerRadius = 52/2.f; + _textFileBgView.layer.masksToBounds = YES; + _textFileBgView.backgroundColor = UIColor.whiteColor; + } + return _textFileBgView; +} + - (UITextField *)textField { if (!_textField) { _textField = [[UITextField alloc] init]; _textField.textColor = [ThemeColor mainTextColor]; _textField.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:15.f]; - _textField.borderStyle = UITextBorderStyleNone; -// _textField.tintColor = [ThemeColor appMainColor]; - _textField.textAlignment = NSTextAlignmentRight; - _textField.backgroundColor = [UIColor clearColor]; + _textField.textAlignment = NSTextAlignmentLeft; + _textField.placeholder = @"请输入昵称"; } return _textField; } @@ -204,8 +300,8 @@ - (UIButton *)maleButton { if (!_maleButton) { _maleButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_maleButton setImage:[UIImage imageNamed:@"login_full_info_male_normal"] forState:UIControlStateNormal]; - [_maleButton setImage:[UIImage imageNamed:@"login_full_info_male_select"] forState:UIControlStateSelected]; + [_maleButton setImage:[UIImage imageNamed:@"mew_login_full_man_normal"] forState:UIControlStateNormal]; + [_maleButton setImage:[UIImage imageNamed:@"mew_login_full_man_select"] forState:UIControlStateSelected]; [_maleButton addTarget:self action:@selector(maleButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _maleButton; @@ -214,8 +310,8 @@ - (UIButton *)femaleButton { if (!_femaleButton) { _femaleButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_femaleButton setImage:[UIImage imageNamed:@"login_full_info_female_normal"] forState:UIControlStateNormal]; - [_femaleButton setImage:[UIImage imageNamed:@"login_full_info_female_select"] forState:UIControlStateSelected]; + [_femaleButton setImage:[UIImage imageNamed:@"mew_login_full_waman_normal"] forState:UIControlStateNormal]; + [_femaleButton setImage:[UIImage imageNamed:@"mew_login_full_waman_select"] forState:UIControlStateSelected]; [_femaleButton addTarget:self action:@selector(femaleButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _femaleButton; @@ -225,14 +321,11 @@ if (!_nextButton) { _nextButton = [UIButton buttonWithType:UIButtonTypeCustom]; _nextButton.layer.masksToBounds = YES; - _nextButton.layer.cornerRadius = 45/2.f; - [_nextButton setTitle:@"下一步" forState:UIControlStateNormal]; + _nextButton.layer.cornerRadius = 52/2.f; + [_nextButton setImage:[UIImage imageNamed:@"mew_login_next"] forState:UIControlStateNormal]; _nextButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; -// [_nextButton setTitleColor:[ThemeColor confirmButtonTextColor] forState:UIControlStateNormal]; - _nextButton.enabled = NO; -// UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor confirmButtonGradientStartColor], [ThemeColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; -// [_nextButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[ThemeColor disableButtonColor], [ThemeColor disableButtonColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateDisabled]; -// [_nextButton setBackgroundImage:image forState:UIControlStateNormal]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[ThemeColor colorWithHexString:@"#FF60FD"], [ThemeColor colorWithHexString:@"#8974FF"],[ThemeColor colorWithHexString:@"#69EBFF"]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(KScreenWidth - 2*36, 52)]; + _nextButton.backgroundColor = [UIColor colorWithPatternImage:image]; [_nextButton addTarget:self action:@selector(nextButtonAction) forControlEvents:UIControlEventTouchUpInside]; } return _nextButton; diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.h b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.h index f255ba7..e32735d 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.h +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.h @@ -51,6 +51,43 @@ NS_ASSUME_NONNULL_BEGIN /// @param pageNo 当前页数 /// @param pageSize 一页多少个 + (void)getattentionListCompletion:(HttpRequestHelperCompletion)completion uid:(NSString *)uid pageNo:(NSString *)pageNo pageSize:(NSString *)pageSize; + + +/// 请求充值列表 +/// @param complection 完成 +/// @param channelType channel ++ (void)getRechargeList:(HttpRequestHelperCompletion)complection + channelType:(NSString *)channelType; + +/// 苹果下单 +/// @param complection 完成 +/// @param chargeProdId 充值id +/// @param uid 用户的uid +/// @param ticket ticket +/// @param deviceInfo uuid +/// @param clientIp ip地址 ++ (void)requestIAPRecharge:(HttpRequestHelperCompletion)complection + chargeProdId:(NSString *)chargeProdId + uid:(NSString *)uid + ticket:(NSString *)ticket + deviceInfo:(NSString *)deviceInfo + clientIp:(NSString *)clientIp; + +/// 验证凭据 +/// @param complection 完成 +/// @param receipt base 64 recepit +/// @param chooseEnv @"true" +/// @param chargeRecordId 服务端生成的订单编号 +/// @param transcationId 内购的唯一标识符 +/// @param uid 用户uid +/// @param ticket ticket ++ (void)checkReceipt:(HttpRequestHelperCompletion)complection + receipt:(NSString *)receipt + chooseEnv:(NSString *)chooseEnv + chargeRecordId:(NSString *)chargeRecordId + transcationId:(NSString *)transcationId + uid:(NSString *)uid + ticket:(NSString *)ticket; @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.m index 7d7c788..956bf6a 100644 --- a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.m +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Api/Api+Mine.m @@ -63,4 +63,38 @@ + (void)getattentionListCompletion:(HttpRequestHelperCompletion)completion uid:(NSString *)uid pageNo:(NSString *)pageNo pageSize:(NSString *)pageSize { [self makeRequest:@"fans/following" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, uid, pageNo, pageSize, nil]; } + + + +/// 请求充值列表 +/// @param completion 完成 +/// @param channelType channel ++ (void)getRechargeList:(HttpRequestHelperCompletion)completion channelType:(NSString *)channelType { + [self makeRequest:@"chargeprod/list" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__,channelType, nil]; +} + +/// 苹果下单 +/// @param completion 完成 +/// @param chargeProdId 充值id +/// @param uid 用户的uid +/// @param ticket ticket +/// @param deviceInfo uuid +/// @param clientIp ip地址 ++ (void)requestIAPRecharge:(HttpRequestHelperCompletion)completion chargeProdId:(NSString *)chargeProdId uid:(NSString *)uid ticket:(NSString *)ticket deviceInfo:(NSString *)deviceInfo clientIp:(NSString *)clientIp { + [self makeRequest:@"order/placeV2" method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__,chargeProdId, uid, ticket, deviceInfo, clientIp, nil]; +} + + +/// 验证凭据 +/// @param completion 完成 +/// @param receipt base 64 recepit +/// @param chooseEnv @"true" +/// @param chargeRecordId 服务端生成的订单编号 +/// @param transcationId 内购的唯一标识符 +/// @param uid 用户uid +/// @param ticket ticket ++ (void)checkReceipt:(HttpRequestHelperCompletion)completion receipt:(NSString *)receipt chooseEnv:(NSString *)chooseEnv chargeRecordId:(NSString *)chargeRecordId transcationId:(NSString *)transcationId uid:(NSString *)uid ticket:(NSString *)ticket { + [self makeRequest:@"verify/setiap" method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__,receipt, chooseEnv, chargeRecordId, transcationId, uid, ticket, nil]; +} + @end diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.h b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.h new file mode 100644 index 0000000..f3af315 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.h @@ -0,0 +1,36 @@ +// +// MineRechargePresenter.h +// yinmeng-ios +// +// Created by 触海 on 2023/11/22. +// + +#import "BaseMvpPresenter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MineRechargePresenter : BaseMvpPresenter + +/// 获取钱包信息 +- (void)getUserWalletInfo; +/// 请求内购列表 +/// @param channel 目前是8 +- (void)requestRechargeListWithChannel:(NSString *)channel; + +/// 获取充值的订单编号 +/// @param chargeProdId 苹果服务器的充值 的id +- (void)requestIAPRechargeOrderWithChargeProdId:(NSString *)chargeProdId; + +/// 充值成功二次验证 +/// @param receipt 凭据 +/// @param orderId 订单编号 +/// @param transcationId 商品id +- (void)checkReceiptWithData:(NSString *)receipt orderId:(NSString *)orderId transcationId:(NSString *)transcationId; + +/// 批量验证内购掉单 +/// @param transcations 凭据的数组 +- (void)checkTranscationIds:(NSArray *)transcations; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.m b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.m new file mode 100644 index 0000000..1778d75 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Presenter/MineRechargePresenter.m @@ -0,0 +1,80 @@ +// +// MineRechargePresenter.m +// yinmeng-ios +// +// Created by 触海 on 2023/11/22. +// + +#import "MineRechargePresenter.h" +/// Tool +#import "AccountInfoStorage.h" +#import "YYUtility.h" +#import "NSObject+MJExtension.h" +///Api +#import "Api+Mine.h" +#import "RechargeListModel.h" +#import "WalletInfoModel.h" +#import "MineRechargeProtocol.h" + +@implementation MineRechargePresenter + + +/// 获取钱包信息 +- (void)getUserWalletInfo { + NSString * uid = [AccountInfoStorage instance].getUid; + NSString * ticket = [AccountInfoStorage instance].getTicket; + [Api getUserWalletInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + WalletInfoModel * model = [WalletInfoModel modelWithDictionary:data.data]; + [[self getView] getUserWalletInfo:model]; + }] uid:uid ticket:ticket]; +} + + +/// 请求内购列表 +/// @param channel 目前是8 +- (void)requestRechargeListWithChannel:(NSString *)channel { + [Api getRechargeList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSArray * array = [RechargeListModel modelsWithArray:data.data]; + [[self getView] requestRechargeListSucccess:array]; + }] channelType:channel]; +} + +/// 获取充值的订单编号 +/// @param chargeProdId 苹果服务器的充值 的id +- (void)requestIAPRechargeOrderWithChargeProdId:(NSString *)chargeProdId { + NSString * uid = [AccountInfoStorage instance].getUid; + NSString * ticket = [AccountInfoStorage instance].getTicket; + NSString * deviceInfo = [YYUtility deviceID]; + NSString * clientIp= [YYUtility ipAddress]; + [Api requestIAPRecharge:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSString *orderId = (NSString *)data.data[@"recordId"]; + [[self getView] requestIAPRechargeOrderSuccess:orderId chargeProdId:chargeProdId]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [[self getView] requestIAPRechargeOrderFail]; + }] chargeProdId:chargeProdId uid:uid ticket:ticket deviceInfo:deviceInfo clientIp:clientIp]; +} + + +/// 充值成功二次验证 +/// @param receipt 凭据 +/// @param orderId 订单编号 +/// @param transcationId 商品id +- (void)checkReceiptWithData:(NSString *)receipt orderId:(NSString *)orderId transcationId:(NSString *)transcationId { + NSString * uid = [AccountInfoStorage instance].getUid; + NSString * ticket = [AccountInfoStorage instance].getTicket; + [Api checkReceipt:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView] checkReceiptSuccess:transcationId]; + } showLoading:YES] receipt:receipt chooseEnv:@"true" chargeRecordId:orderId transcationId:transcationId uid:uid ticket:ticket]; +} + + +/// 批量验证内购掉单 +/// @param transcations 凭据的数组 +- (void)checkTranscationIds:(NSArray *)transcations { + NSString * transcationIdStr = [transcations toJSONString]; + [Api requestCheckTranscationIds:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView] checkTranscationIdsSuccess]; + }] transcationIdStr:transcationIdStr]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Protocol/MineRechargeProtocol.h b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Protocol/MineRechargeProtocol.h new file mode 100644 index 0000000..c03ef8a --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/YinMeng/Mine/Protocol/MineRechargeProtocol.h @@ -0,0 +1,27 @@ +// +// MineRechargeProtocol.h +// yinmeng-ios +// +// Created by 触海 on 2023/11/22. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol MineRechargeProtocol +///请求钱包余额信息 +- (void)getUserWalletInfo:(WalletInfoModel *)balanceInfo; +///请求充值列表成功 +- (void)requestRechargeListSucccess:(NSArray *)list; +///请求充值id的状态成功 +- (void)requestIAPRechargeOrderSuccess:(NSString *)orderId chargeProdId:(NSString *)chargeProdId; +///请求充值账单失败 +- (void)requestIAPRechargeOrderFail; +///二次校验成功 +- (void)checkReceiptSuccess:(NSString *)transcationId; +///批量验证凭据成功 +- (void)checkTranscationIdsSuccess; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/yinmeng-ios.entitlements b/yinmeng-ios/yinmeng-ios/yinmeng-ios.entitlements new file mode 100644 index 0000000..a812db5 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/yinmeng-ios.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.applesignin + + Default + + +