From 3efde8e0ea1048236c286bf3c7907bfb3f2e0c0f Mon Sep 17 00:00:00 2001 From: lianxiang <13052344590@163.com> Date: Thu, 30 Aug 2018 18:07:16 +0800 Subject: [PATCH] add files apis --- GIGA.xcodeproj/project.pbxproj | 38 ++- GIGA/Assets.xcassets/login/Contents.json | 6 + .../login/btn_back.imageset/Contents.json | 22 ++ .../login/btn_back.imageset/btn_back@2x.png | Bin 0 -> 1582 bytes .../login/btn_back.imageset/btn_back@3x.png | Bin 0 -> 2607 bytes .../login/btn_load.imageset/Contents.json | 22 ++ .../login/btn_load.imageset/btn_load@2x.png | Bin 0 -> 2751 bytes .../login/btn_load.imageset/btn_load@3x.png | Bin 0 -> 4698 bytes .../btn_moment_back.imageset/Contents.json | 22 ++ .../btn_moment_back@2x.png | Bin 0 -> 1016 bytes .../btn_moment_back@3x.png | Bin 0 -> 1520 bytes .../btn_tab_desplay.imageset/Contents.json | 22 ++ .../btn_tab_desplay@2x.png | Bin 0 -> 1894 bytes .../btn_tab_desplay@3x.png | Bin 0 -> 3024 bytes .../btn_tab_notselect.imageset/Contents.json | 22 ++ .../btn_tab_notselect@2x.png | Bin 0 -> 1370 bytes .../btn_tab_notselect@3x.png | Bin 0 -> 2088 bytes .../login/btn_wechat.imageset/Contents.json | 22 ++ .../btn_wechat.imageset/btn_wechat@2x.png | Bin 0 -> 1855 bytes .../btn_wechat.imageset/btn_wechat@3x.png | Bin 0 -> 3046 bytes .../login/ic_number.imageset/Contents.json | 22 ++ .../login/ic_number.imageset/ic_number@2x.png | Bin 0 -> 596 bytes .../login/ic_number.imageset/ic_number@3x.png | Bin 0 -> 857 bytes .../login/ic_wechat.imageset/Contents.json | 22 ++ .../login/ic_wechat.imageset/ic_wechat@2x.png | Bin 0 -> 1471 bytes .../login/ic_wechat.imageset/ic_wechat@3x.png | Bin 0 -> 2256 bytes .../login/icon_key.imageset/Contents.json | 22 ++ .../login/icon_key.imageset/icon_key@2x.png | Bin 0 -> 1417 bytes .../login/icon_key.imageset/icon_key@3x.png | Bin 0 -> 2267 bytes .../img_circle_avatar.imageset/Contents.json | 22 ++ .../img_circle_avatar@2x.png | Bin 0 -> 8136 bytes .../img_circle_avatar@3x.png | Bin 0 -> 13474 bytes .../Contents.json | 4 + .../Contents.json | 4 + GIGA/Category/GiGaAttributedLabel.h | 19 ++ GIGA/Category/GiGaAttributedLabel.m | 21 ++ GIGA/Category/NSTimer+Convenience.h | 50 ++++ GIGA/Category/NSTimer+Convenience.m | 78 +++++++ GIGA/Category/UINavigationBar+Custom.m | 4 +- .../Common/BaseVC/GiGaBaseNavViewController.m | 17 +- GIGA/Common/BaseVC/GiGaBaseViewController.m | 2 +- .../GiGaLocalNotificationManager.m | 10 +- GIGA/Common/GiGaNetTool/GiGaAPIRequest.h | 71 ------ GIGA/Common/GiGaNetTool/GiGaAPIRequest.m | 81 ------- GIGA/Common/GiGaNetTool/GiGaAPIResult.h | 4 +- GIGA/Common/GiGaNetTool/GiGaAPIResult.m | 12 +- GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.h | 134 +++++++++++ GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.m | 163 +++++++++++++ GIGA/Common/GiGaNetTool/GiGaNetManager.h | 15 +- GIGA/Common/GiGaNetTool/GiGaNetManager.m | 106 +++++++-- GIGA/Common/GiGaUserDB/GiGaUserDefault.h | 5 +- GIGA/Common/GiGaUserDB/GiGaUserDefault.m | 15 +- GIGA/Config/GIGA.h | 4 + GIGA/Config/GiGaServerConfig.m | 2 +- GIGA/GIGA.pch | 2 + GIGA/Info.plist | 19 +- .../LogIn/APi/RegistGetSMSCodeRequest.h | 13 ++ .../LogIn/APi/RegistGetSMSCodeRequest.m | 13 ++ .../Controller/GiGaRegistViewController.m | 126 +++++++++- .../Controller/GiGaRegistViewController.xib | 8 +- .../LogIn/Controller/GiGaUserLoginVC.m | 105 +++++++-- .../LogIn/Controller/GiGaUserLoginVC.xib | 221 +++++++++--------- .../LogIn/Controller/PassWordResetVC.m | 3 +- .../Mask/Controller/GiGaFlingCommitVC.m | 2 + .../Controller/GiGaMaskTaskViewController.m | 8 +- GIGA/Modules/Mask/View/GiGaCommentView.m | 5 +- .../Mask/View/GiGaFlyingCommitInputView.m | 14 +- GIGA/Modules/Me/Model/GiGaUser.h | 4 +- 68 files changed, 1254 insertions(+), 374 deletions(-) create mode 100644 GIGA/Assets.xcassets/login/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_back.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_back.imageset/btn_back@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_back.imageset/btn_back@3x.png create mode 100644 GIGA/Assets.xcassets/login/btn_load.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_load.imageset/btn_load@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_load.imageset/btn_load@3x.png create mode 100644 GIGA/Assets.xcassets/login/btn_moment_back.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_moment_back.imageset/btn_moment_back@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_moment_back.imageset/btn_moment_back@3x.png create mode 100644 GIGA/Assets.xcassets/login/btn_tab_desplay.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_tab_desplay.imageset/btn_tab_desplay@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_tab_desplay.imageset/btn_tab_desplay@3x.png create mode 100644 GIGA/Assets.xcassets/login/btn_tab_notselect.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_tab_notselect.imageset/btn_tab_notselect@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_tab_notselect.imageset/btn_tab_notselect@3x.png create mode 100644 GIGA/Assets.xcassets/login/btn_wechat.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/btn_wechat.imageset/btn_wechat@2x.png create mode 100644 GIGA/Assets.xcassets/login/btn_wechat.imageset/btn_wechat@3x.png create mode 100644 GIGA/Assets.xcassets/login/ic_number.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/ic_number.imageset/ic_number@2x.png create mode 100644 GIGA/Assets.xcassets/login/ic_number.imageset/ic_number@3x.png create mode 100644 GIGA/Assets.xcassets/login/ic_wechat.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/ic_wechat.imageset/ic_wechat@2x.png create mode 100644 GIGA/Assets.xcassets/login/ic_wechat.imageset/ic_wechat@3x.png create mode 100644 GIGA/Assets.xcassets/login/icon_key.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/icon_key.imageset/icon_key@2x.png create mode 100644 GIGA/Assets.xcassets/login/icon_key.imageset/icon_key@3x.png create mode 100644 GIGA/Assets.xcassets/login/img_circle_avatar.imageset/Contents.json create mode 100644 GIGA/Assets.xcassets/login/img_circle_avatar.imageset/img_circle_avatar@2x.png create mode 100644 GIGA/Assets.xcassets/login/img_circle_avatar.imageset/img_circle_avatar@3x.png create mode 100644 GIGA/Category/GiGaAttributedLabel.h create mode 100644 GIGA/Category/GiGaAttributedLabel.m create mode 100644 GIGA/Category/NSTimer+Convenience.h create mode 100644 GIGA/Category/NSTimer+Convenience.m delete mode 100644 GIGA/Common/GiGaNetTool/GiGaAPIRequest.h delete mode 100644 GIGA/Common/GiGaNetTool/GiGaAPIRequest.m create mode 100644 GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.h create mode 100644 GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.m create mode 100644 GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.h create mode 100644 GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.m diff --git a/GIGA.xcodeproj/project.pbxproj b/GIGA.xcodeproj/project.pbxproj index f445430..1ff3679 100644 --- a/GIGA.xcodeproj/project.pbxproj +++ b/GIGA.xcodeproj/project.pbxproj @@ -29,7 +29,6 @@ 8357ADC52123BEBD000816F2 /* GiGaUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADC42123BEBD000816F2 /* GiGaUser.m */; }; 8357ADC92123BFCA000816F2 /* GiGaUserManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADC82123BFCA000816F2 /* GiGaUserManager.m */; }; 8357ADCD2123C091000816F2 /* GiGaNetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADCC2123C091000816F2 /* GiGaNetManager.m */; }; - 8357ADD02123C5F7000816F2 /* GiGaAPIRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADCF2123C5F7000816F2 /* GiGaAPIRequest.m */; }; 8357ADD32123C7C6000816F2 /* GiGaAPIResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADD22123C7C6000816F2 /* GiGaAPIResult.m */; }; 8357ADD52123F5EC000816F2 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8357ADD42123F5EC000816F2 /* libsqlite3.tbd */; }; 8357ADD82124027D000816F2 /* GiGaUserDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = 8357ADD72124027D000816F2 /* GiGaUserDefault.m */; }; @@ -59,6 +58,9 @@ 8361B4322121832800238FEB /* GiGaBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8361B4312121832800238FEB /* GiGaBaseViewController.m */; }; 8361B4352121836700238FEB /* GiGaBaseNavViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8361B4342121836700238FEB /* GiGaBaseNavViewController.m */; }; 8361B4382121847600238FEB /* UINavigationBar+Custom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8361B4372121847600238FEB /* UINavigationBar+Custom.m */; }; + 836EE5D42136454500F0ABB2 /* RegistGetSMSCodeRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D32136454500F0ABB2 /* RegistGetSMSCodeRequest.m */; }; + 836EE5D7213645E300F0ABB2 /* GiGaBaseAPiRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D6213645E300F0ABB2 /* GiGaBaseAPiRequest.m */; }; + 836EE5DA2136716100F0ABB2 /* NSTimer+Convenience.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D82136716000F0ABB2 /* NSTimer+Convenience.m */; }; 83835BA0212E43BD001480F2 /* GiGaMasssagesVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 83835B9F212E43BD001480F2 /* GiGaMasssagesVC.m */; }; 83835BA7212E4748001480F2 /* MAssaageCenterCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83835BA5212E4748001480F2 /* MAssaageCenterCell.m */; }; 83835BA8212E4748001480F2 /* MAssaageCenterCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 83835BA6212E4748001480F2 /* MAssaageCenterCell.xib */; }; @@ -79,6 +81,7 @@ 838388D3212FB7D700D14C53 /* JXTAlertController.m in Sources */ = {isa = PBXBuildFile; fileRef = 838388CE212FB7D700D14C53 /* JXTAlertController.m */; }; 838388D4212FB7D700D14C53 /* JXTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 838388D2212FB7D700D14C53 /* JXTAlertView.m */; }; 838388DA2130046D00D14C53 /* emojizone.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 838388D92130046D00D14C53 /* emojizone.mp4 */; }; + 838500DC2137F3F7003514A3 /* GiGaAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 838500DB2137F3F7003514A3 /* GiGaAttributedLabel.m */; }; 83928FFA2134D8F60077D2E8 /* GiGaFlyingCommitInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83928FF92134D8F60077D2E8 /* GiGaFlyingCommitInputView.m */; }; 83928FFE2134F37D0077D2E8 /* GiGaSocketRocketUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 83928FFD2134F37D0077D2E8 /* GiGaSocketRocketUtility.m */; }; 839290052134F4240077D2E8 /* LXDanMuTrackView.m in Sources */ = {isa = PBXBuildFile; fileRef = 839290002134F4230077D2E8 /* LXDanMuTrackView.m */; }; @@ -151,8 +154,6 @@ 8357ADC82123BFCA000816F2 /* GiGaUserManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaUserManager.m; sourceTree = ""; }; 8357ADCB2123C091000816F2 /* GiGaNetManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaNetManager.h; sourceTree = ""; }; 8357ADCC2123C091000816F2 /* GiGaNetManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaNetManager.m; sourceTree = ""; }; - 8357ADCE2123C5F7000816F2 /* GiGaAPIRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaAPIRequest.h; sourceTree = ""; }; - 8357ADCF2123C5F7000816F2 /* GiGaAPIRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaAPIRequest.m; sourceTree = ""; }; 8357ADD12123C7C6000816F2 /* GiGaAPIResult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaAPIResult.h; sourceTree = ""; }; 8357ADD22123C7C6000816F2 /* GiGaAPIResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaAPIResult.m; sourceTree = ""; }; 8357ADD42123F5EC000816F2 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; @@ -202,6 +203,12 @@ 8361B4342121836700238FEB /* GiGaBaseNavViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaBaseNavViewController.m; sourceTree = ""; }; 8361B4362121847600238FEB /* UINavigationBar+Custom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UINavigationBar+Custom.h"; sourceTree = ""; }; 8361B4372121847600238FEB /* UINavigationBar+Custom.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UINavigationBar+Custom.m"; sourceTree = ""; }; + 836EE5D22136454500F0ABB2 /* RegistGetSMSCodeRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RegistGetSMSCodeRequest.h; sourceTree = ""; }; + 836EE5D32136454500F0ABB2 /* RegistGetSMSCodeRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RegistGetSMSCodeRequest.m; sourceTree = ""; }; + 836EE5D5213645E300F0ABB2 /* GiGaBaseAPiRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaBaseAPiRequest.h; sourceTree = ""; }; + 836EE5D6213645E300F0ABB2 /* GiGaBaseAPiRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaBaseAPiRequest.m; sourceTree = ""; }; + 836EE5D82136716000F0ABB2 /* NSTimer+Convenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+Convenience.m"; sourceTree = ""; }; + 836EE5D92136716000F0ABB2 /* NSTimer+Convenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+Convenience.h"; sourceTree = ""; }; 83835B9E212E43BD001480F2 /* GiGaMasssagesVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaMasssagesVC.h; sourceTree = ""; }; 83835B9F212E43BD001480F2 /* GiGaMasssagesVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaMasssagesVC.m; sourceTree = ""; }; 83835BA4212E4748001480F2 /* MAssaageCenterCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MAssaageCenterCell.h; sourceTree = ""; }; @@ -238,6 +245,8 @@ 838388D1212FB7D700D14C53 /* JXTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JXTAlertView.h; sourceTree = ""; }; 838388D2212FB7D700D14C53 /* JXTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JXTAlertView.m; sourceTree = ""; }; 838388D92130046D00D14C53 /* emojizone.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = emojizone.mp4; sourceTree = ""; }; + 838500DA2137F3F7003514A3 /* GiGaAttributedLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaAttributedLabel.h; sourceTree = ""; }; + 838500DB2137F3F7003514A3 /* GiGaAttributedLabel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaAttributedLabel.m; sourceTree = ""; }; 83928FF82134D8F60077D2E8 /* GiGaFlyingCommitInputView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaFlyingCommitInputView.h; sourceTree = ""; }; 83928FF92134D8F60077D2E8 /* GiGaFlyingCommitInputView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaFlyingCommitInputView.m; sourceTree = ""; }; 83928FFC2134F37D0077D2E8 /* GiGaSocketRocketUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiGaSocketRocketUtility.h; sourceTree = ""; }; @@ -419,12 +428,12 @@ children = ( 8357ADCB2123C091000816F2 /* GiGaNetManager.h */, 8357ADCC2123C091000816F2 /* GiGaNetManager.m */, - 8357ADCE2123C5F7000816F2 /* GiGaAPIRequest.h */, - 8357ADCF2123C5F7000816F2 /* GiGaAPIRequest.m */, 8357ADD12123C7C6000816F2 /* GiGaAPIResult.h */, 8357ADD22123C7C6000816F2 /* GiGaAPIResult.m */, 8314D20F2133ABE500B458BF /* WeiIXinApiManager.h */, 8314D2102133ABE500B458BF /* WeiIXinApiManager.m */, + 836EE5D5213645E300F0ABB2 /* GiGaBaseAPiRequest.h */, + 836EE5D6213645E300F0ABB2 /* GiGaBaseAPiRequest.m */, ); path = GiGaNetTool; sourceTree = ""; @@ -529,6 +538,8 @@ 8361B3FE21215C8A00238FEB /* Category */ = { isa = PBXGroup; children = ( + 836EE5D92136716000F0ABB2 /* NSTimer+Convenience.h */, + 836EE5D82136716000F0ABB2 /* NSTimer+Convenience.m */, 83A22711212A9EA900B3E75C /* UIView+Sizes.h */, 83A22710212A9EA900B3E75C /* UIView+Sizes.m */, 8361B4362121847600238FEB /* UINavigationBar+Custom.h */, @@ -537,6 +548,8 @@ 83A22717212ABDFF00B3E75C /* GiGaBlockButton.m */, 83835BCB212E856A001480F2 /* NSString+MD5.h */, 83835BCC212E856A001480F2 /* NSString+MD5.m */, + 838500DA2137F3F7003514A3 /* GiGaAttributedLabel.h */, + 838500DB2137F3F7003514A3 /* GiGaAttributedLabel.m */, ); path = Category; sourceTree = ""; @@ -644,6 +657,15 @@ path = BaseVC; sourceTree = ""; }; + 836EE5D121363C9A00F0ABB2 /* APi */ = { + isa = PBXGroup; + children = ( + 836EE5D22136454500F0ABB2 /* RegistGetSMSCodeRequest.h */, + 836EE5D32136454500F0ABB2 /* RegistGetSMSCodeRequest.m */, + ); + path = APi; + sourceTree = ""; + }; 83835B9D212E4335001480F2 /* MessageCenter */ = { isa = PBXGroup; children = ( @@ -831,6 +853,7 @@ 83E40B2C21218B7E008149C4 /* LogIn */ = { isa = PBXGroup; children = ( + 836EE5D121363C9A00F0ABB2 /* APi */, 83A2271B212AC81800B3E75C /* Controller */, 83A2271A212AC80D00B3E75C /* Model */, 83A22719212AC7FC00B3E75C /* View */, @@ -1089,6 +1112,7 @@ 83346AC5212BBC8C0054D597 /* GiGaRegistViewController.m in Sources */, 83346AD7212C18F50054D597 /* GiGaAppGaurdVC.m in Sources */, 8349585C212511040064DB6C /* AppDelegate+ThirdParty.m in Sources */, + 838500DC2137F3F7003514A3 /* GiGaAttributedLabel.m in Sources */, 8314D2112133ABE500B458BF /* WeiIXinApiManager.m in Sources */, 83835BCA212E8045001480F2 /* GIGAQuetionView.m in Sources */, 8361B3CE212155C200238FEB /* ViewController.m in Sources */, @@ -1110,7 +1134,7 @@ 83928FFA2134D8F60077D2E8 /* GiGaFlyingCommitInputView.m in Sources */, 838388D3212FB7D700D14C53 /* JXTAlertController.m in Sources */, 833DA7762122A62000A5C614 /* GiGaMaskTaskViewController.m in Sources */, - 8357ADD02123C5F7000816F2 /* GiGaAPIRequest.m in Sources */, + 836EE5D7213645E300F0ABB2 /* GiGaBaseAPiRequest.m in Sources */, 83835BD0212E8B9C001480F2 /* GiGaQuestionModel.m in Sources */, 83835BAF212E4FCD001480F2 /* MessageListViewCell.m in Sources */, 8361B3D9212155C300238FEB /* main.m in Sources */, @@ -1135,7 +1159,9 @@ 835060A5212D3536007E6220 /* AppDelegate+GiGaConfig.m in Sources */, 83E40B2B21218B6F008149C4 /* GiGaExercisesViewController.m in Sources */, 83835BA7212E4748001480F2 /* MAssaageCenterCell.m in Sources */, + 836EE5D42136454500F0ABB2 /* RegistGetSMSCodeRequest.m in Sources */, 8361B42E2121812000238FEB /* GiGaServerConfig.m in Sources */, + 836EE5DA2136716100F0ABB2 /* NSTimer+Convenience.m in Sources */, 83A22712212A9EA900B3E75C /* UIView+Sizes.m in Sources */, 839290092134F4C40077D2E8 /* GiGaFlingCommitVC.m in Sources */, 83A22718212ABDFF00B3E75C /* GiGaBlockButton.m in Sources */, diff --git a/GIGA/Assets.xcassets/login/Contents.json b/GIGA/Assets.xcassets/login/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/GIGA/Assets.xcassets/login/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/btn_back.imageset/Contents.json b/GIGA/Assets.xcassets/login/btn_back.imageset/Contents.json new file mode 100644 index 0000000..130483e --- /dev/null +++ b/GIGA/Assets.xcassets/login/btn_back.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "btn_back@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "btn_back@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/btn_back.imageset/btn_back@2x.png b/GIGA/Assets.xcassets/login/btn_back.imageset/btn_back@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..15675b5b5e5471ed8fd78a608d73d568f4fc9ba2 GIT binary patch literal 1582 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 literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/btn_load.imageset/btn_load@3x.png b/GIGA/Assets.xcassets/login/btn_load.imageset/btn_load@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8786bc3a8c71aaedf567b1d85e0e1a7970088b28 GIT binary patch literal 4698 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 literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/btn_moment_back.imageset/Contents.json b/GIGA/Assets.xcassets/login/btn_moment_back.imageset/Contents.json new file mode 100644 index 0000000..e67fafe --- /dev/null +++ b/GIGA/Assets.xcassets/login/btn_moment_back.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "btn_moment_back@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "btn_moment_back@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/btn_moment_back.imageset/btn_moment_back@2x.png b/GIGA/Assets.xcassets/login/btn_moment_back.imageset/btn_moment_back@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d33febda5eb844ad02bebeadb2dc20002f7284f1 GIT binary patch literal 1016 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 literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/btn_tab_desplay.imageset/btn_tab_desplay@3x.png b/GIGA/Assets.xcassets/login/btn_tab_desplay.imageset/btn_tab_desplay@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..011c0196d2efeed0fa2d4d40cb784bc6fe2e200c GIT binary patch literal 3024 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 E2X9o8;s5{u literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/ic_number.imageset/Contents.json b/GIGA/Assets.xcassets/login/ic_number.imageset/Contents.json new file mode 100644 index 0000000..cd292cf --- /dev/null +++ b/GIGA/Assets.xcassets/login/ic_number.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_number@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_number@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/ic_number.imageset/ic_number@2x.png b/GIGA/Assets.xcassets/login/ic_number.imageset/ic_number@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1e753b063a811bd9acfdd185e01fcdf3827884 GIT binary patch literal 596 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 Xub~KRVUewg00000NkvXXu0mjf+)=nk literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/icon_key.imageset/icon_key@3x.png b/GIGA/Assets.xcassets/login/icon_key.imageset/icon_key@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b575c1494b771beb5ca83f19a83d839bfac24c74 GIT binary patch literal 2267 zcmV<12qgE3P)Px-l}SWFRA>e5nSX3s)fLD6o@+ZvSxOs3$vT>plEUaH+UV#XYnmT+Lf+R;hWX+zy?coed$+yUp{wb@W+Ms-NRH9y+h`?}@6a zswc_?R}v6F76IfZ0NH?pa48_uw14C}&ch4q>wmF)`SKIf==kCp0d*yl8<~z@0_JnJ z5r6ca*Gt>q9M9{c{z)zrA|~Eh=q-a=MW01>AK}qE#E3SuCK9g}w`qM!KnD*Vj0_D8 zZ6`7tRZ%DgkKlA$w7U9_Ou>NNR?MeTsTJtofQ_4q26O^LwY5w}KaRl8?+L*=3($&?~0;nCd zpQBPhZAAAmtqUyxgp+&e^fOhUap&U3#_OA!n#NQ{UR_D<+=5|=pr7P8&rqMEI&L_8 zbzNQEOP>r5E^JOD-cosYcXwkhn@yp+RAlrU$H3R@oH8NYn@nCTt4TYfoSZj*{(1!? zq3=v4|HQC&V{i?tW;+(!t3siM_INy2Gk0!HBpSVlQMc6A*6tb{9Q@vx=N)E{x2nyy zwzfX{#IgN>$gmU1ghEdO6f+aWj4I=i>Z7MgxW^dIyl}K+{dtg)YlwGMnK2nenHrJC#ag zJuj&p8RZppd_n6(<~Bxl5Aqw^+uQf5{B&q%Dka;=-FX|sRn^t!%I4_ReE+v4k&@glt2zQ%H?};;CP}kxx!I z9R8w<_lwm%{L9ME79{}2C!o%geW<~5{%?z)6_y~psgBqt7Lr2Vd=+r1`cV1Vq5v3F zU#{!cu+KUE(ib5J3(g-^43t`jHNgo>gv^fX=5n=xI-lCOzYj?hhxBom@c3CSf~?~- z3Z2bDK$fUKmf1(L?B7rUYwuFS&k{pYe_35|l{qSaUQq!w@FTp|18k&*TI^cNLi-j$nx%WnA^l7Fdl?i+V0A0!1xIOlnHst+(c zE&Rj<&2_hF14=g&rSr5N6y;8I1Gby;_Om4Pqr&@u*pU7Jud6M3!t)-{P>RxLUAVl- zz1rL=n678IP5L{w4~WVr%zf&Z%#U+R{DIa#ODaz+ZiqWr(RE@MFrUteM82y&d_YoZ z@921%#^<$x%l-rQeOTqELy63s;h~|Y7;uZR<2ajJT3U2=Cf`Y-5RJud1k@o_2Gnl= z^+Tr50N1uk>A_@j9+CMowyx2>_z@QjIuP1MMw2A8=Nki|&+aiIB<7NG3BaaJ6OAvH_Lr=-9DiCW_){G^hyiA~DgK$x$p8E6}4J zOoYk0}f$LR`QLM$W1Ipd2wWeRhdj zOCEWS;~`_Wm*UG#Y8(}8gsh}{cv$W%c902&O@vs96-7sEl?@0-M{yv(R!kPpyJ)g9 z!P%Q4d`0;q7Rm-Bq2~x##S!vz3q(w|1FIh5^*b3M>!`7HX5z~RbolV$7zrTMa&Mvc^GlhR`ZEYR4WjWV15#oLkTn+)oj>K@7-vqe@tN~QP zy@r>k0Yo$_j*$7C+8*Upyg0HxatyR35>HK~XHQw6tBkLNX5=$Dvh@I5afHfFYK)s` z5``sfiWg25A!POj8XO==VE#t(AZl50yIE4h5Ig>_dHI@3#TvCoxf4 z`l;vHdy&;Its#l7d%Xle8miZakOr{q-^FAj^qnuaY=c%)Uwga@C zo41qZ#BFZr==et|yT$Eg1Coxi%vo7miOzMlApyozRpn(lKJ;D1qfov;R$M9qq}KCq z_w9g?Z*2vIA0+PP?f&ZmVFi^_0wnhR@A2uhMC*F>M`X4VnbZ2w^ppW92%^=-%J?Sr p*V^LoUom~w8LV3Wr~ktd_%AM3W9213l3)M;002ovPDHLkV1f$lbr}Ev literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/login/img_circle_avatar.imageset/Contents.json b/GIGA/Assets.xcassets/login/img_circle_avatar.imageset/Contents.json new file mode 100644 index 0000000..41d853b --- /dev/null +++ b/GIGA/Assets.xcassets/login/img_circle_avatar.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "img_circle_avatar@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "img_circle_avatar@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/img_circle_avatar.imageset/img_circle_avatar@2x.png b/GIGA/Assets.xcassets/login/img_circle_avatar.imageset/img_circle_avatar@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0933fe9a5afdfca3b8a723ffd17884f70c21fbbf GIT binary patch literal 8136 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

78nWehVFEACinr5t%<}MEy+`qZ!E6ZST%Edd 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 aH%hjf-wU1yWtRZ(FKu-LwQ3dHsQ&?bQOBA9 literal 0 HcmV?d00001 diff --git a/GIGA/Assets.xcassets/maskTime/exerc_answer_option_nor.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/exerc_answer_option_nor.imageset/Contents.json index db7bdf5..94052a8 100644 --- a/GIGA/Assets.xcassets/maskTime/exerc_answer_option_nor.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/exerc_answer_option_nor.imageset/Contents.json @@ -1,5 +1,9 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "exerc_answer_option_nor@2x.png", diff --git a/GIGA/Assets.xcassets/maskTime/exerc_answer_option_sel.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/exerc_answer_option_sel.imageset/Contents.json index 7234bb0..8cb9d81 100644 --- a/GIGA/Assets.xcassets/maskTime/exerc_answer_option_sel.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/exerc_answer_option_sel.imageset/Contents.json @@ -1,5 +1,9 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "exerc_answer_option_sel@2x.png", diff --git a/GIGA/Category/GiGaAttributedLabel.h b/GIGA/Category/GiGaAttributedLabel.h new file mode 100644 index 0000000..9c6bf33 --- /dev/null +++ b/GIGA/Category/GiGaAttributedLabel.h @@ -0,0 +1,19 @@ +// +// GiGaAttributedLabel.h +// GIGA +// +// Created by lianxiang on 2018/8/30. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import +#ifndef IB_DESIGNABLE +#define IB_DESIGNABLE +#endif + +@class TTTAttributedLabel; +IB_DESIGNABLE @interface GiGaAttributedLabel : TTTAttributedLabel{ + +} + +@end diff --git a/GIGA/Category/GiGaAttributedLabel.m b/GIGA/Category/GiGaAttributedLabel.m new file mode 100644 index 0000000..7152537 --- /dev/null +++ b/GIGA/Category/GiGaAttributedLabel.m @@ -0,0 +1,21 @@ +// +// GiGaAttributedLabel.m +// GIGA +// +// Created by lianxiang on 2018/8/30. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GiGaAttributedLabel.h" + +@implementation GiGaAttributedLabel + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/GIGA/Category/NSTimer+Convenience.h b/GIGA/Category/NSTimer+Convenience.h new file mode 100644 index 0000000..fea6710 --- /dev/null +++ b/GIGA/Category/NSTimer+Convenience.h @@ -0,0 +1,50 @@ +// +// NSTimer+Convenience.h +// ISCTest +// +// Created by imac on 16/3/23. +// Copyright © 2016年 xiang. All rights reserved. +// + +#import + +@interface NSTimer (Convenience) +typedef void (^LXVoidBlock)(void); + +/** + * 创建Timer---Block版本 + * + * @param interval 每隔interval秒就回调一次callback + * @param repeats 是否重复 + * @param callback 回调block + * + * @return NSTimer对象 + */ ++ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + repeats:(BOOL)repeats + callback:(LXVoidBlock)callback; + +/** + * 创建Timer---Block版本 + * + * @param interval 每隔interval秒就回调一次callback + * @param count 回调多少次后自动暂停,如果count <= 0,则表示无限次,否则表示具体的次数 + * @param callback 回调block + * + * @return NSTimer对象 + */ ++ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + count:(NSInteger)count + callback:(LXVoidBlock)callback; +/** + * 开始启动定时器 + */ +- (void)fireTimer; + +/** + * 暂停定时器 + */ +- (void)unfireTimer; + + +@end diff --git a/GIGA/Category/NSTimer+Convenience.m b/GIGA/Category/NSTimer+Convenience.m new file mode 100644 index 0000000..35d5e24 --- /dev/null +++ b/GIGA/Category/NSTimer+Convenience.m @@ -0,0 +1,78 @@ +// +// NSTimer+Convenience.m +// ISCTest +// +// Created by imac on 16/3/23. +// Copyright © 2016年 xiang. All rights reserved. +// + +#import "NSTimer+Convenience.h" + +@implementation NSTimer (Convenience) + ++ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + repeats:(BOOL)repeats + callback:(LXVoidBlock)callback { + return [NSTimer scheduledTimerWithTimeInterval:interval + target:self + selector:@selector(onTimerUpdateBlock:) + userInfo:[callback copy] + repeats:repeats]; +} + ++ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + count:(NSInteger)count + callback:(LXVoidBlock)callback { + NSDictionary *userInfo = @{@"callback" : [callback copy], + @"count" : @(count)}; + return [NSTimer scheduledTimerWithTimeInterval:interval + target:self + selector:@selector(onTimerUpdateCountBlock:) + userInfo:userInfo + repeats:YES]; +} + ++ (void)onTimerUpdateBlock:(NSTimer *)timer { + LXVoidBlock block = timer.userInfo; + + if (block) { + block(); + } +} + ++ (void)onTimerUpdateCountBlock:(NSTimer *)timer { + static NSUInteger currentCount = 0; + + NSDictionary *userInfo = timer.userInfo; + LXVoidBlock callback = userInfo[@"callback"]; + NSNumber *count = userInfo[@"count"]; + + if (count.integerValue <= 0) { + if (callback) { + callback(); + } + } else { + if (currentCount < count.integerValue) { + currentCount++; + if (callback) { + callback(); + } + } else { + currentCount = 0; + + [timer unfireTimer]; + [timer invalidate]; + timer = nil; + } + } +} + +- (void)fireTimer { + [self setFireDate:[NSDate distantPast]]; +} + +- (void)unfireTimer { + [self setFireDate:[NSDate distantFuture]]; +} + +@end diff --git a/GIGA/Category/UINavigationBar+Custom.m b/GIGA/Category/UINavigationBar+Custom.m index 0afce13..b116ef3 100644 --- a/GIGA/Category/UINavigationBar+Custom.m +++ b/GIGA/Category/UINavigationBar+Custom.m @@ -56,8 +56,8 @@ static char overlayKey; -(void)resetBackgroundImage{ - [self setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault]; - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO]; + //[self setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault]; + //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO]; } diff --git a/GIGA/Common/BaseVC/GiGaBaseNavViewController.m b/GIGA/Common/BaseVC/GiGaBaseNavViewController.m index a55bd63..a44be06 100644 --- a/GIGA/Common/BaseVC/GiGaBaseNavViewController.m +++ b/GIGA/Common/BaseVC/GiGaBaseNavViewController.m @@ -36,12 +36,13 @@ if (self.viewControllers.count > 1 ) { //自定义返回按钮 UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; - [backBtn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; - backBtn.backgroundColor = [UIColor redColor]; + backBtn.frame = CGRectMake(0, 0, 40, 40); + [backBtn setImage:[UIImage imageNamed:@"btn_moment_back"] forState:UIControlStateNormal]; + [backBtn setImageEdgeInsets:UIEdgeInsetsMake(0,-14, 0, 14)]; + //backBtn.backgroundColor = [UIColor redColor]; [backBtn addTarget:self action:@selector(backItemAction) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backBtn]; viewController.navigationItem.leftBarButtonItem = backItem; - } } @@ -55,14 +56,4 @@ // Dispose of any resources that can be recreated. } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - @end diff --git a/GIGA/Common/BaseVC/GiGaBaseViewController.m b/GIGA/Common/BaseVC/GiGaBaseViewController.m index c1fd5df..01703ba 100644 --- a/GIGA/Common/BaseVC/GiGaBaseViewController.m +++ b/GIGA/Common/BaseVC/GiGaBaseViewController.m @@ -28,7 +28,7 @@ [super viewDidLoad]; // Do any additional setup after loading the view. [self.view addSubview:_tableView]; - [self testNetworkStatus]; + //[self testNetworkStatus]; } -(void)addNavTitile:(NSString *)title{ diff --git a/GIGA/Common/GiGaLocalNotificationManager/GiGaLocalNotificationManager.m b/GIGA/Common/GiGaLocalNotificationManager/GiGaLocalNotificationManager.m index 2859fc7..7d4f65d 100644 --- a/GIGA/Common/GiGaLocalNotificationManager/GiGaLocalNotificationManager.m +++ b/GIGA/Common/GiGaLocalNotificationManager/GiGaLocalNotificationManager.m @@ -36,12 +36,12 @@ NSURL *imageUrl = [[NSBundle mainBundle] URLForResource:@"MaskTime" withExtension:@"png"]; UNNotificationAttachment *attach = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:imageUrl options:nil error:nil]; - NSURL *audioUrl = [[NSBundle mainBundle] URLForResource:@"4481" withExtension:@"wav"]; - UNNotificationAttachment *attachAudio = [UNNotificationAttachment attachmentWithIdentifier:@"audio" URL:audioUrl options:nil error:nil]; +// NSURL *audioUrl = [[NSBundle mainBundle] URLForResource:@"4481" withExtension:@"wav"]; +// UNNotificationAttachment *attachAudio = [UNNotificationAttachment attachmentWithIdentifier:@"audio" URL:audioUrl options:nil error:nil]; - NSURL *vedioUrl = [[NSBundle mainBundle] URLForResource:@"emojizone" withExtension:@"mp4"]; - UNNotificationAttachment *vedioAudio = [UNNotificationAttachment attachmentWithIdentifier:@"vedio" URL:vedioUrl options:nil error:nil]; - content.attachments = @[attachAudio]; +// NSURL *vedioUrl = [[NSBundle mainBundle] URLForResource:@"emojizone" withExtension:@"mp4"]; +// UNNotificationAttachment *vedioAudio = [UNNotificationAttachment attachmentWithIdentifier:@"vedio" URL:vedioUrl options:nil error:nil]; + content.attachments = @[attach]; //延迟通知 第一个参数是重复的时间间隔,最小60s,第二个参数是是否重复。 UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timeInterval repeats:NO]; diff --git a/GIGA/Common/GiGaNetTool/GiGaAPIRequest.h b/GIGA/Common/GiGaNetTool/GiGaAPIRequest.h deleted file mode 100644 index 30451ad..0000000 --- a/GIGA/Common/GiGaNetTool/GiGaAPIRequest.h +++ /dev/null @@ -1,71 +0,0 @@ -// -// GiGaAPIRequest.h -// GIGA -// -// Created by lianxiang on 2018/8/15. -// Copyright © 2018年 com.giga.ios. All rights reserved. -// - -#import -#import "GiGaAPIResult.h" -@class GiGaAPIRequest; -#define DEFALUT_APIREQUEST_TIMEOUT 20 - -typedef enum GiGaRequestType { - kRequestTypeGet, - kRequestTypePost, - kRequestTypeUpload, - kRequestTypeMultiUpload -}GiGaRequestTyp; - -typedef enum ApiResultFormat { - kApiResultJson, - kApiResultXml, -}ApiResultFormat; - -@protocol GiGaApiRquestDelegate -@optional - -- (void)serverApiFinishedSuccessed:(GiGaAPIRequest *)api result:(GiGaAPIResult *)result; -- (void)serverApiRequestFailed:(GiGaAPIRequest *)api error:(NSError *)error; -- (void)serverApiFinishedFailed:(GiGaAPIRequest *)api result:(GiGaAPIResult *)result; - -@end - -@interface GiGaAPIRequest : NSObject - -#pragma mark - porperty -/** 请求类型 */ -@property (nonatomic, readonly) GiGaRequestTyp requestType; -/** 请求返回的格式 */ -@property (nonatomic, readonly) ApiResultFormat resultFormat; -/** 请求超时时间 */ -@property (nonatomic, readonly) NSTimeInterval timeout; -/** 服务器地址 */ -@property (nonatomic, readonly) NSString *serviceUrl; -/** 请求路径 */ -@property (nonatomic, readonly) NSString *fullUrl; -/** 代理 */ -@property (nonatomic, weak) id delegate; -/** 请求参数数组 */ -@property (nonatomic, strong) NSMutableArray *params; - -#pragma mark - Method -- (id)initWithDelegate:(id)delegate; -/** - * 拼接公共参数 - */ -- (void)appendBaseParams; - -#pragma mark - APIRequestDelegate -/** - * 返回数据调用方法 - */ -- (void)callBackFinishedWithDictionary:(NSDictionary *)dic; -/** - * 返回数据错误 - */ -- (void)callBackFailed:(NSError *)error; - - -@end diff --git a/GIGA/Common/GiGaNetTool/GiGaAPIRequest.m b/GIGA/Common/GiGaNetTool/GiGaAPIRequest.m deleted file mode 100644 index b61ffb8..0000000 --- a/GIGA/Common/GiGaNetTool/GiGaAPIRequest.m +++ /dev/null @@ -1,81 +0,0 @@ -// -// GiGaAPIRequest.m -// GIGA -// -// Created by lianxiang on 2018/8/15. -// Copyright © 2018年 com.giga.ios. All rights reserved. -// - -#import "GiGaAPIRequest.h" -#import "GiGaServerConfig.h" -@implementation GiGaAPIRequest - -- (id)initWithDelegate:(id)delegate -{ - if (self = [super init]) { - self.params = [NSMutableArray array]; - self.delegate = delegate; - } - - return self; -} -//默认Get访问 -- (GiGaRequestTyp)requestType -{ - return kRequestTypeGet; -} - -//默认超时时间 -- (NSTimeInterval)timeout -{ - return DEFALUT_APIREQUEST_TIMEOUT; -} - -//服务器地址 --(NSString *)serviceUrl{ - return [GiGaServerConfig getMainUrl]; -} - -/** 拼接的请求地址 */ - -// -- (NSString *)fullUrl -{ - // 服务器地址 和 接口名 - NSString *url = [NSString stringWithFormat:@"%@",self.serviceUrl]; - - return url; -} -// 数据请求完成的 回调 -- (void)callBackFinishedWithDictionary:(NSDictionary *)dic -{ - // 处理 responseObject - GiGaAPIResult *resu = [[GiGaAPIResult alloc] initWithDictionary:dic]; - // error ID = 0 - if (resu.success) { - if (self.delegate && [self.delegate respondsToSelector:@selector(serverApiFinishedSuccessed: result:)]) { - // - [self.delegate serverApiFinishedSuccessed:self result:resu]; - } - // error ID = 1 - } else { - if (self.delegate && [self.delegate respondsToSelector:@selector(serverApiFinishedFailed:result:)]) { - [self.delegate serverApiFinishedFailed:self result:resu]; - } - } -} - -// 数据请求失败的回调 -- (void)callBackFailed:(NSError *)error -{ - if (self.delegate && [self.delegate respondsToSelector:@selector(serverApiRequestFailed:error:)]) { - [self.delegate serverApiRequestFailed:self error:error]; - } -} - -// 拼接的基本参数 -- (void)appendBaseParams -{ - -} -@end diff --git a/GIGA/Common/GiGaNetTool/GiGaAPIResult.h b/GIGA/Common/GiGaNetTool/GiGaAPIResult.h index 3089b82..0789933 100644 --- a/GIGA/Common/GiGaNetTool/GiGaAPIResult.h +++ b/GIGA/Common/GiGaNetTool/GiGaAPIResult.h @@ -12,8 +12,8 @@ /** 提示信息 */ @property (nonatomic, copy) NSString *message; -/** 请求状态 */ -@property (nonatomic, assign) NSInteger status; +/** 状态码 */ +@property (nonatomic, assign) NSInteger code; /** 请求是否成功 */ @property (nonatomic, readonly) BOOL success; /** 接收数据的字典 */ diff --git a/GIGA/Common/GiGaNetTool/GiGaAPIResult.m b/GIGA/Common/GiGaNetTool/GiGaAPIResult.m index 61d7ce0..20f5739 100644 --- a/GIGA/Common/GiGaNetTool/GiGaAPIResult.m +++ b/GIGA/Common/GiGaNetTool/GiGaAPIResult.m @@ -12,7 +12,7 @@ -(BOOL)success{ - return self.status == 0; + return self.code == 0? YES : NO; } @@ -21,21 +21,21 @@ if (self = [super init]) { @try { if (dic && ![dic isKindOfClass:[NSNull class]]) { - self.status = [[dic objectForKey:@"errorcode"] intValue];//待定 - self.message = [dic objectForKey:@""];//待定 + self.code = [[dic objectForKey:@"code"] integerValue]; + self.message = [dic objectForKey:@"msg"]; NSDictionary *data = [[dic objectForKey:@"result"] objectForKey:@"data"]; self.dic = data; }else{ - self.message = @"网络错误"; + self.message = @"请求异常"; self.dic = nil; - self.status = 1; + self.code = -1; } } @catch(NSException *exception) { self.dic = dic; - self.status = 0; + self.code = -1; } @finally { diff --git a/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.h b/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.h new file mode 100644 index 0000000..8ae5754 --- /dev/null +++ b/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.h @@ -0,0 +1,134 @@ +// +// GiGaBaseAPiRequest.h +// GIGA +// +// Created by lianxiang on 2018/8/29. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import +#import "GiGaAPIResult.h" + +typedef NS_ENUM(NSInteger, GIGARequestStatus) { + NotAvailable = 1, //不可用 + RequestSuccess = 2, //请求成功 + RequestFailed = 4, //请求失败 + RequestLocalData = 8, //本地请求 + RequestNoMoreContent = 16, //没有更多数据 +}; + +typedef NS_ENUM(NSInteger, GIGARequestNetStatus) { + + NetStatusWifi = 1, + NetStatusWWAN = 2, + NetStatusUnKown= 4,//不可用 +}; + +typedef NS_ENUM(NSInteger, RequestMethod) { + RequestPostMethod = 1, //post 请求 + RequestGetMethod = 2, //get 请求 + RequestPutMethod = 3, //put 请求 + RequestDelMethod = 4, //del 请求 +}; + +typedef NS_ENUM(NSInteger ,GiGAErrorCode){ + GiGAErrorCode_SUCCESS = 0,//成功 + GiGAErrorCode_USER_EXIST = 500,//用户已存在 + +}; + +@class GiGaBaseAPiRequest; + +typedef void (^GiGaRequestResultBlock)(GiGaAPIResult *result); + +@interface GiGaBaseAPiRequest : NSObject + +#pragma mark - porperty + +@property (nonatomic,assign) GIGARequestNetStatus statu; + +//@property (nonatomic, copy) GIGARequestSuccessBlock successBlock; +//@property (nonatomic, copy) GIGARequetFailBlock failBlock; +@property (nonatomic,copy) GiGaRequestResultBlock blockresult; + +/** 请求类型 */ +@property (nonatomic, assign) RequestMethod requestMethod; +/** 请求超时时间 */ +@property (nonatomic, readonly) NSTimeInterval timeout; +/** 服务器地址 */ +@property (nonatomic, readonly) NSString *serviceUrl; +/** 请求路径 */ +@property (nonatomic, copy) NSString *fullUrl; + +/** 请求参数 */ +@property (nonatomic, strong) NSMutableDictionary *params; + +/** + * 请求得到的全部数据 + */ +@property (strong, nonatomic) NSDictionary *resultDict; + +@property (strong, nonatomic) NSDictionary *responseHeaderFields; + +@property (nonatomic, assign) BOOL needToken; // 是否需要带上token + +/** + * 检查网络 + */ +- (void)checkNetwork; + + +/** + 发起请求 + + @param result 。 + */ +- (void)requstDataWithResult:(GiGaRequestResultBlock)result; + + +/** + * 发起本地存储数据请求 + * + * @param success 成功block + * @param failure 失败block + */ +//- (void)loadLocalDataAsyncWithSuccess:(GIGARequestSuccessBlock)success + // failure:(GIGARequetFailBlock)failure; +/** + * 分析错误信息 + * + * @param requestDict 服务器返回数据 + * @param error error信息 + */ +- (void)analyseResponseInfo:(NSDictionary *)requestDict error:(NSError *)error; + +- (void)analyseResponseInfo:(NSDictionary *)requestDict + headerFileds:(NSDictionary *)headerFields + error:(NSError *)error; + + +/** + API convenience constructor + @param path request path + @param method method + @param parms parms + @return model + */ ++ (instancetype)initWithRequestPath:(NSString *)path + method:(RequestMethod)method + parms:(NSDictionary *)parms; + ++ (instancetype)initWithRequestAbsoluteURLString:(NSString *)absoluteString + method:(RequestMethod)method + parms:(NSDictionary *)parms; + +//+ (instancetype)uploadImage:(NSString *)url +// imgData:(NSData *)imgData +// parms:(NSDictionary *)parms +// success:(GIGARequestSuccessBlock)success +// failure:(GIGARequetFailBlock)failure; + +//+ (NSString *)resizeImageUrl:(NSString *)originImageUrl + // size:(CGSize)size; + +@end diff --git a/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.m b/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.m new file mode 100644 index 0000000..73bbbe0 --- /dev/null +++ b/GIGA/Common/GiGaNetTool/GiGaBaseAPiRequest.m @@ -0,0 +1,163 @@ +// +// GiGaBaseAPiRequest.m +// GIGA +// +// Created by lianxiang on 2018/8/29. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GiGaBaseAPiRequest.h" +#import "GiGaServerConfig.h" +#import +#import "GiGaNetManager.h" + +@implementation GiGaBaseAPiRequest + +- (NSString *)serviceUrl +{ + return [GiGaServerConfig getMainUrl]; +} + +- (id)init +{ + self = [super init]; + if (self) { + _needToken = NO; + self.requestMethod = RequestGetMethod; + + } + return self; +} + ++(instancetype)initWithRequestPath:(NSString *)path method:(RequestMethod)method parms:(NSDictionary *)parms +{ + NSString *absoluteURLString = [NSString stringWithFormat:@"%@%@", [GiGaServerConfig getMainUrl], path]; + return [self initWithRequestAbsoluteURLString:absoluteURLString + method:method + parms:parms]; +} + ++ (instancetype)initWithRequestAbsoluteURLString:(NSString *)absoluteString + method:(RequestMethod)method + parms:(NSDictionary *)parms +{ + GiGaBaseAPiRequest *request = [[self alloc] init]; + request.fullUrl = absoluteString; + request.requestMethod = method; + + [request buildRequestDictWithDepedency:parms]; + return request; +} + ++ (NSArray *)mergeOriginalArray:(NSArray *)orgArr withOtherArray:(NSArray *)otherArr; +{ + if (otherArr.count == 0) { + return orgArr; + } + + NSMutableArray *array = [NSMutableArray arrayWithArray:orgArr]; + for (int i = 0; i < otherArr.count; i++) { + id object = [otherArr objectAtIndex:i]; + if (!orgArr || [orgArr indexOfObject:object] == NSNotFound) { + [array addObject:object]; + } + } + + return array; +} + +- (NSMutableDictionary *)buildRequestDict +{ + if (!_params) { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + _params = dict; + } + return _params; +} +- (NSMutableDictionary *)buildRequestDictWithDepedency:(NSDictionary *)dict +{ + self.params = dict.mutableCopy; + return self.params; +} + +- (void)requstDataWithResult:(GiGaRequestResultBlock)result +{ + self.blockresult = result; + [self checkNetwork]; + if (self.statu == NetStatusUnKown) { + return; + } + NSLog(@" %@", _fullUrl); + // NSMutableDictionary *postDict = [self buildRequestDict]; + + [GiGaNetManager requestMethod:self.requestMethod Url:self.fullUrl params:self.params responseBlock:^(NSDictionary *responseDict, NSDictionary *responseHeaderFields, NSError *error) { + + [self analyseResponseInfo:responseDict headerFileds:responseHeaderFields error:error]; + }]; + +} + +- (void)analyseResponseInfo:(NSDictionary *)responseData error:(NSError *)error +{ + [self analyseResponseInfo:responseData + headerFileds:nil + error:error]; +} + +- (void)analyseResponseInfo:(NSDictionary *)responseData headerFileds:(NSDictionary *)headerFields error:(NSError *)error +{ + self.responseHeaderFields = headerFields; + NSString *token = headerFields[@"access-token"]; + if (token && token.length > 0) { + //更新token + //[FFBMSConfig shareInstance].token = token; + } + + GILog(@"headerFileds%@",headerFields); + if (error) { + GILog(@"err:%@",error.localizedDescription); + [[UIApplication sharedApplication].keyWindow makeToast:@"请求错误" duration:1 position:CSToastPositionCenter]; + self.blockresult(nil); + return; + } + + self.resultDict =responseData; + GiGaAPIResult *res = [[GiGaAPIResult alloc] initWithDictionary:responseData]; + if (self.blockresult) { + self.blockresult(res); + } + + +} + + +- (void)checkNetwork{ + AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; + [manager startMonitoring]; + [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + + switch (status) { + case AFNetworkReachabilityStatusReachableViaWWAN: + { + GILog(@"2/3/4G"); + self.statu = NetStatusWWAN; + } + break; + case AFNetworkReachabilityStatusReachableViaWiFi: + { + GILog(@"WiFi"); + self.statu = NetStatusWifi; + } + break; + default: + [[UIApplication sharedApplication].keyWindow makeToast:@"网络异常" duration:1.0 position:CSToastPositionCenter]; + self.statu = NetStatusUnKown; + GILog(@"Unkown Net"); + break; + } + + }]; + +} + +@end diff --git a/GIGA/Common/GiGaNetTool/GiGaNetManager.h b/GIGA/Common/GiGaNetTool/GiGaNetManager.h index c524b0d..d494fe8 100644 --- a/GIGA/Common/GiGaNetTool/GiGaNetManager.h +++ b/GIGA/Common/GiGaNetTool/GiGaNetManager.h @@ -7,11 +7,18 @@ // #import -#import "GiGaAPIRequest.h" -@interface GiGaNetManager : NSObject -+(GiGaNetManager *)shareInstance; -+(void)request:(GiGaAPIRequest*)api; +#import "GiGaBaseAPiRequest.h" +typedef void (^responseBlock)(NSDictionary *responseDict, NSDictionary *responseHeaderFields, NSError *error); + +@interface GiGaNetManager : NSObject + ++ (void)requestMethod:(RequestMethod)requestMethod Url:(NSString *)url params:(NSDictionary *)params responseBlock:(responseBlock)block; + ++(void)request:(NSString *)url params:(NSDictionary *)param + success:(void (^)(id response))success + failure:(void (^)(NSError *err))failure; ++(void)userLoginrequest:(NSString *)url params:(NSDictionary *)param completionHandler:(nullable void (^)(NSURLResponse *response, NSDictionary *resDic, NSError * _Nullable error))completionHandler; @end diff --git a/GIGA/Common/GiGaNetTool/GiGaNetManager.m b/GIGA/Common/GiGaNetTool/GiGaNetManager.m index 355ee8d..40913f3 100644 --- a/GIGA/Common/GiGaNetTool/GiGaNetManager.m +++ b/GIGA/Common/GiGaNetTool/GiGaNetManager.m @@ -9,54 +9,58 @@ #import "GiGaNetManager.h" #import "AFNetworking.h" #import "GiGaServerConfig.h" + @interface GiGaNetManager() @end @implementation GiGaNetManager -+ (GiGaNetManager *)shareInstance{ - static GiGaNetManager *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[self alloc] init]; - }); - return instance; -} - -+ (void)request:(GiGaAPIRequest *)api{ - - NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; - NSURL *baseUrl = [NSURL URLWithString:[GiGaServerConfig getMainUrl]]; - AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl sessionConfiguration:configuration]; ++ (void)requestMethod:(RequestMethod)requestMethod Url:(NSString *)url params:(NSDictionary *)params responseBlock:(responseBlock)block{ +// NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +// NSURL *baseUrl = [NSURL URLWithString:[GiGaServerConfig getMainUrl]]; +// AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl sessionConfiguration:configuration]; + AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc] init]; manager.responseSerializer=[AFHTTPResponseSerializer serializer]; - switch (api.requestType) { - case kRequestTypeGet: + + switch (requestMethod) { + case RequestGetMethod: { - [manager GET:api.fullUrl parameters:api.params progress:^(NSProgress * _Nonnull downloadProgress) { + [manager GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - NSDictionary *outDic = (NSDictionary *)responseObject; - [api callBackFinishedWithDictionary:outDic]; + + NSLog(@"%@", responseObject); + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; + NSDictionary *headerFields = [(NSHTTPURLResponse *)task.response allHeaderFields]; + block(dict, headerFields, nil); + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - [api callBackFailed:error]; + NSDictionary *headerFields = [(NSHTTPURLResponse *)task.response allHeaderFields]; + block(nil, headerFields, error); }]; } break; - case kRequestTypePost: + case RequestPostMethod: { - [manager POST:api.fullUrl parameters:api.params progress:^(NSProgress * _Nonnull uploadProgress) { + + [manager POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - NSDictionary *outDic = (NSDictionary *)responseObject; - [api callBackFinishedWithDictionary:outDic]; + + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; + NSLog(@"%@", dict); + NSDictionary *headerFields = [(NSHTTPURLResponse *)task.response allHeaderFields]; + block(dict, headerFields, nil); + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - [api callBackFailed:error]; + NSDictionary *headerFields = [(NSHTTPURLResponse *)task.response allHeaderFields]; + block(nil, headerFields, error); }]; } break; @@ -67,6 +71,58 @@ } } ++(void)request:(NSString *)url params:(NSDictionary *)param + success:(void (^)(id response))success + failure:(void (^)(NSError *err))failure +{ + AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc] init]; + + manager.responseSerializer=[AFHTTPResponseSerializer serializer]; + + [manager POST:url parameters:param progress:^(NSProgress * _Nonnull uploadProgress) { + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; + NSLog(@"%@", dict); + if (success) { + success(responseObject); + } + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + NSLog(@"%@",error); + if (failure) { + failure(error); + } + }]; +} +//登录body传参数 ++(void)userLoginrequest:(NSString *)url params:(NSDictionary *)param completionHandler:(nullable void (^)(NSURLResponse *response,NSDictionary *resDic, NSError * _Nullable error))completionHandler +{ + + NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURL *baseUrl = [NSURL URLWithString:[GiGaServerConfig getMainUrl]]; + AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl sessionConfiguration:configuration]; + NSMutableURLRequest *requst = [[AFJSONRequestSerializer serializer] + requestWithMethod:@"POST" URLString:url parameters:param error:nil]; + requst.timeoutInterval = 10.f; + [requst setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + [requst setValue:@"application/json" forHTTPHeaderField:@"Accept"]; + NSURLSessionDataTask *task = [manager dataTaskWithRequest:requst uploadProgress:^(NSProgress * _Nonnull uploadProgress) { + + } downloadProgress:^(NSProgress * _Nonnull downloadProgress) { + + } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { + + if (completionHandler) { + completionHandler(response,responseObject,error); + } + + }]; + + [task resume]; + +} @end diff --git a/GIGA/Common/GiGaUserDB/GiGaUserDefault.h b/GIGA/Common/GiGaUserDB/GiGaUserDefault.h index 0489720..4ac2cb9 100644 --- a/GIGA/Common/GiGaUserDB/GiGaUserDefault.h +++ b/GIGA/Common/GiGaUserDB/GiGaUserDefault.h @@ -12,8 +12,10 @@ @interface GiGaUserDefault : NSObject - +// +(void)saveUserId:(NSString *)userId; ++(void)saveToken:(NSString *)token; ++(NSString *)getCurentToken; +(NSString *)getCurentUserId; +(void)removeUserId;//退出登录 +(BOOL)isUserLogin; @@ -48,4 +50,5 @@ +(NSDictionary *)getWeiXinAccessToenDic; + @end diff --git a/GIGA/Common/GiGaUserDB/GiGaUserDefault.m b/GIGA/Common/GiGaUserDB/GiGaUserDefault.m index 4d9261c..fe0c604 100644 --- a/GIGA/Common/GiGaUserDB/GiGaUserDefault.m +++ b/GIGA/Common/GiGaUserDB/GiGaUserDefault.m @@ -13,13 +13,12 @@ NSString *const GIGADEFAULTKEY_USERID = @"GiGaUserId"; NSString *const kShowUserGuard = @"ShowUserGuard"; NSString *const kShowAppGuard = @"ShowAppGuard"; NSString *const kWeiXinSaveToken = @"WeiXinSaveToken"; +NSString *const kGiGaToken = @"GiGatoken"; @implementation GiGaUserDefault +(void)saveUserId:(NSString *)userId{ - UD_SET_KEY_VALUE(GIGADEFAULTKEY_USERID, userId); - } +(NSString*)getCurentUserId{ @@ -28,12 +27,24 @@ NSString *const kWeiXinSaveToken = @"WeiXinSaveToken"; return userid; } ++(void)saveToken:(NSString *)token{ + [UD_STADARDUD setObject:token forKey: kGiGaToken]; + [UD_STADARDUD synchronize]; +} + +(void)removeUserId{ UD_REMOVE_KEY(GIGADEFAULTKEY_USERID); } ++(NSString *)getCurentToken{ + + NSString *token = [UD_STADARDUD objectForKey:kGiGaToken]; + [UD_STADARDUD synchronize]; + return token; +} + +(BOOL)isUserLogin{ NSString *uid = UD_GET_VALUE(GIGADEFAULTKEY_USERID); diff --git a/GIGA/Config/GIGA.h b/GIGA/Config/GIGA.h index b35d391..2be15ac 100644 --- a/GIGA/Config/GIGA.h +++ b/GIGA/Config/GIGA.h @@ -41,6 +41,9 @@ UD_SYNC //app 挂起 #define kLOCALNotifiID_APPTERMINAL @"GIGALocalNotificationAppTerminal" +//注册成功 +#define kUserRegistSucccess @"userRegistSuccess" + //微信登陆授权成功 #define kWeiXinAuthrization_Success @"WXAuthSuccess" #define WXin_APPID @"wx1fa33defa5cbc8dd" @@ -75,5 +78,6 @@ alpha:((float)(rgbValue & 0xFF))/255.0] #define textFontWeightSize(X,W) [UIFont systemFontOfSize:X *([UIScreen mainScreen].bounds.size.width / 320.0) weight:W] #define GIGA_ShowToast(__toast__) [self.view makeToast:(__toast__) duration:1.5 position:CSToastPositionCenter]; +#define GIGA_WIndowTost(__toast__) [[UIApplication sharedApplication].keyWindow makeToast:(__toast__) duration:1.5 position:CSToastPositionCenter]; #endif /* GIGA_h */ diff --git a/GIGA/Config/GiGaServerConfig.m b/GIGA/Config/GiGaServerConfig.m index 4626236..726b9b1 100644 --- a/GIGA/Config/GiGaServerConfig.m +++ b/GIGA/Config/GiGaServerConfig.m @@ -18,7 +18,7 @@ case 0://测试环境 { - [[NSUserDefaults standardUserDefaults] setValue:@"https://" forKey:@"MainUrl"]; + [[NSUserDefaults standardUserDefaults] setValue:@"http://apiyts.s1.natapp.cc/v1/" forKey:@"MainUrl"]; } break; case 1: //生产环境 { diff --git a/GIGA/GIGA.pch b/GIGA/GIGA.pch index 8fc21ca..ec80429 100644 --- a/GIGA/GIGA.pch +++ b/GIGA/GIGA.pch @@ -13,6 +13,7 @@ // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. #import "GIGA.h" #import "AFNetworking.h" +#import #import "UIView+Toast.h" #import "JXTAlertManagerHeader.h" #import "Masonry.h" @@ -20,6 +21,7 @@ #import #import #import "MobClickList.h" +#import "TTTAttributedLabel.h" #ifdef DEBUG #define GILog(fmt,...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) diff --git a/GIGA/Info.plist b/GIGA/Info.plist index 3b10a93..081700e 100644 --- a/GIGA/Info.plist +++ b/GIGA/Info.plist @@ -4,14 +4,19 @@ BuglyAppIDString 8f49773330 - LSApplicationQueriesSchemes - - weixin - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) + cn CFBundleDisplayName MaskTime + CFBundleDocumentTypes + + + CFBundleTypeIconFiles + + CFBundleTypeName + + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -39,6 +44,10 @@ CFBundleVersion 1 + LSApplicationQueriesSchemes + + weixin + LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.h b/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.h new file mode 100644 index 0000000..0e3a633 --- /dev/null +++ b/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.h @@ -0,0 +1,13 @@ +// +// RegistGetSMSCodeRequest.h +// GIGA +// +// Created by lianxiang on 2018/8/29. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + + +#import "GiGaBaseAPiRequest.h" +@interface RegistGetSMSCodeRequest : GiGaBaseAPiRequest + +@end diff --git a/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.m b/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.m new file mode 100644 index 0000000..ab6d535 --- /dev/null +++ b/GIGA/Modules/LogIn/APi/RegistGetSMSCodeRequest.m @@ -0,0 +1,13 @@ +// +// RegistGetSMSCodeRequest.m +// GIGA +// +// Created by lianxiang on 2018/8/29. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "RegistGetSMSCodeRequest.h" + +@implementation RegistGetSMSCodeRequest + +@end diff --git a/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.m b/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.m index 27a9831..1b71b98 100644 --- a/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.m +++ b/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.m @@ -9,6 +9,12 @@ #import "GiGaRegistViewController.h" #import "TTTAttributedLabel.h" #import "GiGaWebViewController.h" +#import "NSTimer+Convenience.h" +#import "GiGaBaseAPiRequest.h" +#import "GiGaNetManager.h" +#import "MBProgressHUD.h" +#import "GiGaAttributedLabel.h" + @interface GiGaRegistViewController () @property (weak, nonatomic) IBOutlet UITextField *phoneNumberTextField; @property (weak, nonatomic) IBOutlet UITextField *codeTextField; @@ -17,7 +23,9 @@ @property (weak, nonatomic) IBOutlet UIButton *checkBtn; @property (weak, nonatomic) IBOutlet UIButton *registBtn; -@property (weak, nonatomic) IBOutlet TTTAttributedLabel *useragreementLabel; +@property (weak, nonatomic) IBOutlet GiGaAttributedLabel *useragreementLabel; +@property(nonatomic,strong) NSTimer*timer; +@property(nonatomic) NSInteger time; @end @@ -26,10 +34,73 @@ - (void)viewDidLoad { [super viewDidLoad]; self.title = @"注册"; + _time = 60; + // Do any additional setup after loading the view from its nib. [self confirmUI]; - + [self.sendCodeBtn addTarget:self action:@selector(sendCodeBtnAction:) forControlEvents:UIControlEventTouchUpInside]; + [self.registBtn addTarget:self action:@selector(registBtnAction:) forControlEvents:UIControlEventTouchUpInside]; +} +-(void)dealloc{ + if (_timer) { + [_timer unfireTimer]; + [_timer invalidate]; + _timer = nil; + + } +} +-(void)sendCodeBtnAction:(UIButton *)btn{ + + if (self.phoneNumberTextField.text == nil) { + GIGA_ShowToast(@"请输入手机号"); + return; + } + if (![GiGaHelper isPhoneNumber:self.phoneNumberTextField.text]) { + GIGA_ShowToast(@"请输入正确手机号"); + return; + } + btn.userInteractionEnabled = NO; + [self startTimer:btn]; + [self sendVerifiCode:btn]; +} +-(void)startTimer:(UIButton *)btn{ + + if (_time>0) { + _timer = [NSTimer scheduledTimerWithTimeInterval:1 count:60 callback:^{ + NSString *timeStr=[NSString stringWithFormat:@"%lds",(long)self->_time]; + [btn setTitle:timeStr forState:UIControlStateNormal]; + self->_time--; + + if (self->_time==0) { + [self.sendCodeBtn setTitle:@"发送短信" forState:UIControlStateNormal]; + [btn setBackgroundColor:GIGAUIColorFromRGBA(0x28b9ff)]; + self->_time =60; + btn.userInteractionEnabled = YES; + } + + }]; + [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; + } +} + +#pragma mark 发送短信验证码 +-(void)sendVerifiCode:(UIButton *)btn{ + + [MBProgressHUD showHUDAddedTo:self.view animated:YES]; + + NSString *phoneNumber = self.phoneNumberTextField.text; + NSDictionary *param = @{ + @"mobile":phoneNumber + }; + GiGaBaseAPiRequest *api = [GiGaBaseAPiRequest initWithRequestPath:@"msg/sms/v1/sendcode" method:RequestPostMethod parms:param]; + + [api requstDataWithResult:^(GiGaAPIResult *result) { + [MBProgressHUD hideHUDForView:self.view animated:YES]; + GILog(@"短信获取%@",result.message); + btn.userInteractionEnabled = YES; + }]; + } -(void)confirmUI{ @@ -79,6 +150,57 @@ webView.souceType = WebSourceTypeUrlLink; webView.url = @"http://www.youtansu.com"; [self.navigationController pushViewController:webView animated:YES]; + +} + +#pragma mark 注册 +-(void)registBtnAction:(UIButton *)btn{ + + if (self.phoneNumberTextField.text.length ==0) { + GIGA_ShowToast(@"请输入手机号"); + return; + } + if (![GiGaHelper isPhoneNumber:self.phoneNumberTextField.text]) { + GIGA_ShowToast(@"请输入正确手机号"); + return; + } + if (self.codeTextField.text.length == 0) { + GIGA_ShowToast(@"请输入验证码"); + return; + } + if (!(self.passTexFied.text.length >=6 && self.passTexFied.text.length <=20) || self.passTexFied.text.length == 0) { + GIGA_ShowToast(@"请输入6~20位密码"); + return; + } + + [self regeist:btn]; +} + +//注册 +-(void)regeist:(UIButton *)btn{ + + btn.userInteractionEnabled = NO; + NSDictionary *param = @{@"username":self.phoneNumberTextField.text,@"verifiedCode":self.codeTextField.text,@"password":self.passTexFied.text}; + GiGaBaseAPiRequest *api = [GiGaBaseAPiRequest initWithRequestPath:@"sys/v1/phoneregister" method:RequestPostMethod parms:param]; + + [api requstDataWithResult:^(GiGaAPIResult *result) { + + btn.userInteractionEnabled = YES; + GILog(@"注册->%@",result.message); + if (result.code == 0) { + + NC_POST_NAME_OBJECT(kUserRegistSucccess,self.phoneNumberTextField.text); + + + }else if (result.code == GiGAErrorCode_USER_EXIST){ + GIGA_ShowToast(@"用户已存在"); + NC_POST_NAME_OBJECT(kUserRegistSucccess,self.phoneNumberTextField.text); + + }else{ + GIGA_ShowToast(result.message); + } + }]; + } - (void)didReceiveMemoryWarning { diff --git a/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.xib b/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.xib index 90c5348..fbad89d 100644 --- a/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.xib +++ b/GIGA/Modules/LogIn/Controller/GiGaRegistViewController.xib @@ -42,7 +42,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -110,7 +110,7 @@ - + + + + + + diff --git a/GIGA/Modules/LogIn/Controller/PassWordResetVC.m b/GIGA/Modules/LogIn/Controller/PassWordResetVC.m index 28b5381..f714860 100644 --- a/GIGA/Modules/LogIn/Controller/PassWordResetVC.m +++ b/GIGA/Modules/LogIn/Controller/PassWordResetVC.m @@ -29,7 +29,7 @@ -(void)confirmUI{ - [self.phoneNumberTextField setValue:[UIColor colorWithRed:153/255.0f green:153/255.0f blue:153/255.0f alpha:1] forKey:@"_placeholderLabel.textColor"]; + UIView *phoneView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; phoneView.backgroundColor = [UIColor redColor]; UIImageView *phoneIcon = [[UIImageView alloc] initWithFrame:CGRectMake(15, 5, 16, 18)]; @@ -38,7 +38,6 @@ self.phoneNumberTextField.leftView = phoneView; self.phoneNumberTextField.leftViewMode = UITextFieldViewModeAlways; - [self.codeTextField setValue:[UIColor colorWithRed:153/255.0f green:153/255.0f blue:153/255.0f alpha:1] forKey:@"_placeholderLabel.textColor"]; UIView *codeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; codeView.backgroundColor = [UIColor redColor]; UIImageView *codeIcon = [[UIImageView alloc] initWithFrame:CGRectMake(15, 5, 16, 18)]; diff --git a/GIGA/Modules/Mask/Controller/GiGaFlingCommitVC.m b/GIGA/Modules/Mask/Controller/GiGaFlingCommitVC.m index 871f3b1..16930bf 100644 --- a/GIGA/Modules/Mask/Controller/GiGaFlingCommitVC.m +++ b/GIGA/Modules/Mask/Controller/GiGaFlingCommitVC.m @@ -55,11 +55,13 @@ -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [IQKeyboardManager sharedManager].enable = NO; + [[IQKeyboardManager sharedManager] setEnableAutoToolbar:NO]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [IQKeyboardManager sharedManager].enable = YES; + [[IQKeyboardManager sharedManager] setEnableAutoToolbar:YES]; } -(void)showFlyingCommit{ diff --git a/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m b/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m index 428b477..d100cbd 100644 --- a/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m +++ b/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m @@ -356,10 +356,7 @@ #pragma mark 开始测试 -(void)testBtnAcion:(UIButton *)btn{ - -// [self startMaskTime]; -// return ; - + BOOL isUserLogin = [GiGaUserDefault isUserLogin]; if (isUserLogin) { @@ -447,7 +444,7 @@ UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; leftBtn.frame = CGRectMake(0, 0, 40, 40); leftBtn.backgroundColor = [UIColor redColor]; - [leftBtn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; + [leftBtn setImage:[UIImage imageNamed:@"btn_back"] forState:UIControlStateNormal]; [leftBtn addTarget:self action:@selector(leftBtnAction) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftBtn]; //rightItem @@ -465,7 +462,6 @@ BOOL isUserLogin = [GiGaUserDefault isUserLogin]; if (isUserLogin) { - GIGA_ShowToast(@"userLogin!"); GiGaMasssagesVC *masageVC= [[GiGaMasssagesVC alloc] init]; [self.navigationController pushViewController:masageVC animated:YES]; diff --git a/GIGA/Modules/Mask/View/GiGaCommentView.m b/GIGA/Modules/Mask/View/GiGaCommentView.m index 55f95f2..68f3c87 100644 --- a/GIGA/Modules/Mask/View/GiGaCommentView.m +++ b/GIGA/Modules/Mask/View/GiGaCommentView.m @@ -4,7 +4,7 @@ // // Created by lianxiang on 2018/8/14. // Copyright © 2018年 com.giga.ios. All rights reserved. -// +//弹幕评论视图 #import "GiGaCommentView.h" #import "Masonry.h" @@ -81,8 +81,7 @@ make.top.mas_equalTo(self.userAvtar.mas_bottom).mas_offset(3); make.left.mas_equalTo(self.mas_left).mas_offset(5); - - + }]; float width = msglabel.frame.size.width > namelabel.frame.size.width ? msglabel.frame.size.width:namelabel.frame.size.width ; diff --git a/GIGA/Modules/Mask/View/GiGaFlyingCommitInputView.m b/GIGA/Modules/Mask/View/GiGaFlyingCommitInputView.m index 747f36e..29ae811 100644 --- a/GIGA/Modules/Mask/View/GiGaFlyingCommitInputView.m +++ b/GIGA/Modules/Mask/View/GiGaFlyingCommitInputView.m @@ -19,10 +19,9 @@ self = [super initWithFrame:frame]; if (self) { -// self.backgroundColor = [UIColor blackColor]; self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.1]; -// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dismissSelfViewTap)]; -// [self addGestureRecognizer:tap]; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dismissSelfViewTap)]; + [self addGestureRecognizer:tap]; [self creatInputView]; [self bringSubviewToFront:_commitInputView]; @@ -54,6 +53,7 @@ textField.backgroundColor = [UIColor lightGrayColor]; textField.clearButtonMode = UITextFieldViewModeWhileEditing; textField.delegate = self; + textField.returnKeyType = UIReturnKeySend; [commitView addSubview:textField]; self.inputTextField = textField; @@ -71,7 +71,8 @@ } -(void)dismissSelfViewTap{ - [self removeFromSuperview]; + //[self removeFromSuperview]; + [self.inputTextField resignFirstResponder]; } -(void)sendBtnAction:(UIButton *)btn{ @@ -95,7 +96,8 @@ self.SendCommentHandler(self.inputTextField.text); } - [self dismissKeyboard]; + if (![self.inputTextField isFirstResponder]) return; + [self dismissKeyboard]; } @@ -138,7 +140,6 @@ // get a rect for the textView frame CGRect commentInputViewFrame = self.commitInputView.frame; commentInputViewFrame.origin.y = self.bounds.size.height - (keyboardBounds.size.height + commentInputViewFrame.size.height); - // animations settings [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; @@ -147,7 +148,6 @@ // set views with new info self.commitInputView.frame = commentInputViewFrame; - [UIView commitAnimations]; diff --git a/GIGA/Modules/Me/Model/GiGaUser.h b/GIGA/Modules/Me/Model/GiGaUser.h index 89e7721..de62b91 100644 --- a/GIGA/Modules/Me/Model/GiGaUser.h +++ b/GIGA/Modules/Me/Model/GiGaUser.h @@ -12,7 +12,9 @@ @property(nonatomic,copy) NSString *userId; @property(nonatomic,copy) NSString *name; -@property(nonatomic,copy) NSString *avatar; +@property(nonatomic,copy) NSString *avatar;//头像 @property(nonatomic,copy) NSString *tel; +@property(nonatomic,copy) NSString *token; + @end