Steven 4 سال پیش
والد
کامیت
2d712684cc
100فایلهای تغییر یافته به همراه4153 افزوده شده و 13 حذف شده
  1. 246 7
      MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj
  2. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/Contents.json
  3. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/aboutUs@2x.png
  4. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/aboutUs@3x.png
  5. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/Contents.json
  6. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/device_check@2x.png
  7. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/device_check@3x.png
  8. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/Contents.json
  9. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/mine_next@2x.png
  10. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/mine_next@3x.png
  11. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/Contents.json
  12. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/network_check@2x.png
  13. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/network_check@3x.png
  14. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/Contents.json
  15. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/system_setting@2x.png
  16. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/system_setting@3x.png
  17. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/Contents.json
  18. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/user_setting@2x.png
  19. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/user_setting@3x.png
  20. 6 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/Contents.json
  21. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/Contents.json
  22. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@2x.png
  23. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@3x.png
  24. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/Contents.json
  25. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/check_cancle@2x.png
  26. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/check_cancle@3x.png
  27. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/Contents.json
  28. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@2x.png
  29. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@3x.png
  30. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/Contents.json
  31. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/check_dotted@2x.png
  32. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/check_dotted@3x.png
  33. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/Contents.json
  34. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@2x.png
  35. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@3x.png
  36. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/Contents.json
  37. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/check_line@2x.png
  38. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/check_line@3x.png
  39. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/Contents.json
  40. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@2x.png
  41. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@3x.png
  42. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/Contents.json
  43. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@2x.png
  44. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@3x.png
  45. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/Contents.json
  46. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@2x.png
  47. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@3x.png
  48. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/Contents.json
  49. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@2x.png
  50. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@3x.png
  51. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/Contents.json
  52. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@2x.png
  53. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@3x.png
  54. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/Contents.json
  55. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/check_wait@2x.png
  56. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/check_wait@3x.png
  57. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/Contents.json
  58. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@2x.png
  59. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@3x.png
  60. 12 2
      MusicGradeExam/MusicGradeExam/Base/KSNetTypeManager.h
  61. 79 2
      MusicGradeExam/MusicGradeExam/Base/KSNetTypeManager.m
  62. 55 0
      MusicGradeExam/MusicGradeExam/KSRequestManager.h
  63. 81 0
      MusicGradeExam/MusicGradeExam/KSRequestManager.m
  64. 1 2
      MusicGradeExam/MusicGradeExam/UI/Login/Model/UserInfoManager.m
  65. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/Mine/Controller/UserViewController.h
  66. 33 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/Mine/Controller/UserViewController.m
  67. 81 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/UserCenterViewController.m
  68. 35 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioPlayManager.h
  69. 76 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioPlayManager.m
  70. 49 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioRecordManager.h
  71. 195 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioRecordManager.m
  72. 25 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.h
  73. 343 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.m
  74. 316 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.xib
  75. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/Controller/NetworkingCheckController.h
  76. 325 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/Controller/NetworkingCheckController.m
  77. 38 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.h
  78. 107 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.m
  79. 99 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.xib
  80. 35 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.h
  81. 34 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.m
  82. 218 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.xib
  83. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/AboutUsViewController.h
  84. 43 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/AboutUsViewController.m
  85. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/FeedbackViewController.h
  86. 66 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/FeedbackViewController.m
  87. 19 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneChangeController.h
  88. 193 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneChangeController.m
  89. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneCheckController.h
  90. 71 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneCheckController.m
  91. 17 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/SettingViewController.h
  92. 126 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/SettingViewController.m
  93. 20 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.h
  94. 44 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.m
  95. 129 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.xib
  96. 23 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.h
  97. 123 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.m
  98. 154 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.xib
  99. 30 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/PhoneChangeBodyView.h
  100. 103 0
      MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/PhoneChangeBodyView.m

+ 246 - 7
MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj

@@ -73,7 +73,6 @@
 		274771BE24BC0C0500181362 /* ALCalendarPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FF124BC0BFF00181362 /* ALCalendarPicker.m */; };
 		274771BF24BC0C0500181362 /* UIView+ALFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FF224BC0BFF00181362 /* UIView+ALFrame.m */; };
 		274771C024BC0C0500181362 /* ALCalendarManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FF324BC0BFF00181362 /* ALCalendarManager.m */; };
-		274771C124BC0C0500181362 /* KSNetTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FF624BC0C0000181362 /* KSNetTypeManager.m */; };
 		274771C224BC0C0500181362 /* KSBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FFC24BC0C0000181362 /* KSBaseViewController.m */; };
 		274771C324BC0C0500181362 /* KSBaseWKWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FFE24BC0C0000181362 /* KSBaseWKWebViewController.m */; };
 		274771C424BC0C0500181362 /* CustomNavViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476FFF24BC0C0000181362 /* CustomNavViewController.m */; };
@@ -286,6 +285,32 @@
 		2794D1C424BD60E900BAF6F3 /* UserCenterBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2794D1C324BD60E900BAF6F3 /* UserCenterBodyView.xib */; };
 		2794D1C724BD62FB00BAF6F3 /* ModifyBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2794D1C624BD62FB00BAF6F3 /* ModifyBodyView.m */; };
 		2794D1C924BD631A00BAF6F3 /* ModifyBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2794D1C824BD631A00BAF6F3 /* ModifyBodyView.xib */; };
+		27A008A524BD96C50002452B /* NetworkingCheckController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A0089C24BD96C50002452B /* NetworkingCheckController.m */; };
+		27A008A624BD96C50002452B /* NetworkBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008A024BD96C50002452B /* NetworkBodyView.m */; };
+		27A008A724BD96C50002452B /* NetworkBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008A124BD96C50002452B /* NetworkBodyView.xib */; };
+		27A008A824BD96C50002452B /* KSNetworkAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008A224BD96C50002452B /* KSNetworkAlert.m */; };
+		27A008A924BD96C50002452B /* KSNetworkAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008A424BD96C50002452B /* KSNetworkAlert.xib */; };
+		27A008AE24BD96E50002452B /* DeviceCheckView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008AB24BD96E50002452B /* DeviceCheckView.xib */; };
+		27A008AF24BD96E50002452B /* DeviceCheckView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008AC24BD96E50002452B /* DeviceCheckView.m */; };
+		27A008B524BD97FE0002452B /* AudioRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008B424BD97FE0002452B /* AudioRecordManager.m */; };
+		27A008B824BD98170002452B /* AudioPlayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008B724BD98170002452B /* AudioPlayManager.m */; };
+		27A008C324BD99B10002452B /* SettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008C224BD99B10002452B /* SettingViewController.m */; };
+		27A008C624BD99BD0002452B /* UserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008C524BD99BD0002452B /* UserViewController.m */; };
+		27A008C924BD9D550002452B /* KSNetTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008C824BD9D550002452B /* KSNetTypeManager.m */; };
+		27A008CC24BD9E8A0002452B /* SettingBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008CB24BD9E8A0002452B /* SettingBodyView.m */; };
+		27A008CE24BD9E950002452B /* SettingBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008CD24BD9E950002452B /* SettingBodyView.xib */; };
+		27A008D324BDA67F0002452B /* ModifyPhoneChangeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008D024BDA67E0002452B /* ModifyPhoneChangeController.m */; };
+		27A008D424BDA67F0002452B /* ModifyPhoneCheckController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008D224BDA67F0002452B /* ModifyPhoneCheckController.m */; };
+		27A008DB24BDA6950002452B /* PhoneChangeBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008D524BDA6940002452B /* PhoneChangeBodyView.xib */; };
+		27A008DC24BDA6950002452B /* PhoneChangeBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008D624BDA6940002452B /* PhoneChangeBodyView.m */; };
+		27A008DD24BDA6950002452B /* PhoneCheckBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008D924BDA6950002452B /* PhoneCheckBodyView.m */; };
+		27A008DE24BDA6950002452B /* PhoneCheckBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008DA24BDA6950002452B /* PhoneCheckBodyView.xib */; };
+		27A008E124BDA6B40002452B /* FeedbackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008DF24BDA6B30002452B /* FeedbackViewController.m */; };
+		27A008E524BDA6C40002452B /* FeedbackBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008E224BDA6C30002452B /* FeedbackBodyView.xib */; };
+		27A008E624BDA6C40002452B /* FeedbackBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008E324BDA6C30002452B /* FeedbackBodyView.m */; };
+		27A008E924BDA7070002452B /* AboutUsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008E724BDA7070002452B /* AboutUsViewController.m */; };
+		27A008ED24BDA7100002452B /* AboutBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27A008EA24BDA70F0002452B /* AboutBodyView.xib */; };
+		27A008EE24BDA7100002452B /* AboutBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A008EB24BDA7100002452B /* AboutBodyView.m */; };
 		52771C0027351695CEDB4C8E /* libPods-MusicGradeExam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C12DE728E343C25BB5998D7 /* libPods-MusicGradeExam.a */; };
 		5577ECF41C84E1BDFEC99DBC /* libPods-MusicGradeExamTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BAA64634BC925E7C2CD7008 /* libPods-MusicGradeExamTests.a */; };
 		A7C23B2E920E232C71C39B0E /* libPods-MusicGradeExam-MusicGradeExamUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F8D13E0A14104E75F7922812 /* libPods-MusicGradeExam-MusicGradeExamUITests.a */; };
@@ -440,14 +465,12 @@
 		27476FF224BC0BFF00181362 /* UIView+ALFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+ALFrame.m"; sourceTree = "<group>"; };
 		27476FF324BC0BFF00181362 /* ALCalendarManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ALCalendarManager.m; sourceTree = "<group>"; };
 		27476FF424BC0BFF00181362 /* UIView+Animation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Animation.h"; sourceTree = "<group>"; };
-		27476FF624BC0C0000181362 /* KSNetTypeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSNetTypeManager.m; sourceTree = "<group>"; };
 		27476FF724BC0C0000181362 /* KSBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSBaseViewController.h; sourceTree = "<group>"; };
 		27476FF824BC0C0000181362 /* CustomNavViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomNavViewController.h; sourceTree = "<group>"; };
 		27476FF924BC0C0000181362 /* KSBaseWKWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSBaseWKWebViewController.h; sourceTree = "<group>"; };
 		27476FFA24BC0C0000181362 /* KSTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSTabBarController.h; sourceTree = "<group>"; };
 		27476FFB24BC0C0000181362 /* UINavigationController+KSNavigationBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+KSNavigationBar.h"; sourceTree = "<group>"; };
 		27476FFC24BC0C0000181362 /* KSBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSBaseViewController.m; sourceTree = "<group>"; };
-		27476FFD24BC0C0000181362 /* KSNetTypeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSNetTypeManager.h; sourceTree = "<group>"; };
 		27476FFE24BC0C0000181362 /* KSBaseWKWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSBaseWKWebViewController.m; sourceTree = "<group>"; };
 		27476FFF24BC0C0000181362 /* CustomNavViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomNavViewController.m; sourceTree = "<group>"; };
 		2747700024BC0C0000181362 /* UINavigationController+KSNavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+KSNavigationBar.m"; sourceTree = "<group>"; };
@@ -837,6 +860,50 @@
 		2794D1C524BD62FB00BAF6F3 /* ModifyBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModifyBodyView.h; sourceTree = "<group>"; };
 		2794D1C624BD62FB00BAF6F3 /* ModifyBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModifyBodyView.m; sourceTree = "<group>"; };
 		2794D1C824BD631A00BAF6F3 /* ModifyBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ModifyBodyView.xib; sourceTree = "<group>"; };
+		27A0089B24BD96C50002452B /* NetworkingCheckController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkingCheckController.h; sourceTree = "<group>"; };
+		27A0089C24BD96C50002452B /* NetworkingCheckController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkingCheckController.m; sourceTree = "<group>"; };
+		27A0089F24BD96C50002452B /* KSNetworkAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSNetworkAlert.h; sourceTree = "<group>"; };
+		27A008A024BD96C50002452B /* NetworkBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkBodyView.m; sourceTree = "<group>"; };
+		27A008A124BD96C50002452B /* NetworkBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NetworkBodyView.xib; sourceTree = "<group>"; };
+		27A008A224BD96C50002452B /* KSNetworkAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSNetworkAlert.m; sourceTree = "<group>"; };
+		27A008A324BD96C50002452B /* NetworkBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkBodyView.h; sourceTree = "<group>"; };
+		27A008A424BD96C50002452B /* KSNetworkAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSNetworkAlert.xib; sourceTree = "<group>"; };
+		27A008AB24BD96E50002452B /* DeviceCheckView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DeviceCheckView.xib; sourceTree = "<group>"; };
+		27A008AC24BD96E50002452B /* DeviceCheckView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeviceCheckView.m; sourceTree = "<group>"; };
+		27A008AD24BD96E50002452B /* DeviceCheckView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceCheckView.h; sourceTree = "<group>"; };
+		27A008B324BD97FE0002452B /* AudioRecordManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioRecordManager.h; sourceTree = "<group>"; };
+		27A008B424BD97FE0002452B /* AudioRecordManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioRecordManager.m; sourceTree = "<group>"; };
+		27A008B624BD98170002452B /* AudioPlayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioPlayManager.h; sourceTree = "<group>"; };
+		27A008B724BD98170002452B /* AudioPlayManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioPlayManager.m; sourceTree = "<group>"; };
+		27A008C124BD99B10002452B /* SettingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingViewController.h; sourceTree = "<group>"; };
+		27A008C224BD99B10002452B /* SettingViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingViewController.m; sourceTree = "<group>"; };
+		27A008C424BD99BD0002452B /* UserViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserViewController.h; sourceTree = "<group>"; };
+		27A008C524BD99BD0002452B /* UserViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserViewController.m; sourceTree = "<group>"; };
+		27A008C724BD9D550002452B /* KSNetTypeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSNetTypeManager.h; sourceTree = "<group>"; };
+		27A008C824BD9D550002452B /* KSNetTypeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSNetTypeManager.m; sourceTree = "<group>"; };
+		27A008CA24BD9E8A0002452B /* SettingBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingBodyView.h; sourceTree = "<group>"; };
+		27A008CB24BD9E8A0002452B /* SettingBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingBodyView.m; sourceTree = "<group>"; };
+		27A008CD24BD9E950002452B /* SettingBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingBodyView.xib; sourceTree = "<group>"; };
+		27A008CF24BDA67E0002452B /* ModifyPhoneChangeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModifyPhoneChangeController.h; sourceTree = "<group>"; };
+		27A008D024BDA67E0002452B /* ModifyPhoneChangeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ModifyPhoneChangeController.m; sourceTree = "<group>"; };
+		27A008D124BDA67E0002452B /* ModifyPhoneCheckController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModifyPhoneCheckController.h; sourceTree = "<group>"; };
+		27A008D224BDA67F0002452B /* ModifyPhoneCheckController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ModifyPhoneCheckController.m; sourceTree = "<group>"; };
+		27A008D524BDA6940002452B /* PhoneChangeBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhoneChangeBodyView.xib; sourceTree = "<group>"; };
+		27A008D624BDA6940002452B /* PhoneChangeBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneChangeBodyView.m; sourceTree = "<group>"; };
+		27A008D724BDA6940002452B /* PhoneCheckBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneCheckBodyView.h; sourceTree = "<group>"; };
+		27A008D824BDA6950002452B /* PhoneChangeBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneChangeBodyView.h; sourceTree = "<group>"; };
+		27A008D924BDA6950002452B /* PhoneCheckBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneCheckBodyView.m; sourceTree = "<group>"; };
+		27A008DA24BDA6950002452B /* PhoneCheckBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhoneCheckBodyView.xib; sourceTree = "<group>"; };
+		27A008DF24BDA6B30002452B /* FeedbackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FeedbackViewController.m; sourceTree = "<group>"; };
+		27A008E024BDA6B40002452B /* FeedbackViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FeedbackViewController.h; sourceTree = "<group>"; };
+		27A008E224BDA6C30002452B /* FeedbackBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FeedbackBodyView.xib; sourceTree = "<group>"; };
+		27A008E324BDA6C30002452B /* FeedbackBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FeedbackBodyView.m; sourceTree = "<group>"; };
+		27A008E424BDA6C40002452B /* FeedbackBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FeedbackBodyView.h; sourceTree = "<group>"; };
+		27A008E724BDA7070002452B /* AboutUsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutUsViewController.m; sourceTree = "<group>"; };
+		27A008E824BDA7070002452B /* AboutUsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutUsViewController.h; sourceTree = "<group>"; };
+		27A008EA24BDA70F0002452B /* AboutBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutBodyView.xib; sourceTree = "<group>"; };
+		27A008EB24BDA7100002452B /* AboutBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutBodyView.m; sourceTree = "<group>"; };
+		27A008EC24BDA7100002452B /* AboutBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutBodyView.h; sourceTree = "<group>"; };
 		2BB32BBE582672362BB6E017 /* Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig"; path = "Target Support Files/Pods-MusicGradeExam-MusicGradeExamUITests/Pods-MusicGradeExam-MusicGradeExamUITests.release.xcconfig"; sourceTree = "<group>"; };
 		2F7D3758362ED28D51286A60 /* Pods-MusicGradeExam.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExam.debug.xcconfig"; path = "Target Support Files/Pods-MusicGradeExam/Pods-MusicGradeExam.debug.xcconfig"; sourceTree = "<group>"; };
 		5402063E714DA9D9107F8070 /* Pods-MusicGradeExamTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicGradeExamTests.debug.xcconfig"; path = "Target Support Files/Pods-MusicGradeExamTests/Pods-MusicGradeExamTests.debug.xcconfig"; sourceTree = "<group>"; };
@@ -1156,14 +1223,14 @@
 		27476FF524BC0C0000181362 /* Base */ = {
 			isa = PBXGroup;
 			children = (
+				27A008C724BD9D550002452B /* KSNetTypeManager.h */,
+				27A008C824BD9D550002452B /* KSNetTypeManager.m */,
 				27476FF824BC0C0000181362 /* CustomNavViewController.h */,
 				27476FFF24BC0C0000181362 /* CustomNavViewController.m */,
 				27476FF724BC0C0000181362 /* KSBaseViewController.h */,
 				27476FFC24BC0C0000181362 /* KSBaseViewController.m */,
 				27476FF924BC0C0000181362 /* KSBaseWKWebViewController.h */,
 				27476FFE24BC0C0000181362 /* KSBaseWKWebViewController.m */,
-				27476FFD24BC0C0000181362 /* KSNetTypeManager.h */,
-				27476FF624BC0C0000181362 /* KSNetTypeManager.m */,
 				27476FFA24BC0C0000181362 /* KSTabBarController.h */,
 				2747700124BC0C0000181362 /* KSTabBarController.m */,
 				27476FFB24BC0C0000181362 /* UINavigationController+KSNavigationBar.h */,
@@ -1221,6 +1288,10 @@
 		2747700A24BC0C0100181362 /* UserCenter */ = {
 			isa = PBXGroup;
 			children = (
+				27A008BD24BD99820002452B /* Mine */,
+				27A008B924BD99620002452B /* Setting */,
+				27A0089924BD96C50002452B /* Networking */,
+				27A008AA24BD96E50002452B /* DeviceCheck */,
 				2747700B24BC0C0100181362 /* Controller */,
 				2747700C24BC0C0100181362 /* Model */,
 				2747700D24BC0C0100181362 /* View */,
@@ -1526,10 +1597,10 @@
 		2747706C24BC0C0100181362 /* Model */ = {
 			isa = PBXGroup;
 			children = (
-				2747706D24BC0C0100181362 /* UserInfo.m */,
 				2747706E24BC0C0100181362 /* UserInfoManager.h */,
 				2747706F24BC0C0100181362 /* UserInfoManager.m */,
 				2747707024BC0C0100181362 /* UserInfo.h */,
+				2747706D24BC0C0100181362 /* UserInfo.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -2046,6 +2117,149 @@
 			path = IMKit;
 			sourceTree = "<group>";
 		};
+		27A0089924BD96C50002452B /* Networking */ = {
+			isa = PBXGroup;
+			children = (
+				27A0089A24BD96C50002452B /* Controller */,
+				27A0089D24BD96C50002452B /* Model */,
+				27A0089E24BD96C50002452B /* View */,
+			);
+			path = Networking;
+			sourceTree = "<group>";
+		};
+		27A0089A24BD96C50002452B /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				27A0089B24BD96C50002452B /* NetworkingCheckController.h */,
+				27A0089C24BD96C50002452B /* NetworkingCheckController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		27A0089D24BD96C50002452B /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		27A0089E24BD96C50002452B /* View */ = {
+			isa = PBXGroup;
+			children = (
+				27A0089F24BD96C50002452B /* KSNetworkAlert.h */,
+				27A008A024BD96C50002452B /* NetworkBodyView.m */,
+				27A008A124BD96C50002452B /* NetworkBodyView.xib */,
+				27A008A224BD96C50002452B /* KSNetworkAlert.m */,
+				27A008A324BD96C50002452B /* NetworkBodyView.h */,
+				27A008A424BD96C50002452B /* KSNetworkAlert.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		27A008AA24BD96E50002452B /* DeviceCheck */ = {
+			isa = PBXGroup;
+			children = (
+				27A008B624BD98170002452B /* AudioPlayManager.h */,
+				27A008B724BD98170002452B /* AudioPlayManager.m */,
+				27A008B324BD97FE0002452B /* AudioRecordManager.h */,
+				27A008B424BD97FE0002452B /* AudioRecordManager.m */,
+				27A008AD24BD96E50002452B /* DeviceCheckView.h */,
+				27A008AC24BD96E50002452B /* DeviceCheckView.m */,
+				27A008AB24BD96E50002452B /* DeviceCheckView.xib */,
+			);
+			path = DeviceCheck;
+			sourceTree = "<group>";
+		};
+		27A008B924BD99620002452B /* Setting */ = {
+			isa = PBXGroup;
+			children = (
+				27A008BA24BD99620002452B /* Controller */,
+				27A008BB24BD99620002452B /* Model */,
+				27A008BC24BD99620002452B /* View */,
+			);
+			path = Setting;
+			sourceTree = "<group>";
+		};
+		27A008BA24BD99620002452B /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				27A008C124BD99B10002452B /* SettingViewController.h */,
+				27A008C224BD99B10002452B /* SettingViewController.m */,
+				27A008CF24BDA67E0002452B /* ModifyPhoneChangeController.h */,
+				27A008D024BDA67E0002452B /* ModifyPhoneChangeController.m */,
+				27A008D124BDA67E0002452B /* ModifyPhoneCheckController.h */,
+				27A008D224BDA67F0002452B /* ModifyPhoneCheckController.m */,
+				27A008E024BDA6B40002452B /* FeedbackViewController.h */,
+				27A008DF24BDA6B30002452B /* FeedbackViewController.m */,
+				27A008E824BDA7070002452B /* AboutUsViewController.h */,
+				27A008E724BDA7070002452B /* AboutUsViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		27A008BB24BD99620002452B /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		27A008BC24BD99620002452B /* View */ = {
+			isa = PBXGroup;
+			children = (
+				27A008CA24BD9E8A0002452B /* SettingBodyView.h */,
+				27A008CB24BD9E8A0002452B /* SettingBodyView.m */,
+				27A008CD24BD9E950002452B /* SettingBodyView.xib */,
+				27A008D824BDA6950002452B /* PhoneChangeBodyView.h */,
+				27A008D624BDA6940002452B /* PhoneChangeBodyView.m */,
+				27A008D524BDA6940002452B /* PhoneChangeBodyView.xib */,
+				27A008D724BDA6940002452B /* PhoneCheckBodyView.h */,
+				27A008D924BDA6950002452B /* PhoneCheckBodyView.m */,
+				27A008DA24BDA6950002452B /* PhoneCheckBodyView.xib */,
+				27A008E424BDA6C40002452B /* FeedbackBodyView.h */,
+				27A008E324BDA6C30002452B /* FeedbackBodyView.m */,
+				27A008E224BDA6C30002452B /* FeedbackBodyView.xib */,
+				27A008EC24BDA7100002452B /* AboutBodyView.h */,
+				27A008EB24BDA7100002452B /* AboutBodyView.m */,
+				27A008EA24BDA70F0002452B /* AboutBodyView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		27A008BD24BD99820002452B /* Mine */ = {
+			isa = PBXGroup;
+			children = (
+				27A008BE24BD99820002452B /* Controller */,
+				27A008BF24BD99820002452B /* Model */,
+				27A008C024BD99820002452B /* View */,
+			);
+			name = Mine;
+			path = Controller/Mine;
+			sourceTree = "<group>";
+		};
+		27A008BE24BD99820002452B /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				27A008C424BD99BD0002452B /* UserViewController.h */,
+				27A008C524BD99BD0002452B /* UserViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		27A008BF24BD99820002452B /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		27A008C024BD99820002452B /* View */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		3765A35FA865CF0E79E4496A /* Pods */ = {
 			isa = PBXGroup;
 			children = (
@@ -2201,24 +2415,32 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				27A008ED24BDA7100002452B /* AboutBodyView.xib in Resources */,
 				274771AE24BC0C0500181362 /* mss_browseLoading@2x.png in Resources */,
+				27A008CE24BD9E950002452B /* SettingBodyView.xib in Resources */,
 				2794D1BF24BD4D0C00BAF6F3 /* FSBodyView.xib in Resources */,
+				27A008E524BDA6C40002452B /* FeedbackBodyView.xib in Resources */,
 				2747718A24BC0C0500181362 /* WMPlayer.bundle in Resources */,
 				27476F5624BBFB5C00181362 /* LaunchScreen.storyboard in Resources */,
 				2747727F24BC0C7C00181362 /* RCColor.plist in Resources */,
 				2794D1C424BD60E900BAF6F3 /* UserCenterBodyView.xib in Resources */,
 				2794D1B224BC605600BAF6F3 /* VefiBodyView.xib in Resources */,
 				2747728324BC0C7D00181362 /* RongCloud.bundle in Resources */,
+				27A008A724BD96C50002452B /* NetworkBodyView.xib in Resources */,
 				2794D1C924BD631A00BAF6F3 /* ModifyBodyView.xib in Resources */,
+				27A008DB24BDA6950002452B /* PhoneChangeBodyView.xib in Resources */,
 				274771AC24BC0C0500181362 /* mss_browseLoading@3x.png in Resources */,
 				274771ED24BC0C0500181362 /* LoginBodyView.xib in Resources */,
 				2794D1BA24BC69A400BAF6F3 /* RegisterBodyView.xib in Resources */,
 				2747719624BC0C0500181362 /* TZImagePickerController.bundle in Resources */,
+				27A008DE24BDA6950002452B /* PhoneCheckBodyView.xib in Resources */,
 				2747727E24BC0C7C00181362 /* RCConfig.plist in Resources */,
 				27476F5324BBFB5C00181362 /* Assets.xcassets in Resources */,
+				27A008AE24BD96E50002452B /* DeviceCheckView.xib in Resources */,
 				2747728224BC0C7D00181362 /* Emoji.plist in Resources */,
 				2747728024BC0C7C00181362 /* RongCloudKit.strings in Resources */,
 				27476F5124BBFB5900181362 /* Main.storyboard in Resources */,
+				27A008A924BD96C50002452B /* KSNetworkAlert.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2350,6 +2572,7 @@
 				2747719A24BC0C0500181362 /* TZPhotoPreviewCell.m in Sources */,
 				274771E324BC0C0500181362 /* KSIMService.m in Sources */,
 				2747721D24BC0C0500181362 /* UIButton+Property.m in Sources */,
+				27A008B824BD98170002452B /* AudioPlayManager.m in Sources */,
 				2747725224BC0C0500181362 /* JXCategoryBaseCell.m in Sources */,
 				2747723824BC0C0500181362 /* JXCategoryIndicatorImageView.m in Sources */,
 				2747725024BC0C0500181362 /* UIColor+JXAdd.m in Sources */,
@@ -2363,6 +2586,7 @@
 				2747720124BC0C0500181362 /* UIDevice+zhDeviceType.m in Sources */,
 				274771F124BC0C0500181362 /* KSUpdateManager.m in Sources */,
 				2747721424BC0C0500181362 /* NSDate+Transform.m in Sources */,
+				27A008DD24BDA6950002452B /* PhoneCheckBodyView.m in Sources */,
 				2747724824BC0C0500181362 /* JXCategoryImageView.m in Sources */,
 				2747723424BC0C0500181362 /* JXPagerView.m in Sources */,
 				274771A524BC0C0500181362 /* MSSBrowseModel.m in Sources */,
@@ -2370,7 +2594,9 @@
 				274771DD24BC0C0500181362 /* NodePlayMessage.m in Sources */,
 				2747718E24BC0C0500181362 /* UIView+ShowProgress.m in Sources */,
 				2747718924BC0C0500181362 /* WMPlayerModel.m in Sources */,
+				27A008AF24BD96E50002452B /* DeviceCheckView.m in Sources */,
 				274771E524BC0C0500181362 /* FirstSettingViewController.m in Sources */,
+				27A008DC24BDA6950002452B /* PhoneChangeBodyView.m in Sources */,
 				2747719024BC0C0500181362 /* TZAssetCell.m in Sources */,
 				2747718824BC0C0500181362 /* DZNSegmentedControl.m in Sources */,
 				2747719B24BC0C0500181362 /* TZImagePickerController.m in Sources */,
@@ -2397,6 +2623,7 @@
 				274771D424BC0C0500181362 /* TicketExpiredMessage.m in Sources */,
 				274771F924BC0C0500181362 /* NSMutableDictionary+KSSafe.m in Sources */,
 				274771D624BC0C0500181362 /* AssistantTransferMessage.m in Sources */,
+				27A008E624BDA6C40002452B /* FeedbackBodyView.m in Sources */,
 				274771F524BC0C0500181362 /* KSMemoryCache.m in Sources */,
 				274771A024BC0C0500181362 /* SCIndexView.m in Sources */,
 				2747723324BC0C0500181362 /* JXPagerMainTableView.m in Sources */,
@@ -2420,6 +2647,7 @@
 				274771D024BC0C0500181362 /* KSNormalAlertView.m in Sources */,
 				274771E624BC0C0500181362 /* LoginViewController.m in Sources */,
 				2747726424BC0C0500181362 /* LLPhoto.m in Sources */,
+				27A008C924BD9D550002452B /* KSNetTypeManager.m in Sources */,
 				2747723524BC0C0500181362 /* JXPagerListRefreshView.m in Sources */,
 				274771A824BC0C0500181362 /* UIImage+MSSScale.m in Sources */,
 				274771D224BC0C0500181362 /* DisplayCommandMessage.m in Sources */,
@@ -2430,10 +2658,13 @@
 				2747721024BC0C0500181362 /* UIView+Hints.m in Sources */,
 				274771A424BC0C0500181362 /* MSSBrowseCollectionViewCell.m in Sources */,
 				274771AF24BC0C0500181362 /* UIView+MSSLayout.m in Sources */,
+				27A008E124BDA6B40002452B /* FeedbackViewController.m in Sources */,
 				274771CC24BC0C0500181362 /* UIView+MBProgressHUD.m in Sources */,
 				274771F624BC0C0500181362 /* KSDiskCache.m in Sources */,
 				2747721224BC0C0500181362 /* NSDate+Extension.m in Sources */,
 				2747720924BC0C0500181362 /* UIAlertController+Extend.m in Sources */,
+				27A008C624BD99BD0002452B /* UserViewController.m in Sources */,
+				27A008EE24BDA7100002452B /* AboutBodyView.m in Sources */,
 				27476F4E24BBFB5900181362 /* ViewController.m in Sources */,
 				274771DC24BC0C0500181362 /* TurnPageMessage.m in Sources */,
 				2747721124BC0C0500181362 /* NSArray+ks_SafeAccess.m in Sources */,
@@ -2462,8 +2693,10 @@
 				274771CE24BC0C0500181362 /* HTTPUtility.m in Sources */,
 				274771D324BC0C0500181362 /* ControlDeviceNotifyMessage.m in Sources */,
 				2747719324BC0C0500181362 /* NSBundle+TZImagePicker.m in Sources */,
+				27A008B524BD97FE0002452B /* AudioRecordManager.m in Sources */,
 				2747721924BC0C0500181362 /* UIImage+Color.m in Sources */,
 				2747722B24BC0C0500181362 /* KSAudioRecordFileManager.m in Sources */,
+				27A008D424BDA67F0002452B /* ModifyPhoneCheckController.m in Sources */,
 				2747726224BC0C0500181362 /* LLImageCache.m in Sources */,
 				274771E724BC0C0500181362 /* RegisterViewController.m in Sources */,
 				274771F824BC0C0500181362 /* NSDictionary+KSSafe.m in Sources */,
@@ -2471,6 +2704,7 @@
 				274771B624BC0C0500181362 /* KSPickerView.m in Sources */,
 				274771B424BC0C0500181362 /* TYCyclePagerView.m in Sources */,
 				2747719824BC0C0500181362 /* TZImageManager.m in Sources */,
+				27A008E924BDA7070002452B /* AboutUsViewController.m in Sources */,
 				27544CF824BC337D00EF58AF /* ExamTicketViewController.m in Sources */,
 				2794D1B024BC604800BAF6F3 /* VefiBodyView.m in Sources */,
 				274771C824BC0C0500181362 /* HomeViewController.m in Sources */,
@@ -2490,9 +2724,11 @@
 				2747720224BC0C0500181362 /* NSString+zh_SafeAccess.m in Sources */,
 				2747724B24BC0C0500181362 /* JXCategoryNumberView.m in Sources */,
 				2747721324BC0C0500181362 /* NSString+Extension.m in Sources */,
+				27A008CC24BD9E8A0002452B /* SettingBodyView.m in Sources */,
 				2747721B24BC0C0500181362 /* UIView+XIBView.m in Sources */,
 				2747723E24BC0C0500181362 /* JXCategoryIndicatorView.m in Sources */,
 				2747725424BC0C0500181362 /* MBProgressHUD+NJ.m in Sources */,
+				27A008D324BDA67F0002452B /* ModifyPhoneChangeController.m in Sources */,
 				2747724A24BC0C0500181362 /* JXCategoryImageCellModel.m in Sources */,
 				2747721C24BC0C0500181362 /* UrlDecode.m in Sources */,
 				2747724724BC0C0500181362 /* JXCategoryTitleView.m in Sources */,
@@ -2506,6 +2742,7 @@
 				2747719724BC0C0500181362 /* TZProgressView.m in Sources */,
 				274771AB24BC0C0500181362 /* MSSBrowseRemindView.m in Sources */,
 				274771A924BC0C0500181362 /* MSSBrowseBaseViewController.m in Sources */,
+				27A008A524BD96C50002452B /* NetworkingCheckController.m in Sources */,
 				274771C724BC0C0500181362 /* KSRequestManager.m in Sources */,
 				2747722824BC0C0500181362 /* GRCreateManager.m in Sources */,
 				2747720724BC0C0500181362 /* UITextView+ZWLimitCounter.m in Sources */,
@@ -2528,13 +2765,14 @@
 				274771FF24BC0C0500181362 /* NSObject+AssociatedObject.m in Sources */,
 				2747726124BC0C0500181362 /* LLPhotoBrowser.m in Sources */,
 				2794D1BD24BD4CF800BAF6F3 /* FSBodyView.m in Sources */,
+				27A008A624BD96C50002452B /* NetworkBodyView.m in Sources */,
 				274771C224BC0C0500181362 /* KSBaseViewController.m in Sources */,
 				2794D1B524BC662600BAF6F3 /* VeriCheckView.m in Sources */,
 				2747722D24BC0C0500181362 /* KSRecordStatusView.m in Sources */,
+				27A008A824BD96C50002452B /* KSNetworkAlert.m in Sources */,
 				2747719224BC0C0500181362 /* TZAssetModel.m in Sources */,
 				274771DB24BC0C0500181362 /* ApplySpeechResultMessage.m in Sources */,
 				2747723624BC0C0500181362 /* JXCategoryIndicatorLineView.m in Sources */,
-				274771C124BC0C0500181362 /* KSNetTypeManager.m in Sources */,
 				2747719424BC0C0500181362 /* UIView+Layout.m in Sources */,
 				2747719D24BC0C0500181362 /* TZGifPhotoPreviewController.m in Sources */,
 				2747724E24BC0C0500181362 /* JXCategoryFactory.m in Sources */,
@@ -2548,6 +2786,7 @@
 				274771EF24BC0C0500181362 /* KSRCIMDataSource.m in Sources */,
 				274771EB24BC0C0500181362 /* UserInfoManager.m in Sources */,
 				2747723224BC0C0500181362 /* JXPagerListContainerView.m in Sources */,
+				27A008C324BD99B10002452B /* SettingViewController.m in Sources */,
 				2747725724BC0C0500181362 /* UITextView_Toolbar.m in Sources */,
 				274771DA24BC0C0500181362 /* MemberChangeMessage.m in Sources */,
 				2747721824BC0C0500181362 /* NSObject+ReadDocument.m in Sources */,

+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "aboutUs@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "aboutUs@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/aboutUs@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/aboutUs.imageset/aboutUs@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "device_check@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "device_check@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/device_check@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/device_check.imageset/device_check@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_next@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_next@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/mine_next@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/mine_next.imageset/mine_next@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "network_check@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "network_check@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/network_check@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/network_check.imageset/network_check@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "system_setting@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "system_setting@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/system_setting@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/system_setting.imageset/system_setting@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "user_setting@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "user_setting@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/user_setting@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Mine/user_setting.imageset/user_setting@3x.png


+ 6 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_audioSuccess@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_audioSuccess@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_cancle@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_cancle@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/check_cancle@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_cancle.imageset/check_cancle@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_device@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_device@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_dotted@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_dotted@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/check_dotted@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_dotted.imageset/check_dotted@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_fail@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_fail@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_line@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_line@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/check_line@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_line.imageset/check_line@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_loudspeaker@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_loudspeaker@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_ microphone@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_ microphone@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_networking@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_networking@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_notification@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_notification@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_success@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_success@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check_wait@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check_wait@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/check_wait@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_wait.imageset/check_wait@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "checking@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "checking@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@3x.png


+ 12 - 2
MusicGradeExam/MusicGradeExam/Base/KSNetTypeManager.h

@@ -2,16 +2,26 @@
 //  KSNetTypeManager.h
 //  MusicGradeExam
 //
-//  Created by Kyle on 2020/7/10.
-//  Copyright © 2020 DayaMusic. All rights reserved.
+//  Created by Kyle on 2019/10/17.
+//  Copyright © 2019 DayaMusic. All rights reserved.
 //
 
 #import <Foundation/Foundation.h>
+#import "Reachability.h"
+
+typedef void(^NetChangeCallback)(NSString * _Nonnull netType);
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface KSNetTypeManager : NSObject
 
+@property (nonatomic, strong) Reachability *reachability;
+
+// 获取当前网络名称
+- (NSString *)getInternetStatus;
+
+- (void)notiferCallback:(NetChangeCallback)callback;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 79 - 2
MusicGradeExam/MusicGradeExam/Base/KSNetTypeManager.m

@@ -2,12 +2,89 @@
 //  KSNetTypeManager.m
 //  MusicGradeExam
 //
-//  Created by Kyle on 2020/7/10.
-//  Copyright © 2020 DayaMusic. All rights reserved.
+//  Created by Kyle on 2019/10/17.
+//  Copyright © 2019 DayaMusic. All rights reserved.
 //
 
 #import "KSNetTypeManager.h"
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+
+@interface KSNetTypeManager ()
+
+@property (nonatomic, copy) NetChangeCallback callback;
+
+@end
 
 @implementation KSNetTypeManager
 
+- (void)notiferCallback:(NetChangeCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+// 获取当前网络名称
+- (NSString *)getInternetStatus  {
+   
+    NetworkStatus internetStatus = [self.reachability currentReachabilityStatus];
+    switch (internetStatus) {
+        case ReachableViaWiFi:
+            return @"Wi-Fi";
+            break;
+        case ReachableViaWWAN:
+            return [self networkStatus];
+            break;
+        case NotReachable:
+            return @"无网络";
+            break;
+        default:
+            return @"未知网络";
+            break;
+    }
+}
+
+- (NSString *)networkStatus {
+    NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,
+                               CTRadioAccessTechnologyGPRS,CTRadioAccessTechnologyCDMA1x];
+    NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,
+                               CTRadioAccessTechnologyWCDMA,CTRadioAccessTechnologyHSUPA,CTRadioAccessTechnologyCDMAEVDORev0,CTRadioAccessTechnologyCDMAEVDORevA,CTRadioAccessTechnologyCDMAEVDORevB,CTRadioAccessTechnologyeHRPD];
+    
+    NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];
+    CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];
+    NSString *accessString = teleInfo.currentRadioAccessTechnology;
+    if ([typeStrings4G containsObject:accessString]) {
+        return @"4G";
+    }
+    else if ([typeStrings3G containsObject:accessString]) {
+        return @"3G";
+    }
+    else if ([typeStrings2G containsObject:accessString]) {
+        return @"2G";
+    }
+    else {
+        return @"未知网络";
+    }
+}
+
+// 通知处理
+- (void)reachabilityChanged:(NSNotification *)notification
+{
+    if (self.callback) {
+        NSString *netType = [self getInternetStatus];
+        self.callback(netType);
+    }
+}
+
+- (Reachability *)reachability {
+    if (!_reachability) {
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
+        _reachability   = [Reachability reachabilityWithHostName:@"www.apple.com"];
+           [_reachability startNotifier];
+    }
+    return _reachability;
+}
+
+- (void)dealloc {
+    [self.reachability stopNotifier];
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
 @end

+ 55 - 0
MusicGradeExam/MusicGradeExam/KSRequestManager.h

@@ -208,6 +208,61 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)queryCountOfUnreadRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 #pragma mark --- 个人信息
+
+
+// /api-user/student/getStudent
+/**
+ 获取个人信息
+ 
+ @param get get
+ @param success 成功
+ @param faliure 失败
+ */
++ (void)queryUserInfo:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-user/suggestion/add
+
+/**
+ 新增建议
+ 
+ @param post post
+ @param content 内容
+ @param mobileNo 手机号
+ @param success 成功
+ @param faliure 失败
+ */
++ (void)suggestionAddRequest:(NSString *)post content:(NSString *)content mobileNo:(NSString *)mobileNo success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-auth/user/checkUser
+
+/// 用户信息校验
+/// @param get get
+/// @param phone 手机号
+/// @param password 密码
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkUserRequest:(NSString *)get phone:(NSString *)phone password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-auth/user/updatePhone
+
+/// 修改手机号
+/// @param post post
+/// @param oldPhone 旧手机号
+/// @param authCode 验证码
+/// @param newPhone 新手机号码
+/// @param success 成功
+/// @param faliure 失败
++ (void)updatePhoneRequest:(NSString *)post oldPhone:(NSString *)oldPhone authCode:(NSString *)authCode newPhone:(NSString *)newPhone success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+
+// /api-auth/user/refreshImToken
+
+/// 刷新IM token
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)refreshImTokenRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 81 - 0
MusicGradeExam/MusicGradeExam/KSRequestManager.m

@@ -511,5 +511,86 @@
     [self request:get url:url parm:nil success:success faliure:faliure];
 }
 #pragma mark --- 个人信息
+// /api-user/student/getStudent
+/**
+ 获取个人信息
+ 
+ @param get get
+ @param success 成功
+ @param faliure 失败
+ */
++ (void)queryUserInfo:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-user/student/getStudent"];
+    [self request:get andWithUrl:url and:nil success:success faliure:faliure];
+}
+// /api-user/suggestion/add
+
+/**
+ 新增建议
+ 
+ @param post post
+ @param content 内容
+ @param mobileNo 手机号
+ @param success 成功
+ @param faliure 失败
+ */
++ (void)suggestionAddRequest:(NSString *)post content:(NSString *)content mobileNo:(NSString *)mobileNo success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodForm];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:content forKey:@"content"];
+    [parm setValue:mobileNo forKey:@"mobileNo"];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-user/suggestion/add"];
+    [self request:post url:url parm:parm success:success faliure:faliure];
+}
+
+// /api-auth/user/checkUser
+
+/// 用户信息校验
+/// @param get get
+/// @param phone 手机号
+/// @param password 密码
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkUserRequest:(NSString *)get phone:(NSString *)phone password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-auth/user/checkUser"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:phone forKey:@"phone"];
+    [parm setValue:password forKey:@"password"];
+    [self request:get url:url parm:nil success:success faliure:faliure];
+}
+
+// /api-auth/user/updatePhone
+
+/// 修改手机号
+/// @param post post
+/// @param oldPhone 旧手机号
+/// @param authCode 验证码
+/// @param newPhone 新手机号码
+/// @param success 成功
+/// @param faliure 失败
++ (void)updatePhoneRequest:(NSString *)post oldPhone:(NSString *)oldPhone authCode:(NSString *)authCode newPhone:(NSString *)newPhone success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodForm];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-auth/user/updatePhone"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:oldPhone forKey:@"oldPhone"];
+    [parm setValue:authCode forKey:@"authCode"];
+    [parm setValue:newPhone forKey:@"newPhone"];
+    [self request:post url:url parm:parm success:success faliure:faliure];
+}
+
+// /api-auth/user/refreshImToken
+
+/// 刷新IM token
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)refreshImTokenRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodForm];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-auth/user/refreshImToken"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:post url:url parm:parm success:success faliure:faliure];
+}
 
 @end

+ 1 - 2
MusicGradeExam/MusicGradeExam/UI/Login/Model/UserInfoManager.m

@@ -72,7 +72,7 @@
 
 
 - (void)queryUserInfoConnectRongCloud:(BOOL)connectRM {
-    /*
+    
     [KSRequestManager queryUserInfo:KS_GET success:^(NSDictionary * _Nonnull dic) {
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
             // 保存用户信息
@@ -113,7 +113,6 @@
             self.callback(self.userInfo);
         }
     }];
-     */
 }
 
 

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/Mine/Controller/UserViewController.h

@@ -0,0 +1,17 @@
+//
+//  UserViewController.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UserViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 33 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/Mine/Controller/UserViewController.m

@@ -0,0 +1,33 @@
+//
+//  UserViewController.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "UserViewController.h"
+
+@interface UserViewController ()
+
+@end
+
+@implementation UserViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"个人资料"];
+}
+
+/*
+#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

+ 81 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Controller/UserCenterViewController.m

@@ -7,9 +7,20 @@
 //
 
 #import "UserCenterViewController.h"
+#import "UserCenterBodyView.h"
+#import "DeviceCheckView.h"
+#import "UserInfoManager.h"
+#import "NetworkingCheckController.h"
+#import "SettingViewController.h"
+#import "UserViewController.h"
 
 @interface UserCenterViewController ()
 
+@property (nonatomic, strong) UserCenterBodyView *bodyView;
+
+@property (nonatomic, strong) DeviceCheckView *checkView;
+
+
 @end
 
 @implementation UserCenterViewController
@@ -17,6 +28,76 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
+    [self configUI];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self requestUserMessage];
+}
+
+
+- (void)configUI {
+    [self allocTitle:@""];
+    _bodyView = [UserCenterBodyView shareInstance];
+    _bodyView.frame = CGRectMake(0, 0, kScreen_Width, kScreenHeight - kNaviBarHeight - kTabBarHeight);
+    MJWeakSelf;
+    [_bodyView tapCallback:^(USERCENTER_ACTION action) {
+        [weakSelf operationAction:action];
+    }];
+    [self.scrollView addSubview:_bodyView];
+    [self.scrollView setContentSize:CGSizeMake(kScreenWidth, kScreenHeight - kTabBarHeight)];
+    if (@available(iOS 11.0, *)) {
+        self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+    } else {
+        // Fallback on earlier versions
+        self.automaticallyAdjustsScrollViewInsets = NO;
+    }
+}
+
+- (void)operationAction:(USERCENTER_ACTION)action {
+    switch (action) {
+        case USERCENTER_ACTION_MESSAGE: // 个人资料
+        {
+            UserViewController *ctrl = [[UserViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
+        case USERCENTER_ACTION_SETTING: // 设置
+        {
+            SettingViewController *settingVC = [[SettingViewController alloc] init];
+            [self.navigationController pushViewController:settingVC animated:YES];
+        }
+            break;
+        case USERCENTER_ACTION_NETCHECK: // 网络检测
+        {
+            NetworkingCheckController *checkVC = [[NetworkingCheckController alloc] init];
+            [self.navigationController pushViewController:checkVC animated:YES];
+        }
+            break;
+        case USERCENTER_ACTION_DEVICECHECK: // 设备检测
+        {
+            [self.checkView showAlert];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
+- (void)requestUserMessage {
+    [[UserInfoManager shareInstance] queryUserInfoCallback:^(UserInfo * _Nonnull userInfo) {
+        [self.bodyView configMessage];
+    }];
+}
+
+
+- (DeviceCheckView *)checkView {
+    if (!_checkView) {
+        _checkView = [DeviceCheckView shareInstance];
+    }
+    return _checkView;
 }
 
 /*

+ 35 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioPlayManager.h

@@ -0,0 +1,35 @@
+//
+//  AudioPlayManager.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/6.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+@protocol AudioPlayManagerDelegate <NSObject>
+
+- (void)finishPlay;
+
+@end
+
+
+@interface AudioPlayManager : NSObject
+
+@property (nonatomic, weak) id<AudioPlayManagerDelegate> delegate;
+
++ (instancetype)shareInstanceWithFileUrl:(NSURL *)fileUrl;
+
+- (void)playMusic;
+
+- (void)pauseMusic;
+
+- (void)resumePlay;
+
+- (void)stopMusic;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 76 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioPlayManager.m

@@ -0,0 +1,76 @@
+//
+//  AudioPlayManager.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/6.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "AudioPlayManager.h"
+#import <AVFoundation/AVFoundation.h>
+
+@interface AudioPlayManager ()<AVAudioPlayerDelegate>
+
+@property (nonatomic, strong) NSURL *fileUrl;
+
+@property (nonatomic, strong) AVAudioPlayer *audioPlayer;        // 音频播放器
+
+@end
+
+@implementation AudioPlayManager
+
++ (instancetype)shareInstanceWithFileUrl:(NSURL *)fileUrl {
+    AudioPlayManager *manager = [[AudioPlayManager alloc] init];
+    manager.fileUrl = fileUrl;
+    return manager;
+}
+
+- (void)playMusic {
+    if ([self.audioPlayer isPlaying]) {
+        return;
+    }
+    //解决音量小的问题
+    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+    NSError *err = nil;
+    [audioSession setCategory:AVAudioSessionCategoryPlayback error:&err];
+    [self.audioPlayer play];    // 播放音频
+}
+
+- (void)pauseMusic {
+    if ([self.audioPlayer isPlaying]) {
+        [self.audioPlayer pause];
+    }
+}
+
+- (void)resumePlay {
+    [self.audioPlayer play];
+}
+
+- (void)stopMusic {
+    [self.audioPlayer stop];
+}
+
+#pragma mark -- delegate
+// !!!: 播放语音代理事件
+- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
+    
+    if (self.delegate && [self.delegate respondsToSelector:@selector(finishPlay)]) {
+        [self.delegate finishPlay];
+    }
+}
+
+#pragma mark -- lazying
+- (AVAudioPlayer *)audioPlayer {
+    if (!_audioPlayer) {
+        NSError *error = nil;
+        _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.fileUrl error:&error];
+        _audioPlayer.numberOfLoops = 0;   // 设置为0不循环
+        _audioPlayer.delegate = self;
+        if (error) {
+            NSLog(@"创建播放器过程中发生错误,错误信息:%@",error.localizedDescription);
+        }
+    }
+    return _audioPlayer;
+}
+
+@end

+ 49 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioRecordManager.h

@@ -0,0 +1,49 @@
+//
+//  AudioRecordManager.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/6.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <AVFoundation/AVFoundation.h>
+#import <CoreAudio/CoreAudioTypes.h>
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol AudioRecordManagerDelegate <NSObject>
+
+- (void)recordInterruption;
+
+@end
+
+
+@interface AudioRecordManager : NSObject
+
+@property (nonatomic, weak) id<AudioRecordManagerDelegate> delegate;
+
++ (instancetype)shareManager;
+
+- (void)ks_updateMeters;
+
+- (CGFloat)ks_averagePowerForChannel:(NSUInteger)channelNumber;
+
+// 获取当前录制时间
+- (NSTimeInterval)ks_currentTime;
+// 录音/继续录音
+- (void)ks_record;
+// 暂停录音
+- (void)ks_pause;
+// 停止录音
+- (void)ks_stop;
+// 删除录音文件
+- (void)ks_deleteRecording;
+
+// 获取录音保存文件路径
+- (NSURL *)getSavePath;
+// 保存文件
+- (BOOL)saveFileWithFileName:(NSString *)fileName;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 195 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/AudioRecordManager.m

@@ -0,0 +1,195 @@
+//
+//  AudioRecordManager.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/6.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "AudioRecordManager.h"
+
+@interface AudioRecordManager ()<AVAudioRecorderDelegate>
+
+@property (nonatomic, strong) AVAudioRecorder *audioRecorder; // 音频录音机
+
+
+@end
+
+@implementation AudioRecordManager
+
++ (instancetype)shareManager {
+    AudioRecordManager *manager = [[AudioRecordManager alloc] init];
+    return manager;
+}
+
+- (instancetype)init {
+    if (self = [super init]) {
+        
+    }
+    return self;
+}
+
+- (void)ks_updateMeters {
+    [self.audioRecorder updateMeters];
+}
+
+- (CGFloat)ks_averagePowerForChannel:(NSUInteger)channelNumber {
+   return [self.audioRecorder averagePowerForChannel:channelNumber];
+}
+
+- (NSTimeInterval)ks_currentTime {
+    return self.audioRecorder.currentTime;
+}
+
+- (void)ks_record {
+    
+    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
+    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
+    [self.audioRecorder record];
+}
+
+- (void)ks_pause {
+    [self.audioRecorder pause];
+}
+- (void)ks_stop {
+    [self.audioRecorder stop];
+}
+- (void)ks_deleteRecording {
+    if ([self.audioRecorder isRecording]) {
+        [self.audioRecorder stop];
+    }
+    [self.audioRecorder deleteRecording];
+    
+}
+
+/**
+ *  取得录音文件设置
+ *
+ *  @return 录音设置
+ */
+- (NSDictionary *)getAudioSetting {
+    NSMutableDictionary *dicM=[NSMutableDictionary dictionary];
+    //设置录音格式
+    [dicM setObject:@(kAudioFormatMPEG4AAC) forKey:AVFormatIDKey];
+    //设置录音采样率,8000是电话采样率,对于一般录音已经够了
+    [dicM setObject:@(44100) forKey:AVSampleRateKey];
+    //设置通道,这里采用单声道
+    [dicM setObject:@(1) forKey:AVNumberOfChannelsKey];
+    //每个采样点位数,分为8、16、24、32
+    [dicM setObject:@(16) forKey:AVLinearPCMBitDepthKey];
+    //是否使用浮点数采样
+    [dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];
+    [dicM setObject:@(AVAudioQualityHigh) forKey:AVEncoderAudioQualityKey];
+    //....其他设置等
+    return dicM;
+}
+
+/**
+ *  获得录音机对象
+ *
+ *  @return 录音机对象
+ */
+- (AVAudioRecorder *)audioRecorder {
+    if (!_audioRecorder) {
+        [self setAudioSession];
+        //创建录音文件保存路径
+        NSURL *url=[self getSavePath];
+        //创建录音格式设置
+        NSDictionary *setting=[self getAudioSetting];
+        //创建录音机
+        NSError *error=nil;
+        _audioRecorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];
+        _audioRecorder.delegate=self;
+        _audioRecorder.meteringEnabled=YES;//如果要监控声波则必须设置为YES
+        if (error) {
+            NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);
+            return nil;
+        }
+    }
+    return _audioRecorder;
+}
+
+- (void)setAudioSession {
+    AVAudioSession *session = [AVAudioSession sharedInstance];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:session];
+    NSError *sessionError;
+    //AVAudioSessionCategoryPlayAndRecord用于录音和播放
+    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
+    if(session == nil)
+    {
+        NSLog(@"Error creating session: %@", [sessionError description]);
+    }
+        
+    else {
+        [session setActive:YES error:nil];
+    }
+        
+}
+
+/**
+ *  取得录音文件保存路径
+ *
+ *  @return 录音文件路径
+ */
+- (NSURL *)getSavePath {
+    
+    //  在Documents目录下创建一个名为FileData的文件夹
+    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];
+    NSLog(@"%@",path);
+    
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    BOOL isDir = FALSE;
+    BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
+    if(!(isDirExist && isDir)) {
+        BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
+        if(!bCreateDir){
+            NSLog(@"创建文件夹失败!");
+        }
+        NSLog(@"创建文件夹成功,文件路径%@",path);
+    }
+    
+    path = [path stringByAppendingPathComponent:@"myRecord.aac"];
+    NSLog(@"file path:%@",path);
+    NSURL *url=[NSURL fileURLWithPath:path];
+    return url;
+}
+
+// 保存文件名称
+- (BOOL)saveFileWithFileName:(NSString *)fileName {
+    NSURL *preUrl = [self getSavePath];
+    NSString *copyPath = preUrl.path;
+    NSFileManager *fileMamager = [NSFileManager defaultManager];
+    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];
+    path = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.aac",fileName]];
+    NSError *error = nil;
+    if (![fileMamager copyItemAtPath:copyPath toPath:path error:&error]) {
+        [fileMamager removeItemAtPath:copyPath error:nil];
+        NSLog(@"拷贝失败:%@", error.userInfo);
+        return NO;
+    }
+    else {
+        [fileMamager removeItemAtPath:copyPath error:nil];
+        return YES;
+    }
+}
+
+// 打断处理
+- (void)handleInterruption:(NSNotification *)notification {
+    
+    NSDictionary *info = notification.userInfo;
+    AVAudioSessionInterruptionType type = [info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
+    if (type == AVAudioSessionInterruptionTypeBegan) {
+        //Handle InterruptionBegan
+        if (self.delegate && [self.delegate respondsToSelector:@selector(recordInterruption)]) {
+            [self.delegate recordInterruption];
+        }
+    }else{
+        AVAudioSessionInterruptionOptions options = [info[AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];
+        if (options == AVAudioSessionInterruptionOptionShouldResume) {
+            //Handle Resume
+        }
+    }
+}
+
+@end

+ 25 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.h

@@ -0,0 +1,25 @@
+//
+//  DeviceCheckView.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/4.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface DeviceCheckView : UIView
+
+
++ (instancetype)shareInstance;
+
+- (void)showAlert;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 343 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.m

@@ -0,0 +1,343 @@
+//
+//  DeviceCheckView.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/4.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "DeviceCheckView.h"
+#import "UIView+Animation.h"
+#import "AudioRecordManager.h"
+#import "AudioPlayManager.h"
+#import "Reachability.h"
+#import <UserNotifications/UserNotifications.h>
+
+@interface DeviceCheckView ()<AudioRecordManagerDelegate>
+
+@property (weak, nonatomic) IBOutlet UIImageView *TopImageView;
+
+@property (weak, nonatomic) IBOutlet UIButton *oneButton;
+@property (weak, nonatomic) IBOutlet UIView *oneButtonView;
+
+@property (weak, nonatomic) IBOutlet UIView *twoButtonView;
+@property (weak, nonatomic) IBOutlet UIButton *twoPreButton;
+@property (weak, nonatomic) IBOutlet UIButton *twoNextButton;
+
+
+@property (weak, nonatomic) IBOutlet UIImageView *statusOne;
+@property (weak, nonatomic) IBOutlet UIImageView *statusTwo;
+@property (weak, nonatomic) IBOutlet UIImageView *statusThree;
+@property (weak, nonatomic) IBOutlet UIImageView *statusFour;
+@property (weak, nonatomic) IBOutlet UIImageView *statusFive;
+@property (weak, nonatomic) IBOutlet UIImageView *statusSix;
+
+@property (weak, nonatomic) IBOutlet UIImageView *lineOne;
+@property (weak, nonatomic) IBOutlet UIImageView *lineTwo;
+@property (weak, nonatomic) IBOutlet UIImageView *lineThree;
+@property (weak, nonatomic) IBOutlet UIImageView *lineFour;
+@property (weak, nonatomic) IBOutlet UIImageView *linefive;
+
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+@property (weak, nonatomic) IBOutlet UILabel *descLabel;
+@property (weak, nonatomic) IBOutlet UILabel *followLabel;
+
+
+@property (nonatomic, assign) NSInteger currentIndex;
+
+
+@property (nonatomic, assign) BOOL isRecording;
+
+@property (nonatomic, strong) AudioRecordManager *recordManager; //音频录音管理
+
+@property (nonatomic, strong) AudioPlayManager *playManager;        // 音频播放
+
+@end
+
+@implementation DeviceCheckView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self resetView];
+}
+
+- (void)resetView {
+    self.currentIndex = 0;
+    self.isRecording = NO;
+}
+
+
+- (void)setCurrentIndex:(NSInteger)currentIndex {
+    _currentIndex = currentIndex;
+    switch (currentIndex) {
+        case 0:
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_device"]];
+            [self.statusOne setImage:[UIImage imageNamed:@"checking"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusThree setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusFour setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusFive setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusSix setImage:[UIImage imageNamed:@"check_wait"]];
+            
+            [self.lineOne setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineTwo setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineThree setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineFour setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.linefive setImage:[UIImage imageNamed:@"check_dotted"]];
+            
+            self.twoButtonView.hidden = YES;
+            
+            [self.titleLabel setText:@"设备检测"];
+            [self.descLabel setText:@"为确保您能正常上课,现在进行声音测试"];
+            [self.followLabel setText:@""];
+            [self.oneButton setTitle:@"开始测试" forState:UIControlStateNormal];
+            
+        }
+            break;
+        case 1: // 话筒
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_microphone"]];
+            [self.statusOne setImage:[UIImage imageNamed:@"check_success"]];
+            [self.lineOne setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"手机话筒检测"];
+            [self.descLabel setText:@"请按录音并念出下方文字"];
+            [self.followLabel setText:@"“我正在测试话筒与扬声器”"];
+            [self.oneButton setTitle:@"开始录音" forState:UIControlStateNormal];
+        }
+            break;
+        case 2: // 扬声器
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_loudspeaker"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"check_success"]];
+            [self.lineTwo setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusThree setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"扬声器检测"];
+            [self.descLabel setText:@"录音内容播放中请听是否有声音"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = NO;
+            [self.twoPreButton setTitle:@"无声音" forState:UIControlStateNormal];
+            [self.twoNextButton setTitle:@"有声音" forState:UIControlStateNormal];
+        }
+            break;
+        case 3: // 设备检测成功
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_audioSuccess"]];
+            [self.lineThree setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusFour setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"设备检测成功"];
+            [self.descLabel setText:@"恭喜您!话筒与扬声器测试已通过"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"下一步" forState:UIControlStateNormal];
+        }
+            break;
+        case 4: // 网络
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_networking"]];
+            [self.lineFour setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusFive setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"网络检测中"];
+            [self.descLabel setText:@"检测中..."];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"下一步" forState:UIControlStateNormal];
+        }
+            break;
+        case 5: // 通知权限
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_notification"]];
+            [self.linefive setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusSix setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"通知权限"];
+            [self.descLabel setText:@"通知权限已开启,再也不会错过上课提醒了"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"完成测试" forState:UIControlStateNormal];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
++ (instancetype)shareInstance {
+    DeviceCheckView *view = [[[NSBundle mainBundle] loadNibNamed:@"DeviceCheckView" owner:nil options:nil] firstObject];
+    view.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
+    return view;
+}
+
+
+
+- (void)showAlert {
+    
+    [self resetView];
+    [[UIApplication sharedApplication].keyWindow addSubview:self];
+    [self setPopAnimation];
+
+}
+
+- (IBAction)cancleAction:(id)sender {
+    [self removeFromSuperview];
+}
+
+- (void)hiddenView {
+    [self removeFromSuperview];
+}
+
+
+#pragma mark ---- one button action
+
+- (IBAction)oneButtonAction:(UIButton *)sender {
+    if (self.currentIndex == 5) {
+        [self hiddenView];
+    }
+    else if (self.currentIndex == 0) {
+        self.currentIndex++;
+    }
+    else if (self.currentIndex == 1) {
+        if (_isRecording == NO) { // 如果没有开始录音
+            _isRecording = YES;
+            [sender setTitle:@"停止录音" forState:UIControlStateNormal];
+            [self.recordManager ks_record];
+        }
+        else {
+            _isRecording = NO;
+            [self.recordManager ks_stop];
+            NSURL *fileUrl = [self.recordManager getSavePath];
+            self.playManager = [AudioPlayManager shareInstanceWithFileUrl:fileUrl];
+            [self.playManager playMusic];
+            self.currentIndex++;
+        }
+
+    }
+    else if (self.currentIndex == 3) {
+        [self.recordManager ks_deleteRecording];
+        [self.playManager stopMusic];
+        
+        [self checkNetWorkStatus];
+    }
+    else if (self.currentIndex == 4) {
+        [self checkNotificationStatus];
+    }
+    
+}
+
+
+- (void)checkNotificationStatus {
+    if ([self isAllowedNotification]) { // 通知开启了
+        self.currentIndex++;
+        [self.statusSix setImage:[UIImage imageNamed:@"check_success"]];
+    }
+    else {
+        self.currentIndex++;
+        [self.statusSix setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.descLabel setText:@"通知权限未开启,可能错过上课提醒哦! 快去开启通知权限吧~"];
+        self.twoButtonView.hidden = NO;
+        [self.twoPreButton setTitle:@"完成测试" forState:UIControlStateNormal];
+        [self.twoNextButton setTitle:@"去设置" forState:UIControlStateNormal];
+    }
+}
+
+- (BOOL)isAllowedNotification {
+    UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
+    if (UIUserNotificationTypeNone == setting.types) {
+        return NO;
+    }else{
+        return YES;
+    }
+}
+
+
+#pragma mark --- two view aciton
+
+- (IBAction)preAction:(UIButton *)sender {
+    if (self.currentIndex == 2) { // 点击无声音按钮
+        [self.lineThree setImage:[UIImage imageNamed:@"check_line"]];
+        
+        [self.statusTwo setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.statusThree setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.statusFour setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.titleLabel setText:@"扬声器故障"];
+        self.twoPreButton.userInteractionEnabled = NO;
+        self.twoNextButton.userInteractionEnabled = NO;
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            [self checkNetWorkStatus];
+            self.twoPreButton.userInteractionEnabled = YES;
+            self.twoNextButton.userInteractionEnabled = YES;
+        });
+    }
+    else if (self.currentIndex == 5) {
+        [self hiddenView];
+    }
+    
+}
+- (IBAction)nextAction:(UIButton *)sender {
+    if (self.currentIndex == 2) {
+        [self.statusThree setImage:[UIImage imageNamed:@"check_success"]];
+        self.currentIndex++;
+        [self.statusFour setImage:[UIImage imageNamed:@"check_success"]];
+    }
+    else if (self.currentIndex == 5) {
+        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
+    }
+}
+
+/**
+ *  获得录音机管理
+ *
+ *  @return 录音机对象
+ */
+- (AudioRecordManager *)recordManager {
+    if (!_recordManager) {
+        _recordManager = [AudioRecordManager shareManager];
+        _recordManager.delegate = self;
+    }
+    return _recordManager;
+}
+
+
+- (void)checkNetWorkStatus {
+    self.currentIndex = 4;
+    if ([self checkNetworkAvaiable]) {
+        [self.statusFive setImage:[UIImage imageNamed:@"check_success"]];
+        [self.titleLabel setText:@"网络监测成功"];
+        [self.descLabel setText:@"您当前的网络状态良好"];
+    }
+    else {
+        [self.statusFive setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.titleLabel setText:@"网络检测失败"];
+        [self.descLabel setText:@"您当前网络不顺畅"];
+    }
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 316 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.xib

@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="DeviceCheckView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Zmy-Pw-FTY">
+                    <rect key="frame" x="47" y="273" width="320" height="350"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_device" translatesAutoresizingMaskIntoConstraints="NO" id="Ybv-mj-eom">
+                            <rect key="frame" x="89.5" y="32" width="141" height="100"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="141" id="aIQ-rP-GfG"/>
+                                <constraint firstAttribute="height" constant="100" id="mAe-xd-cdU"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="为确保您能正常上课,现在 进行声音测试" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vBL-nf-rns">
+                            <rect key="frame" x="72" y="207.5" width="176" height="33.5"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="设备检测" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2pm-DD-0Zn">
+                            <rect key="frame" x="121.5" y="174.5" width="77.5" height="23"/>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="19"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="“我正在测试话筒与扬声器”" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rhw-Re-56P">
+                            <rect key="frame" x="72" y="246" width="176" height="17"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.97647058823529409" green="0.44705882352941173" blue="0.082352941176470587" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rhR-Ci-BCJ">
+                            <rect key="frame" x="17" y="140" width="286" height="30"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checking" translatesAutoresizingMaskIntoConstraints="NO" id="XhU-dZ-JOy">
+                                    <rect key="frame" x="0.0" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="7Yf-kW-RUl"/>
+                                        <constraint firstAttribute="height" constant="16" id="vFh-bX-Igz"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="yqs-In-2I8">
+                                    <rect key="frame" x="54" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="j0q-qK-eWZ"/>
+                                        <constraint firstAttribute="width" constant="16" id="pP0-1L-u2z"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="477-Jk-ulS">
+                                    <rect key="frame" x="108" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="RnY-r1-Zch"/>
+                                        <constraint firstAttribute="width" constant="16" id="d29-b7-Ays"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="i0a-fX-uJ5">
+                                    <rect key="frame" x="162" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="Cnt-LS-LeD"/>
+                                        <constraint firstAttribute="width" constant="16" id="iEr-2w-JlC"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="vbc-13-Btw">
+                                    <rect key="frame" x="216" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="EX3-pB-4QD"/>
+                                        <constraint firstAttribute="height" constant="16" id="GAS-4W-Qbi"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="1o3-0N-PUx">
+                                    <rect key="frame" x="270" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="BY0-B3-0gF"/>
+                                        <constraint firstAttribute="width" constant="16" id="qp6-dw-T2b"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="qzN-aT-8PH">
+                                    <rect key="frame" x="19" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="766-rF-YxW"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="Kvf-yd-HBC">
+                                    <rect key="frame" x="73" y="14.5" width="30" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="vLI-dT-LkK"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="b5y-SH-YJ8">
+                                    <rect key="frame" x="127" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="O6v-VS-bTU"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="fWi-tP-pjx">
+                                    <rect key="frame" x="181" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="oeF-1x-728"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="1Tc-mQ-6ZS">
+                                    <rect key="frame" x="235" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="zRY-Hl-rgG"/>
+                                    </constraints>
+                                </imageView>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="1o3-0N-PUx" firstAttribute="leading" secondItem="vbc-13-Btw" secondAttribute="trailing" constant="38" id="40Z-e5-IcK"/>
+                                <constraint firstItem="vbc-13-Btw" firstAttribute="leading" secondItem="fWi-tP-pjx" secondAttribute="trailing" constant="3" id="5Bt-mf-CbD"/>
+                                <constraint firstItem="qzN-aT-8PH" firstAttribute="centerY" secondItem="rhR-Ci-BCJ" secondAttribute="centerY" id="6Ni-gJ-na2"/>
+                                <constraint firstItem="1Tc-mQ-6ZS" firstAttribute="centerY" secondItem="Kvf-yd-HBC" secondAttribute="centerY" id="8sZ-gR-hRn"/>
+                                <constraint firstAttribute="height" constant="30" id="9B8-fo-dqd"/>
+                                <constraint firstItem="yqs-In-2I8" firstAttribute="leading" secondItem="qzN-aT-8PH" secondAttribute="trailing" constant="3" id="ABn-Od-hJj"/>
+                                <constraint firstItem="Kvf-yd-HBC" firstAttribute="leading" secondItem="yqs-In-2I8" secondAttribute="trailing" constant="3" id="BdR-6v-sgY"/>
+                                <constraint firstAttribute="trailing" secondItem="1o3-0N-PUx" secondAttribute="trailing" id="FpL-3L-39k"/>
+                                <constraint firstItem="1o3-0N-PUx" firstAttribute="centerY" secondItem="XhU-dZ-JOy" secondAttribute="centerY" id="Ftf-YP-GOS"/>
+                                <constraint firstItem="fWi-tP-pjx" firstAttribute="leading" secondItem="i0a-fX-uJ5" secondAttribute="trailing" constant="3" id="Is8-Jb-2dT"/>
+                                <constraint firstItem="i0a-fX-uJ5" firstAttribute="leading" secondItem="b5y-SH-YJ8" secondAttribute="trailing" constant="3" id="JaO-yG-Z4f"/>
+                                <constraint firstItem="XhU-dZ-JOy" firstAttribute="centerY" secondItem="rhR-Ci-BCJ" secondAttribute="centerY" id="L68-JR-wGD"/>
+                                <constraint firstItem="1o3-0N-PUx" firstAttribute="leading" secondItem="1Tc-mQ-6ZS" secondAttribute="trailing" constant="3" id="OlI-88-W9s"/>
+                                <constraint firstItem="b5y-SH-YJ8" firstAttribute="centerY" secondItem="Kvf-yd-HBC" secondAttribute="centerY" id="Ozn-Q3-mP8"/>
+                                <constraint firstItem="Kvf-yd-HBC" firstAttribute="centerY" secondItem="rhR-Ci-BCJ" secondAttribute="centerY" id="PVb-b8-WxC"/>
+                                <constraint firstItem="i0a-fX-uJ5" firstAttribute="leading" secondItem="477-Jk-ulS" secondAttribute="trailing" constant="38" id="Peq-6C-3u7"/>
+                                <constraint firstItem="1Tc-mQ-6ZS" firstAttribute="leading" secondItem="vbc-13-Btw" secondAttribute="trailing" constant="3" id="TFj-y4-IDi"/>
+                                <constraint firstItem="fWi-tP-pjx" firstAttribute="centerY" secondItem="Kvf-yd-HBC" secondAttribute="centerY" id="aq8-SN-hqA"/>
+                                <constraint firstItem="yqs-In-2I8" firstAttribute="leading" secondItem="XhU-dZ-JOy" secondAttribute="trailing" constant="38" id="c6X-LX-6b5"/>
+                                <constraint firstItem="qzN-aT-8PH" firstAttribute="leading" secondItem="XhU-dZ-JOy" secondAttribute="trailing" constant="3" id="cFC-dj-7xP"/>
+                                <constraint firstItem="vbc-13-Btw" firstAttribute="centerY" secondItem="XhU-dZ-JOy" secondAttribute="centerY" id="dMM-cc-eXr"/>
+                                <constraint firstItem="b5y-SH-YJ8" firstAttribute="leading" secondItem="477-Jk-ulS" secondAttribute="trailing" constant="3" id="kwP-GC-ngc"/>
+                                <constraint firstItem="vbc-13-Btw" firstAttribute="leading" secondItem="i0a-fX-uJ5" secondAttribute="trailing" constant="38" id="mlS-E5-y90"/>
+                                <constraint firstItem="i0a-fX-uJ5" firstAttribute="centerY" secondItem="XhU-dZ-JOy" secondAttribute="centerY" id="nCe-vb-33c"/>
+                                <constraint firstItem="yqs-In-2I8" firstAttribute="centerY" secondItem="XhU-dZ-JOy" secondAttribute="centerY" id="okI-BB-2sr"/>
+                                <constraint firstItem="477-Jk-ulS" firstAttribute="centerY" secondItem="XhU-dZ-JOy" secondAttribute="centerY" id="qz2-Xi-FrL"/>
+                                <constraint firstItem="XhU-dZ-JOy" firstAttribute="leading" secondItem="rhR-Ci-BCJ" secondAttribute="leading" id="web-cr-bmE"/>
+                            </constraints>
+                        </view>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5vQ-my-rJb">
+                            <rect key="frame" x="280" y="0.0" width="40" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="40" id="ADn-n0-GyE"/>
+                                <constraint firstAttribute="height" constant="40" id="Gh8-7P-8Y5"/>
+                            </constraints>
+                            <state key="normal" image="check_cancle"/>
+                            <connections>
+                                <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Cu1-tr-R02"/>
+                            </connections>
+                        </button>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7QM-34-heS">
+                            <rect key="frame" x="0.0" y="277" width="320" height="45"/>
+                            <subviews>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AQ9-e9-PS8">
+                                    <rect key="frame" x="60" y="0.0" width="200" height="45"/>
+                                    <color key="backgroundColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="45" id="mqD-6p-bqe"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="开始测试"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="20"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="oneButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="deS-Is-P3L"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="AQ9-e9-PS8" secondAttribute="trailing" constant="60" id="8kf-1s-7lo"/>
+                                <constraint firstItem="AQ9-e9-PS8" firstAttribute="top" secondItem="7QM-34-heS" secondAttribute="top" id="Ckk-HH-5il"/>
+                                <constraint firstItem="AQ9-e9-PS8" firstAttribute="leading" secondItem="7QM-34-heS" secondAttribute="leading" constant="60" id="Flz-Rt-pJ4"/>
+                                <constraint firstAttribute="height" constant="45" id="NAO-Qo-ORA"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5Iv-wq-O2H">
+                            <rect key="frame" x="0.0" y="277" width="320" height="45"/>
+                            <subviews>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SPT-Hd-ERF">
+                                    <rect key="frame" x="172" y="0.0" width="120" height="45"/>
+                                    <color key="backgroundColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="有声音"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="22.5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="nextAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="DTr-YZ-umg"/>
+                                    </connections>
+                                </button>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3Vr-mf-Mbz">
+                                    <rect key="frame" x="28" y="0.0" width="120" height="45"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="无声音">
+                                        <color key="titleColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    </state>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="22.5"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="preAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="EeJ-9E-Fj6"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="3Vr-mf-Mbz" firstAttribute="leading" secondItem="5Iv-wq-O2H" secondAttribute="leading" constant="28" id="2vT-3R-3cK"/>
+                                <constraint firstAttribute="trailing" secondItem="SPT-Hd-ERF" secondAttribute="trailing" constant="28" id="GZ8-BC-qfh"/>
+                                <constraint firstItem="SPT-Hd-ERF" firstAttribute="leading" secondItem="3Vr-mf-Mbz" secondAttribute="trailing" constant="24" id="NyZ-C1-5DL"/>
+                                <constraint firstAttribute="height" constant="45" id="VCF-PW-fak"/>
+                                <constraint firstItem="3Vr-mf-Mbz" firstAttribute="top" secondItem="5Iv-wq-O2H" secondAttribute="top" id="YrR-ft-Fgc"/>
+                                <constraint firstItem="SPT-Hd-ERF" firstAttribute="top" secondItem="5Iv-wq-O2H" secondAttribute="top" id="cbm-mt-f3h"/>
+                                <constraint firstItem="SPT-Hd-ERF" firstAttribute="width" secondItem="3Vr-mf-Mbz" secondAttribute="width" id="dXY-rD-GZ3"/>
+                                <constraint firstAttribute="bottom" secondItem="3Vr-mf-Mbz" secondAttribute="bottom" id="ne8-mh-1iE"/>
+                                <constraint firstAttribute="bottom" secondItem="SPT-Hd-ERF" secondAttribute="bottom" id="wV1-eq-be5"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="vBL-nf-rns" firstAttribute="centerX" secondItem="2pm-DD-0Zn" secondAttribute="centerX" id="0ID-cx-8r9"/>
+                        <constraint firstItem="5vQ-my-rJb" firstAttribute="top" secondItem="Zmy-Pw-FTY" secondAttribute="top" id="4eQ-DP-Mgf"/>
+                        <constraint firstItem="Ybv-mj-eom" firstAttribute="centerX" secondItem="Zmy-Pw-FTY" secondAttribute="centerX" id="581-w0-AtI"/>
+                        <constraint firstAttribute="trailing" secondItem="5vQ-my-rJb" secondAttribute="trailing" id="5Gk-dB-Z3E"/>
+                        <constraint firstAttribute="height" constant="350" id="DiJ-ze-82C"/>
+                        <constraint firstItem="rhR-Ci-BCJ" firstAttribute="leading" secondItem="Zmy-Pw-FTY" secondAttribute="leading" constant="17" id="HFY-Th-DT0"/>
+                        <constraint firstItem="7QM-34-heS" firstAttribute="leading" secondItem="Zmy-Pw-FTY" secondAttribute="leading" id="HJP-Tf-dgb"/>
+                        <constraint firstItem="vBL-nf-rns" firstAttribute="leading" secondItem="Zmy-Pw-FTY" secondAttribute="leading" constant="72" id="Lbv-LV-7yw"/>
+                        <constraint firstItem="Ybv-mj-eom" firstAttribute="top" secondItem="Zmy-Pw-FTY" secondAttribute="top" constant="32" id="M9E-kH-yFd"/>
+                        <constraint firstItem="rhw-Re-56P" firstAttribute="top" secondItem="vBL-nf-rns" secondAttribute="bottom" constant="5" id="UKQ-Wr-oUf"/>
+                        <constraint firstAttribute="bottom" secondItem="7QM-34-heS" secondAttribute="bottom" constant="28" id="Ujv-bE-8uQ"/>
+                        <constraint firstItem="rhw-Re-56P" firstAttribute="leading" secondItem="Zmy-Pw-FTY" secondAttribute="leading" constant="72" id="YTO-EX-PDd"/>
+                        <constraint firstItem="7QM-34-heS" firstAttribute="top" secondItem="rhw-Re-56P" secondAttribute="bottom" constant="14" id="Ye8-gF-EtK"/>
+                        <constraint firstItem="rhR-Ci-BCJ" firstAttribute="top" secondItem="Ybv-mj-eom" secondAttribute="bottom" constant="8" id="Z2Y-d1-6C9"/>
+                        <constraint firstAttribute="trailing" secondItem="vBL-nf-rns" secondAttribute="trailing" constant="72" id="aH1-P7-48j"/>
+                        <constraint firstAttribute="trailing" secondItem="rhR-Ci-BCJ" secondAttribute="trailing" constant="17" id="dW2-I3-1x5"/>
+                        <constraint firstAttribute="bottom" secondItem="5Iv-wq-O2H" secondAttribute="bottom" constant="28" id="gAa-en-UrH"/>
+                        <constraint firstAttribute="trailing" secondItem="rhw-Re-56P" secondAttribute="trailing" constant="72" id="j4g-52-HbV"/>
+                        <constraint firstAttribute="trailing" secondItem="5Iv-wq-O2H" secondAttribute="trailing" id="o0G-RT-DYm"/>
+                        <constraint firstItem="vBL-nf-rns" firstAttribute="top" secondItem="2pm-DD-0Zn" secondAttribute="bottom" constant="10" id="qzK-fb-vnw"/>
+                        <constraint firstItem="5Iv-wq-O2H" firstAttribute="leading" secondItem="Zmy-Pw-FTY" secondAttribute="leading" id="rMa-rS-xxb"/>
+                        <constraint firstAttribute="width" constant="320" id="w02-VW-i2f"/>
+                        <constraint firstAttribute="trailing" secondItem="7QM-34-heS" secondAttribute="trailing" id="xLa-aX-jJm"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="calibratedRGB"/>
+            <constraints>
+                <constraint firstItem="Zmy-Pw-FTY" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="F40-jN-sn1"/>
+                <constraint firstItem="Zmy-Pw-FTY" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Z8h-P1-b6E"/>
+            </constraints>
+            <connections>
+                <outlet property="TopImageView" destination="Ybv-mj-eom" id="rC4-75-EZp"/>
+                <outlet property="descLabel" destination="vBL-nf-rns" id="i0K-hw-9bv"/>
+                <outlet property="followLabel" destination="rhw-Re-56P" id="wSt-gd-E1l"/>
+                <outlet property="lineFour" destination="fWi-tP-pjx" id="Fun-Jp-Uhs"/>
+                <outlet property="lineOne" destination="qzN-aT-8PH" id="Ljx-Sa-u9m"/>
+                <outlet property="lineThree" destination="b5y-SH-YJ8" id="HeN-da-9Y5"/>
+                <outlet property="lineTwo" destination="Kvf-yd-HBC" id="cM2-3W-JGl"/>
+                <outlet property="linefive" destination="1Tc-mQ-6ZS" id="DpC-q1-SLf"/>
+                <outlet property="oneButton" destination="AQ9-e9-PS8" id="0LP-Vb-B68"/>
+                <outlet property="oneButtonView" destination="7QM-34-heS" id="wYj-hs-xVT"/>
+                <outlet property="statusFive" destination="vbc-13-Btw" id="GpF-VQ-O9j"/>
+                <outlet property="statusFour" destination="i0a-fX-uJ5" id="79I-d3-Wat"/>
+                <outlet property="statusOne" destination="XhU-dZ-JOy" id="PPv-si-4bI"/>
+                <outlet property="statusSix" destination="1o3-0N-PUx" id="WPt-5Y-jBT"/>
+                <outlet property="statusThree" destination="477-Jk-ulS" id="jro-VA-pUc"/>
+                <outlet property="statusTwo" destination="yqs-In-2I8" id="SMw-Jt-q6H"/>
+                <outlet property="titleLabel" destination="2pm-DD-0Zn" id="ynA-Xl-Mt3"/>
+                <outlet property="twoButtonView" destination="5Iv-wq-O2H" id="R7R-wn-69d"/>
+                <outlet property="twoNextButton" destination="SPT-Hd-ERF" id="Sf3-Q3-fXi"/>
+                <outlet property="twoPreButton" destination="3Vr-mf-Mbz" id="4cq-GW-zsj"/>
+            </connections>
+            <point key="canvasLocation" x="50.724637681159422" y="35.491071428571423"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="check_cancle" width="14" height="14"/>
+        <image name="check_device" width="141" height="100"/>
+        <image name="check_dotted" width="30" height="1"/>
+        <image name="check_wait" width="16" height="16"/>
+        <image name="checking" width="16" height="16"/>
+    </resources>
+</document>

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/Controller/NetworkingCheckController.h

@@ -0,0 +1,17 @@
+//
+//  NetworkingCheckController.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/12.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NetworkingCheckController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 325 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/Controller/NetworkingCheckController.m

@@ -0,0 +1,325 @@
+//
+//  NetworkingCheckController.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/9/12.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "NetworkingCheckController.h"
+#import "NetworkBodyView.h"
+#import "KSNetTypeManager.h"
+#import "KSNetworkAlert.h"
+
+@interface NetworkingCheckController ()
+
+@property (nonatomic, strong) NetworkBodyView *bodyView;
+
+@property(nonatomic,assign)CGFloat progress; // 进度值
+
+@property(nonatomic,strong)CAShapeLayer *progressLayer;
+
+@property (nonatomic, assign) NSInteger count;
+@property (nonatomic, strong) KSNetworkAlert *alertView;
+
+
+@property (nonatomic, strong) NSString *netType;
+
+@property (nonatomic, strong) KSNetTypeManager *manager;
+
+@property (nonatomic, strong) dispatch_source_t timer;
+
+@property (nonatomic, assign) BOOL isTimerRun;
+
+@property (nonatomic, assign) BOOL isCancle;
+
+@end
+
+@implementation NetworkingCheckController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"网络监测"];
+    [self configUI];
+}
+
+- (void)configUI {
+    _bodyView = [NetworkBodyView shareInstance];
+    _bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreen_Height - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    [self.scrollView addSubview:_bodyView];
+    [self addProgressView];
+    
+    [self initNetCheck];
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    self.manager = nil;
+    _isCancle = YES;
+    if (self.timer) {
+        dispatch_source_cancel(self.timer);
+        self.timer = nil;
+    }
+}
+
+- (void)initNetCheck {
+    _isCancle = NO;
+    NSString *netType = [self.manager getInternetStatus];
+    self.bodyView.typeLabel.text = netType;
+    self.progress = 0;
+    self.bodyView.firstImage.hidden = YES;
+    self.bodyView.secondImage.hidden = YES;
+    self.bodyView.thirdImage.hidden = YES;
+    self.bodyView.fourImage.hidden = YES;
+    
+    [self updateProgress:0.25f duration:0.5f];
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        self.bodyView.firstImage.hidden = NO;
+        [self.bodyView.firstImage setImage:[UIImage imageNamed:@"check_success"]];
+        [self checkStatusWithType:netType];
+    });
+}
+
+- (void)checkStatusWithType:(NSString *)typeStr {
+    self.netType = typeStr;
+    if ([typeStr isEqualToString:@"Wi-Fi"]) {
+        [self checkWithTime:1];
+    }
+    else if ([typeStr isEqualToString:@"4G"]) {
+       [self checkWithTime:2];
+    }
+    else if ([typeStr isEqualToString:@"3G"]) {
+        [self checkWithTime:3];
+    }
+    else if ([typeStr isEqualToString:@"2G"]) {
+        [self checkWithTime:4];
+    }
+    else if ([typeStr isEqualToString:@"未知网络"]) {
+        // @"网络状态很差"
+        [self checkWithTime:5];
+    }
+    else {
+        [self setFailedCheck];
+    }
+}
+
+- (void)showAlertView:(BOOL)isSuccess {
+    
+    DISPLAYTYPE displayType = DISPLAYTYPE_NONE;
+    if (isSuccess == NO) {
+        displayType = DISPLAYTYPE_NONE;
+        
+    }
+    else {
+        if ([self.netType isEqualToString:@"3G"] || [self.netType isEqualToString:@"4G"] || [self.netType isEqualToString:@"Wi-Fi"]) {
+            displayType = DISPLAYTYPE_GOOD;
+        }
+        else if ([self.netType isEqualToString:@"无网络"]) {
+            displayType = DISPLAYTYPE_NONE;
+        }
+        else {
+            displayType = DISPLAYTYPE_BAD;
+        }
+    }
+    MJWeakSelf;
+    [self.alertView netType:displayType sureCallback:^(BACKTYPE backType) {
+        if (backType == BACKTYPE_RECHECK) {
+            [weakSelf initNetCheck];
+        }
+        else if (backType == BACKTYPE_NEWWORKING) {
+            [weakSelf.navigationController popViewControllerAnimated:YES];
+            //跳入当前App设置界面
+            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
+        }
+        else {
+            [weakSelf.navigationController popViewControllerAnimated:YES];
+        }
+    }];
+    [self.alertView showAlert];
+}
+
+
+- (void)setFailedCheck {
+    if (_isTimerRun) {
+        dispatch_source_cancel(self.timer);
+        self.timer = nil;
+        _isTimerRun = NO;
+    }
+    if ([self.bodyView.secondImage isHidden]) {
+        self.bodyView.secondImage.hidden = NO;
+        [self.bodyView.secondImage setImage:[UIImage imageNamed:@"check_fail"]];
+    }
+    if ([self.bodyView.thirdImage isHidden]) {
+        self.bodyView.thirdImage.hidden = NO;
+        [self.bodyView.thirdImage setImage:[UIImage imageNamed:@"check_fail"]];
+    }
+    if ([self.bodyView.fourImage isHidden]) {
+        self.bodyView.fourImage.hidden = NO;
+        [self.bodyView.fourImage setImage:[UIImage imageNamed:@"check_fail"]];
+        if (self.isCancle == NO) {
+            [self showAlertView:NO];
+        }
+        
+    }
+}
+
+- (void)checkWithTime:(NSInteger)countTime {
+    [self checkNetCanUseCallback:^(BOOL canUse) {
+        if (canUse) { // 能用
+            [self checkTimer:countTime];
+        }
+        else { // 失败
+            [self setFailedCheck];
+        }
+    }];
+}
+
+- (void)checkTimer:(NSInteger)countTime {
+    if (_isCancle == NO) {
+        NSTimeInterval period = 100 * countTime; //设置时间间隔
+        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
+        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
+        dispatch_source_set_timer(self.timer, dispatch_walltime(NULL, 0), period * NSEC_PER_MSEC, 0); //每秒执行
+        dispatch_source_set_event_handler(self.timer, ^{
+            dispatch_async(dispatch_get_main_queue(), ^{
+                double myProgress = self.progress + 0.01;
+                myProgress = [[NSString stringWithFormat:@"%.2f", myProgress] doubleValue];
+                [self updateProgress:myProgress duration:countTime/10.0f];
+                if (myProgress == 0.5) {
+                    [self showIndex:2 isSuccess:YES];
+                }
+                else if (myProgress == 0.75) {
+                    [self showIndex:3 isSuccess:YES];
+                }
+                else if (myProgress == 1.0) {
+                    [self showIndex:4 isSuccess:YES];
+                }
+            });
+        });
+        
+        dispatch_resume(self.timer);
+        _isTimerRun = YES;
+    }
+}
+
+- (void)showIndex:(NSInteger)index isSuccess:(BOOL)isSuccess {
+    if (index == 2) {
+        NSString *imageName = isSuccess ? @"check_success" : @"check_fail";
+        self.bodyView.secondImage.hidden = NO;
+        [self.bodyView.secondImage setImage:[UIImage imageNamed:imageName]];
+    }
+    else if (index == 3) {
+        NSString *imageName = isSuccess ? @"check_success" : @"check_fail";
+        self.bodyView.thirdImage.hidden = NO;
+        [self.bodyView.thirdImage setImage:[UIImage imageNamed:imageName]];
+    }
+    else if (index == 4) {
+        NSString *imageName = isSuccess ? @"check_success" : @"check_fail";
+        self.bodyView.fourImage.hidden = NO;
+        [self.bodyView.fourImage setImage:[UIImage imageNamed:imageName]];
+    }
+}
+
+ 
+- (void)checkNetCanUseCallback:(void(^)(BOOL canUse))callback {
+    
+    [KSRequestManager queryCountOfUnreadRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
+        callback(YES);
+    } faliure:^(NSError * _Nonnull error) {
+        callback(NO);
+    }];
+}
+
+- (void)addProgressView {
+    self.bodyView.progressLabel.text = @"0%";
+    // 进度layer
+    CGFloat width = CGRectGetHeight(self.bodyView.animationView.frame)-30;
+    UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(15, 15, width, width) cornerRadius:width/2.0f];
+    
+    self.progressLayer = [CAShapeLayer layer];
+    self.progressLayer.fillColor = [UIColor clearColor].CGColor;
+    self.progressLayer.strokeColor = HexRGB(0x13bab3).CGColor;
+    self.progressLayer.lineWidth = 20;
+    self.progressLayer.path = circlePath.CGPath;
+    self.progressLayer.strokeEnd = 0;
+    [self.bodyView.animationView.layer addSublayer:self.progressLayer];
+    
+}
+
+
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+}
+
+
+#pragma mark - private method
+-(void)updateProgress:(CGFloat)progress duration:(float)duration
+{
+    self.bodyView.progressLabel.text = [NSString stringWithFormat:@"%.0f%%", progress*100];
+    self.progressLayer.strokeEnd = progress;
+    //开始执行扇形动画
+    CABasicAnimation *strokeEndAni = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+    strokeEndAni.fromValue = @(self.progress);
+    strokeEndAni.toValue = @(progress);
+    strokeEndAni.duration = duration;
+    strokeEndAni.repeatCount = 1; // 重复次数
+    [self.progressLayer addAnimation:strokeEndAni forKey:@"ani"];
+    self.progress = progress;
+    if (self.progress == 1.0f) {
+        if (_isTimerRun) {
+            dispatch_source_cancel(self.timer);
+            self.timer = nil;
+            _isTimerRun = NO;
+        }
+        if (self.isCancle == NO) {
+            [self showAlertView:YES];
+        }
+
+    }
+}
+
+
+- (KSNetworkAlert *)alertView {
+    if (!_alertView) {
+        _alertView = [KSNetworkAlert shareInstance];
+        _alertView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
+    }
+    return _alertView;
+}
+
+- (KSNetTypeManager *)manager {
+    if (!_manager) {
+        _manager = [[KSNetTypeManager alloc] init];
+        MJWeakSelf;
+        [_manager notiferCallback:^(NSString * _Nonnull netType) {
+            weakSelf.bodyView.typeLabel.text = netType;
+            weakSelf.netType = netType;
+            if ([netType isEqualToString:@"无网络"]) {
+                if (weakSelf.isTimerRun) {
+                    dispatch_source_cancel(weakSelf.timer);
+                    weakSelf.timer = nil;
+                    weakSelf.isTimerRun = NO;
+                }
+                if (weakSelf.isCancle == NO) {
+                    [weakSelf showAlertView:NO];
+                }
+            }
+        }];
+    }
+    return _manager;
+}
+
+
+/*
+#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

+ 38 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.h

@@ -0,0 +1,38 @@
+//
+//  KSNetworkAlert.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/10/18.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+typedef NS_ENUM(NSInteger, DISPLAYTYPE) {
+    DISPLAYTYPE_GOOD = 1,
+    DISPLAYTYPE_BAD,
+    DISPLAYTYPE_NONE,
+};
+typedef NS_ENUM(NSInteger, BACKTYPE) {
+    BACKTYPE_DONE,
+    BACKTYPE_RECHECK,
+    BACKTYPE_NEWWORKING,
+};
+
+typedef void(^CheckCallback)(BACKTYPE backType);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSNetworkAlert : UIView
+
++ (instancetype)shareInstance;
+
+- (void)netType:(DISPLAYTYPE)type sureCallback:(CheckCallback)callback;
+
+- (void)showAlert;
+
+- (void)hiddenAction;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 107 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.m

@@ -0,0 +1,107 @@
+//
+//  KSNetworkAlert.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/10/18.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "KSNetworkAlert.h"
+#import "UIView+Animation.h"
+
+@interface KSNetworkAlert ()
+@property (weak, nonatomic) IBOutlet UILabel *topTitle;
+@property (weak, nonatomic) IBOutlet UILabel *descMessage;
+@property (weak, nonatomic) IBOutlet UIButton *cancleButton;
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@property (nonatomic, copy) CheckCallback callback;
+@property (nonatomic, assign) DISPLAYTYPE type;
+
+@property (nonatomic, assign) BOOL isShow;
+@end
+
+@implementation KSNetworkAlert
+
++ (instancetype)shareInstance {
+    KSNetworkAlert *view = [[[NSBundle mainBundle] loadNibNamed:@"KSNetworkAlert" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)netType:(DISPLAYTYPE)type sureCallback:(CheckCallback)callback {
+    self.type = type;
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)showAlert {
+    if (_isShow == NO) {
+        [[UIApplication sharedApplication].keyWindow addSubview:self];
+        [self setPopAnimation];
+        self.isShow = YES;
+    }
+}
+
+- (void)hiddenAction {
+    self.isShow = NO;
+    [self removeFromSuperview];
+}
+
+- (IBAction)cancleAction:(id)sender {
+    if (self.callback) {
+        BACKTYPE backType = self.type == DISPLAYTYPE_GOOD ? BACKTYPE_DONE : BACKTYPE_NEWWORKING;
+        self.callback(backType);
+    }
+    [self hiddenAction];
+}
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        self.callback(BACKTYPE_RECHECK);
+    }
+    [self hiddenAction];
+}
+
+- (void)setType:(DISPLAYTYPE)type {
+    _type = type;
+    switch (type) {
+        case DISPLAYTYPE_GOOD:
+        {
+            self.topTitle.text = @"良好";
+            self.topTitle.textColor = THEMECOLOR;
+            self.descMessage.text = @"恭喜你!网络十分流畅";
+            [self.cancleButton setTitle:@"我知道了" forState:UIControlStateNormal];
+        }
+            break;
+        case DISPLAYTYPE_BAD:
+        {
+            self.topTitle.text = @"不佳";
+            self.topTitle.textColor = HexRGB(0xf85043);
+            self.descMessage.text = @"网络连接不佳,请尝试一下措施:\n1.重启路由器,并靠近路由器重试\n2.切换4G网络重试";
+            [self.cancleButton setTitle:@"连接网络" forState:UIControlStateNormal];
+            
+        }
+            break;
+        case DISPLAYTYPE_NONE:
+        {
+            self.topTitle.text = @"无网络";
+            self.topTitle.textColor = HexRGB(0xf85043);
+            self.descMessage.text = @"网络连接不佳,请尝试一下措施:\n1.重启路由器,并靠近路由器重试\n2.切换4G网络重试";
+            [self.cancleButton setTitle:@"连接网络" forState:UIControlStateNormal];
+        }
+        default:
+            break;
+    }
+    
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 99 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/KSNetworkAlert.xib

@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSNetworkAlert">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0xk-uH-Myy">
+                    <rect key="frame" x="32" y="384" width="350" height="128"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="检测成功" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o3C-or-ESI">
+                            <rect key="frame" x="10" y="20" width="330" height="26"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="26" id="hPN-da-6jc"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="20"/>
+                            <color key="textColor" red="0.078431372549019607" green="0.5725490196078431" blue="0.54117647058823526" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="恭喜你!网络十分流畅" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="N75-O4-swH">
+                            <rect key="frame" x="10" y="51" width="330" height="17"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="l3M-5e-jRd">
+                            <rect key="frame" x="254" y="78" width="80" height="40"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <state key="normal" title="重新检测">
+                                <color key="titleColor" red="0.0" green="0.58823529409999997" blue="0.53333333329999999" alpha="1" colorSpace="calibratedRGB"/>
+                            </state>
+                            <connections>
+                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="7tj-yI-438"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mEO-8y-QQW">
+                            <rect key="frame" x="16" y="78" width="80" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="80" id="20O-QG-agO"/>
+                                <constraint firstAttribute="height" constant="40" id="Mdh-TC-9BF"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <state key="normal" title="连接网络">
+                                <color key="titleColor" red="0.0" green="0.58823529409999997" blue="0.53333333329999999" alpha="1" colorSpace="calibratedRGB"/>
+                            </state>
+                            <connections>
+                                <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="mPU-7t-BWp"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstAttribute="bottom" secondItem="mEO-8y-QQW" secondAttribute="bottom" constant="10" id="616-tE-Fvv"/>
+                        <constraint firstItem="l3M-5e-jRd" firstAttribute="height" secondItem="mEO-8y-QQW" secondAttribute="height" id="7h9-r4-wHj"/>
+                        <constraint firstItem="mEO-8y-QQW" firstAttribute="leading" secondItem="0xk-uH-Myy" secondAttribute="leading" constant="16" id="BUt-2C-yFf"/>
+                        <constraint firstItem="N75-O4-swH" firstAttribute="leading" secondItem="0xk-uH-Myy" secondAttribute="leading" constant="10" id="Kwn-Ms-d1C"/>
+                        <constraint firstAttribute="trailing" secondItem="N75-O4-swH" secondAttribute="trailing" constant="10" id="NXY-wV-lcg"/>
+                        <constraint firstItem="N75-O4-swH" firstAttribute="top" secondItem="o3C-or-ESI" secondAttribute="bottom" constant="5" id="QRE-4F-ldU"/>
+                        <constraint firstItem="l3M-5e-jRd" firstAttribute="bottom" secondItem="mEO-8y-QQW" secondAttribute="bottom" id="fIU-hJ-mWM"/>
+                        <constraint firstItem="l3M-5e-jRd" firstAttribute="top" secondItem="N75-O4-swH" secondAttribute="bottom" constant="10" id="lJt-w6-oEE"/>
+                        <constraint firstItem="o3C-or-ESI" firstAttribute="top" secondItem="0xk-uH-Myy" secondAttribute="top" constant="20" id="lfb-Bv-479"/>
+                        <constraint firstItem="l3M-5e-jRd" firstAttribute="width" secondItem="mEO-8y-QQW" secondAttribute="width" id="lg8-7Y-QKT"/>
+                        <constraint firstAttribute="trailing" secondItem="l3M-5e-jRd" secondAttribute="trailing" constant="16" id="phH-U1-VZ2"/>
+                        <constraint firstAttribute="trailing" secondItem="o3C-or-ESI" secondAttribute="trailing" constant="10" id="ttv-W2-XTC"/>
+                        <constraint firstItem="o3C-or-ESI" firstAttribute="leading" secondItem="0xk-uH-Myy" secondAttribute="leading" constant="10" id="v1l-FK-xxN"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="0xk-uH-Myy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="32" id="6b5-JX-qvR"/>
+                <constraint firstItem="0xk-uH-Myy" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="I4s-zB-AUg"/>
+                <constraint firstAttribute="trailing" secondItem="0xk-uH-Myy" secondAttribute="trailing" constant="32" id="IPr-mM-hlE"/>
+                <constraint firstItem="0xk-uH-Myy" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Mur-7h-EYW"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="cancleButton" destination="mEO-8y-QQW" id="V9A-9r-PFa"/>
+                <outlet property="descMessage" destination="N75-O4-swH" id="wxA-a5-8AV"/>
+                <outlet property="sureButton" destination="l3M-5e-jRd" id="5Ys-k9-iz9"/>
+                <outlet property="topTitle" destination="o3C-or-ESI" id="iod-eT-LrP"/>
+            </connections>
+            <point key="canvasLocation" x="137.68115942028987" y="136.60714285714286"/>
+        </view>
+    </objects>
+</document>

+ 35 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.h

@@ -0,0 +1,35 @@
+//
+//  NetworkBodyView.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/10/17.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NetworkBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@property (weak, nonatomic) IBOutlet UIView *animationView;
+
+@property (weak, nonatomic) IBOutlet UILabel *progressLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *typeLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *firstImage;
+
+@property (weak, nonatomic) IBOutlet UIImageView *secondImage;
+
+@property (weak, nonatomic) IBOutlet UIImageView *thirdImage;
+
+@property (weak, nonatomic) IBOutlet UIImageView *fourImage;
+
++ (instancetype)shareInstance;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 34 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.m

@@ -0,0 +1,34 @@
+//
+//  NetworkBodyView.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/10/17.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "NetworkBodyView.h"
+
+@implementation NetworkBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.firstImage.hidden = YES;
+    self.secondImage.hidden = YES;
+    self.thirdImage.hidden = YES;
+    self.fourImage.hidden = YES;
+}
+
++ (instancetype)shareInstance {
+    NetworkBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"NetworkBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 218 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Networking/View/NetworkBodyView.xib

@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="NetworkBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NyS-l8-KBh">
+                    <rect key="frame" x="0.0" y="0.0" width="414" height="230"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="L7i-nS-Ym1">
+                            <rect key="frame" x="110" y="18" width="194" height="194"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bDe-vF-HR8">
+                                    <rect key="frame" x="10" y="10" width="174" height="174"/>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="100%" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="R3V-ON-3fd">
+                                    <rect key="frame" x="48.5" y="60.5" width="97.5" height="53"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="53" id="eDJ-ef-cql"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="38"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="WI-FI" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JFd-GJ-3zG">
+                                    <rect key="frame" x="81" y="116.5" width="32" height="17"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="17" id="SkA-lw-Z8I"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                            <constraints>
+                                <constraint firstItem="R3V-ON-3fd" firstAttribute="centerY" secondItem="L7i-nS-Ym1" secondAttribute="centerY" constant="-10" id="1JZ-jC-xbf"/>
+                                <constraint firstAttribute="bottom" secondItem="bDe-vF-HR8" secondAttribute="bottom" constant="10" id="BX6-FV-3Ca"/>
+                                <constraint firstItem="bDe-vF-HR8" firstAttribute="top" secondItem="L7i-nS-Ym1" secondAttribute="top" constant="10" id="GQE-k8-MeI"/>
+                                <constraint firstAttribute="height" constant="194" id="GgC-6O-Fup"/>
+                                <constraint firstAttribute="width" constant="194" id="Ipo-iZ-knC"/>
+                                <constraint firstItem="bDe-vF-HR8" firstAttribute="leading" secondItem="L7i-nS-Ym1" secondAttribute="leading" constant="10" id="YQn-T5-zvB"/>
+                                <constraint firstItem="R3V-ON-3fd" firstAttribute="centerX" secondItem="L7i-nS-Ym1" secondAttribute="centerX" id="aNC-o7-0fI"/>
+                                <constraint firstAttribute="trailing" secondItem="bDe-vF-HR8" secondAttribute="trailing" constant="10" id="i3X-Pv-IoZ"/>
+                                <constraint firstItem="JFd-GJ-3zG" firstAttribute="centerX" secondItem="R3V-ON-3fd" secondAttribute="centerX" id="vPD-JI-UKl"/>
+                                <constraint firstItem="JFd-GJ-3zG" firstAttribute="top" secondItem="R3V-ON-3fd" secondAttribute="bottom" constant="3" id="yav-d0-BlX"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="4"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="97"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" red="0.078431372549019607" green="0.5725490196078431" blue="0.54117647058823526" alpha="0.14000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="230" id="Iqk-ta-x68"/>
+                        <constraint firstItem="L7i-nS-Ym1" firstAttribute="centerX" secondItem="NyS-l8-KBh" secondAttribute="centerX" id="OrK-aO-bvT"/>
+                        <constraint firstItem="L7i-nS-Ym1" firstAttribute="centerY" secondItem="NyS-l8-KBh" secondAttribute="centerY" id="PfY-6g-OJA"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vwo-Od-dSA">
+                    <rect key="frame" x="0.0" y="232" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="设备初始化" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0qU-sN-cat">
+                            <rect key="frame" x="16" y="15" width="82" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_success" translatesAutoresizingMaskIntoConstraints="NO" id="CJa-83-XdH">
+                            <rect key="frame" x="378" y="15" width="20" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="5wE-rf-0y7"/>
+                                <constraint firstAttribute="width" constant="20" id="6vL-fh-Elo"/>
+                            </constraints>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstItem="CJa-83-XdH" firstAttribute="centerY" secondItem="vwo-Od-dSA" secondAttribute="centerY" id="Y3o-zt-iZG"/>
+                        <constraint firstItem="0qU-sN-cat" firstAttribute="centerY" secondItem="vwo-Od-dSA" secondAttribute="centerY" id="a2z-Hc-lru"/>
+                        <constraint firstAttribute="height" constant="50" id="mkM-3r-Zqs"/>
+                        <constraint firstItem="0qU-sN-cat" firstAttribute="leading" secondItem="vwo-Od-dSA" secondAttribute="leading" constant="16" id="w73-c7-zs3"/>
+                        <constraint firstAttribute="trailing" secondItem="CJa-83-XdH" secondAttribute="trailing" constant="16" id="wsD-hP-SVP"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="omq-Nv-3ax">
+                    <rect key="frame" x="0.0" y="284" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="路由环境检测" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WrP-Qk-2Qh">
+                            <rect key="frame" x="16" y="15" width="98" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_success" translatesAutoresizingMaskIntoConstraints="NO" id="BJM-DG-RGT">
+                            <rect key="frame" x="378" y="15" width="20" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="20" id="35Q-Yc-PMn"/>
+                                <constraint firstAttribute="height" constant="20" id="MAX-MS-s4E"/>
+                            </constraints>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstItem="WrP-Qk-2Qh" firstAttribute="centerY" secondItem="omq-Nv-3ax" secondAttribute="centerY" id="0nS-6N-CCm"/>
+                        <constraint firstAttribute="height" constant="50" id="WWl-Zu-Xir"/>
+                        <constraint firstAttribute="trailing" secondItem="BJM-DG-RGT" secondAttribute="trailing" constant="16" id="lVG-Ny-Rj4"/>
+                        <constraint firstItem="WrP-Qk-2Qh" firstAttribute="leading" secondItem="omq-Nv-3ax" secondAttribute="leading" constant="16" id="luc-ax-eeq"/>
+                        <constraint firstItem="BJM-DG-RGT" firstAttribute="centerY" secondItem="omq-Nv-3ax" secondAttribute="centerY" id="v3P-4I-4he"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="m2d-Zp-G8O">
+                    <rect key="frame" x="0.0" y="336" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="线路检测" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TmO-OX-UKh">
+                            <rect key="frame" x="16" y="15" width="66" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_success" translatesAutoresizingMaskIntoConstraints="NO" id="GdD-FJ-66G">
+                            <rect key="frame" x="378" y="15" width="20" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="QtM-1q-iS3"/>
+                                <constraint firstAttribute="width" constant="20" id="U9x-e8-k4l"/>
+                            </constraints>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="50" id="5wO-ht-Aiw"/>
+                        <constraint firstAttribute="trailing" secondItem="GdD-FJ-66G" secondAttribute="trailing" constant="16" id="6Vf-Xe-GpK"/>
+                        <constraint firstItem="TmO-OX-UKh" firstAttribute="centerY" secondItem="m2d-Zp-G8O" secondAttribute="centerY" id="W9T-sU-gxM"/>
+                        <constraint firstItem="GdD-FJ-66G" firstAttribute="centerY" secondItem="m2d-Zp-G8O" secondAttribute="centerY" id="mIe-Cj-pVi"/>
+                        <constraint firstItem="TmO-OX-UKh" firstAttribute="leading" secondItem="m2d-Zp-G8O" secondAttribute="leading" constant="16" id="zto-Gd-miS"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GfR-ya-d9U">
+                    <rect key="frame" x="0.0" y="388" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="模拟线路测试" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zZ5-sJ-lVd">
+                            <rect key="frame" x="16" y="15.5" width="98" height="19.5"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_success" translatesAutoresizingMaskIntoConstraints="NO" id="6VN-LD-9SL">
+                            <rect key="frame" x="378" y="15" width="20" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="20" id="UNa-Hu-WWc"/>
+                                <constraint firstAttribute="height" constant="20" id="gKO-2E-6jm"/>
+                            </constraints>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstItem="zZ5-sJ-lVd" firstAttribute="leading" secondItem="GfR-ya-d9U" secondAttribute="leading" constant="16" id="FLi-sz-meO"/>
+                        <constraint firstAttribute="height" constant="50" id="L0F-Fo-aG9"/>
+                        <constraint firstAttribute="trailing" secondItem="6VN-LD-9SL" secondAttribute="trailing" constant="16" id="MDJ-kG-obn"/>
+                        <constraint firstItem="6VN-LD-9SL" firstAttribute="centerY" secondItem="GfR-ya-d9U" secondAttribute="centerY" id="sTn-FJ-GOg"/>
+                        <constraint firstItem="zZ5-sJ-lVd" firstAttribute="centerY" secondItem="GfR-ya-d9U" secondAttribute="centerY" id="xta-h6-R7X"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.95294117647058818" green="0.95686274509803915" blue="0.97254901960784312" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="GfR-ya-d9U" secondAttribute="trailing" id="2VL-yd-dW6"/>
+                <constraint firstItem="GfR-ya-d9U" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Myg-Od-mxv"/>
+                <constraint firstItem="vwo-Od-dSA" firstAttribute="top" secondItem="NyS-l8-KBh" secondAttribute="bottom" constant="2" id="Sq9-6H-sPi"/>
+                <constraint firstAttribute="trailing" secondItem="m2d-Zp-G8O" secondAttribute="trailing" id="Ssf-5a-jTO"/>
+                <constraint firstItem="NyS-l8-KBh" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Wzd-Wj-kLs"/>
+                <constraint firstAttribute="trailing" secondItem="omq-Nv-3ax" secondAttribute="trailing" id="X9J-Jo-QZh"/>
+                <constraint firstItem="GfR-ya-d9U" firstAttribute="top" secondItem="m2d-Zp-G8O" secondAttribute="bottom" constant="2" id="ZLO-97-ZCH"/>
+                <constraint firstItem="m2d-Zp-G8O" firstAttribute="top" secondItem="omq-Nv-3ax" secondAttribute="bottom" constant="2" id="bEj-dQ-R9U"/>
+                <constraint firstItem="omq-Nv-3ax" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="dtQ-nb-eNt"/>
+                <constraint firstItem="vwo-Od-dSA" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="hbQ-cb-p0f"/>
+                <constraint firstItem="m2d-Zp-G8O" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="mB9-CE-f6L"/>
+                <constraint firstItem="NyS-l8-KBh" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="mKV-oO-H1J"/>
+                <constraint firstItem="omq-Nv-3ax" firstAttribute="top" secondItem="vwo-Od-dSA" secondAttribute="bottom" constant="2" id="sf2-sa-v7a"/>
+                <constraint firstAttribute="trailing" secondItem="NyS-l8-KBh" secondAttribute="trailing" id="wIH-a9-IV2"/>
+                <constraint firstAttribute="trailing" secondItem="vwo-Od-dSA" secondAttribute="trailing" id="wZV-n9-lXd"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="animationView" destination="bDe-vF-HR8" id="nfh-bd-czk"/>
+                <outlet property="bgView" destination="L7i-nS-Ym1" id="h17-G0-teT"/>
+                <outlet property="firstImage" destination="CJa-83-XdH" id="8e8-ww-7JJ"/>
+                <outlet property="fourImage" destination="6VN-LD-9SL" id="arc-1s-xW2"/>
+                <outlet property="progressLabel" destination="R3V-ON-3fd" id="lqs-eX-pbR"/>
+                <outlet property="secondImage" destination="BJM-DG-RGT" id="TNI-Lq-KdG"/>
+                <outlet property="thirdImage" destination="GdD-FJ-66G" id="V08-ez-wgf"/>
+                <outlet property="typeLabel" destination="JFd-GJ-3zG" id="MCI-mX-E0y"/>
+            </connections>
+            <point key="canvasLocation" x="137.68115942028987" y="119.86607142857142"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="check_success" width="16" height="16"/>
+    </resources>
+</document>

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/AboutUsViewController.h

@@ -0,0 +1,17 @@
+//
+//  AboutUsViewController.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/28.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AboutUsViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 43 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/AboutUsViewController.m

@@ -0,0 +1,43 @@
+//
+//  AboutUsViewController.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/28.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "AboutUsViewController.h"
+#import "AboutBodyView.h"
+
+@interface AboutUsViewController ()
+
+@property (nonatomic, strong) AboutBodyView *bodyView;
+
+@end
+
+@implementation AboutUsViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"关于我们"];
+    [self configUI];
+}
+
+- (void)configUI {
+    _bodyView = [AboutBodyView shareInstance];
+    _bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    [self.scrollView addSubview:_bodyView];
+}
+
+/*
+#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

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/FeedbackViewController.h

@@ -0,0 +1,17 @@
+//
+//  FeedbackViewController.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/25.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FeedbackViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 66 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/FeedbackViewController.m

@@ -0,0 +1,66 @@
+//
+//  FeedbackViewController.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/25.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "FeedbackViewController.h"
+#import "FeedbackBodyView.h"
+
+@interface FeedbackViewController ()
+
+@end
+
+@implementation FeedbackViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"意见反馈"];
+    [self configUI];
+}
+
+- (void)configUI {
+    FeedbackBodyView *bodyView = [FeedbackBodyView shareInstance];
+    CGFloat height = kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin > 530 ?  kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin : 530;
+    bodyView.frame = CGRectMake(0, 0, kScreenWidth, height);
+    KSWeakSelf(weakSelf);
+    [bodyView submitActionCallback:^(NSString *submitStr, NSString *contactStr) {
+        // 提交
+        [weakSelf submitWithPhone:contactStr suggestion:submitStr];
+    }];
+    [self.scrollView addSubview:bodyView];
+    [self.scrollView setContentSize:CGSizeMake(kScreenWidth, height)];
+}
+
+- (void)submitWithPhone:(NSString *)phone suggestion:(NSString *)suggession {
+    [self showhud];
+    [KSRequestManager suggestionAddRequest:KS_POST content:suggession mobileNo:phone success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            KSWeakSelf(weakSelf);
+            [self KSShowMsg:@"提交成功" promptCompletion:^{
+                [weakSelf.navigationController popViewControllerAnimated:YES];
+            }];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+/*
+ #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

+ 19 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneChangeController.h

@@ -0,0 +1,19 @@
+//
+//  ModifyPhoneChangeController.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ModifyPhoneChangeController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *prePhone;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 193 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneChangeController.m

@@ -0,0 +1,193 @@
+//
+//  ModifyPhoneChangeController.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "ModifyPhoneChangeController.h"
+#import "PhoneChangeBodyView.h"
+#import "VeriCheckView.h"
+#import "LoginViewController.h"
+#import "AppDelegate.h"
+#import "CustomNavViewController.h"
+#import "JPUSHService.h"
+#import "RCConnectionManager.h"
+
+@interface ModifyPhoneChangeController ()
+{
+    NSTimer *_time;
+    int _count;
+}
+@property (nonatomic, strong) PhoneChangeBodyView *bodyView;
+
+@end
+
+@implementation ModifyPhoneChangeController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"修改手机号"];
+    [self configUI];
+}
+
+- (void)configUI {
+    self.bodyView = [PhoneChangeBodyView shareInstance];
+    self.bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    MJWeakSelf;
+    [self.bodyView changePhoneCallback:^(CHANGEACTION action, NSDictionary * _Nonnull parm) {
+        [weakSelf operationWithAction:action parm:parm];
+    }];
+    [self.scrollView addSubview:_bodyView];
+}
+
+- (void)operationWithAction:(CHANGEACTION)action parm:(NSDictionary *)parm {
+    if (action == CHANGEACTION_CODE) {
+        // 图形化验证
+        [self veriCheckWithParm:parm];
+    }
+    else if (action == CHANGEACTION_SURE) {
+        [self modifyPhoneWithParm:parm];
+    }
+}
+
+#pragma mark --- 修改手机号
+- (void)modifyPhoneWithParm:(NSDictionary *)parm {
+    [self showhud];
+    [KSRequestManager updatePhoneRequest:KS_POST oldPhone:self.prePhone authCode:[parm stringValueForKey:@"code"] newPhone:[parm stringValueForKey:@"phone"] success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            MJWeakSelf;
+            [self KSShowMsg:@"修改成功" promptCompletion:^{
+                UserDefaultSet([parm stringValueForKey:@"phone"], PHONEKEY);
+                [[NSUserDefaults standardUserDefaults] synchronize];
+                [weakSelf successChangeBack];
+            }];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+        
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+    
+}
+
+- (void)successChangeBack {
+    [RCConnectionManager shareManager].isNeedJoin = NO;
+    [RCConnectionManager shareManager].isNeedShowMessage = NO;
+    [[RCIM sharedRCIM] logout];
+    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
+    // 取消推送别名
+    [JPUSHService deleteAlias:nil seq:0];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:TokenKey];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:Token_type];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:RefreshToken];
+    UserDefaultRemoveObjectForKey(RongTokenKey);
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    [KSRequestManager clearRequestHeader];
+    LoginViewController *loginVC = [[LoginViewController alloc] init];
+    CustomNavViewController *navCtrl = [[CustomNavViewController alloc] initWithRootViewController:loginVC];
+    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    appDelegate.window.rootViewController = navCtrl;
+}
+
+
+#pragma mark --- 验证码
+- (void)veriCheckWithParm:(NSDictionary *)parm {
+    NSString *phoneNo = [parm stringValueForKey:@"phone"];
+    // 图形化验证
+    VeriCheckView *view = [VeriCheckView shareInstance];
+    __weak typeof(view) weakView = view;
+    [view showViewCallback:^(NSDictionary * _Nonnull parm) {
+        [self veriImageCodeWithParm:parm checkView:weakView];
+    }];
+    [view disPlayImageWithPhone:phoneNo];
+}
+
+- (void)veriImageCodeWithParm:(NSDictionary *)parm checkView:(VeriCheckView *)checkView {
+    [self showhud];
+    [KSRequestManager verifyLoginImageRequest:KS_POST phone:[parm stringValueForKey:@"phone"] code:[parm stringValueForKey:@"code"] success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [checkView hiddView];
+            [self sendSMSRequestWithParm:parm];
+        }
+        else {
+            [self removehub];
+            [self MBShowInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+// 发送短信
+- (void)sendSMSRequestWithParm:(NSDictionary *)parm {
+    [KSRequestManager sendSmsRequest:KS_POST mobile:[parm stringValueForKey:@"phone"] success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [self MBPShow:@"验证码已发送"];
+            [self codeButtonCountDown];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)codeButtonCountDown {
+    _bodyView.codeButton.userInteractionEnabled = NO;
+    [_bodyView.codeButton setTitleColor:HexRGB(0xe5e5e5) forState:UIControlStateNormal];
+    _bodyView.codeButton.layer.borderColor = HexRGB(0xe5e5e5).CGColor;
+    __weak typeof(self) weakSelf = self;
+    _time = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(buttonChangeAction) userInfo:nil repeats:YES];
+    [[NSRunLoop mainRunLoop] addTimer:_time forMode:NSRunLoopCommonModes];
+
+    _count = 89;
+}
+
+- (void)clearButtonState {
+    [_time invalidate];
+    _time = nil;
+    _count = 0;
+    [_bodyView.codeButton setTitle:@"发送验证码" forState:UIControlStateNormal];
+    [_bodyView.codeButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
+    _bodyView.codeButton.layer.borderColor = THEMECOLOR.CGColor;
+    _bodyView.codeButton.userInteractionEnabled = YES;
+}
+
+#pragma mark  ---- 验证码按钮状态
+- (void)buttonChangeAction {
+    _bodyView.codeButton.userInteractionEnabled = NO;
+    NSString *title = [NSString stringWithFormat:@"%ds",_count];
+    [_bodyView.codeButton setTitle:title forState:UIControlStateNormal];
+    _count--;
+    if(_count == -1){
+        [_time invalidate];
+        _time = nil;
+        [_bodyView.codeButton setTitle:@"发送验证码" forState:UIControlStateNormal];
+        [_bodyView.codeButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
+        _bodyView.codeButton.layer.borderColor = THEMECOLOR.CGColor;
+        _bodyView.codeButton.userInteractionEnabled = YES;    }
+}
+
+- (void)dealloc {
+    [_time invalidate];
+    _time = nil;
+}
+/*
+#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

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneCheckController.h

@@ -0,0 +1,17 @@
+//
+//  ModifyPhoneCheckController.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ModifyPhoneCheckController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 71 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/ModifyPhoneCheckController.m

@@ -0,0 +1,71 @@
+//
+//  ModifyPhoneCheckController.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "ModifyPhoneCheckController.h"
+#import "PhoneCheckBodyView.h"
+#import "ModifyPhoneChangeController.h"
+#import "UserInfoManager.h"
+
+@interface ModifyPhoneCheckController ()
+
+@property (nonatomic, strong) PhoneCheckBodyView *bodyView;
+
+@end
+
+@implementation ModifyPhoneCheckController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"修改手机号"];
+    [self configUI];
+}
+
+- (void)configUI {
+    self.bodyView = [PhoneCheckBodyView shareInstance];
+    _bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    _bodyView.phoneField.userInteractionEnabled = NO;
+    _bodyView.phoneField.text = USER_MANAGER.userInfo.phone;
+    MJWeakSelf;
+    [_bodyView sureCallback:^(NSString * _Nonnull phoneNo, NSString * _Nonnull pwdStr) {
+        [weakSelf checkWithPhone:phoneNo password:pwdStr];
+    }];
+    [self.scrollView addSubview:_bodyView];
+}
+
+- (void)checkWithPhone:(NSString *)phoneNo password:(NSString *)password {
+    [self showhud];
+    [KSRequestManager checkUserRequest:KS_GET phone:phoneNo password:password success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [self nextChangeViewWithWithPhone:phoneNo];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)nextChangeViewWithWithPhone:(NSString *)phone {
+    ModifyPhoneChangeController *changeCtrl = [[ModifyPhoneChangeController alloc] init];
+    changeCtrl.prePhone = phone;
+    [self.navigationController pushViewController:changeCtrl animated:YES];
+}
+/*
+#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

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/SettingViewController.h

@@ -0,0 +1,17 @@
+//
+//  SettingViewController.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SettingViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 126 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/Controller/SettingViewController.m

@@ -0,0 +1,126 @@
+//
+//  SettingViewController.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "SettingViewController.h"
+#import "SettingBodyView.h"
+#import "LoginViewController.h"
+#import "AppDelegate.h"
+#import "CustomNavViewController.h"
+#import "FeedbackViewController.h"
+#import "AboutUsViewController.h"
+#import "ModifyViewController.h"
+#import "JPUSHService.h"
+#import "KSBaseWKWebViewController.h"
+#import "RCConnectionManager.h"
+#import "ModifyPhoneCheckController.h"
+
+@interface SettingViewController ()
+
+@end
+
+@implementation SettingViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"设置"];
+    [self configUI];
+}
+
+- (void)configUI {
+    SettingBodyView *bodyView = [SettingBodyView shareInstance];
+    bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    KSWeakSelf(weakSelf);
+    [bodyView settingCallback:^(SETTINGTYPE type) {
+        [weakSelf operationWithType:type];
+    }];
+    [self.scrollView addSubview:bodyView];
+}
+
+- (void)operationWithType:(SETTINGTYPE)type {
+    
+    switch (type) {
+        case SETTINGTYPE_LOUOUT:   // 退出登录
+        {
+            [self logoutAction];
+        }
+            break;
+        case SETTINGTYPE_PHONE:    // 修改手机号
+        {
+            ModifyPhoneCheckController *checkCtrl = [[ModifyPhoneCheckController alloc] init];
+            [self.navigationController pushViewController:checkCtrl animated:YES];
+        }
+            break;
+        case SETTINGTYPE_POLICY:
+        {
+            KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+            ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/privacy"];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
+        case SETTINGTYPE_MODIFY:   // 修改密码
+        {
+            ModifyViewController *modifyVC = [[ModifyViewController alloc] init];
+            modifyVC.isForget = NO;
+            [self.navigationController pushViewController:modifyVC animated:YES];
+        }
+            break;
+        case SETTINGTYPE_FEEDBACK:  // 反馈
+        {
+            FeedbackViewController *feedbackVC = [[FeedbackViewController alloc] init];
+            [self.navigationController pushViewController:feedbackVC animated:YES];
+        }
+            break;
+        case SETTINGTYPE_ABOUT:     // 关于我们
+        {
+            AboutUsViewController *aboutUs = [[AboutUsViewController alloc] init];
+            [self.navigationController pushViewController:aboutUs animated:YES];
+        }
+            break;
+        default:
+            break;
+    }
+    
+}
+
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+}
+
+
+- (void)logoutAction {
+    [RCConnectionManager shareManager].isNeedJoin = NO;
+    [RCConnectionManager shareManager].isNeedShowMessage = NO;
+    [[RCIM sharedRCIM] logout];
+    // 取消推送别名
+    [JPUSHService deleteAlias:nil seq:0];
+    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:TokenKey];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:Token_type];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:RefreshToken];
+    UserDefaultRemoveObjectForKey(RongTokenKey);
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    [KSRequestManager clearRequestHeader];
+    LoginViewController *loginVC = [[LoginViewController alloc] init];
+    CustomNavViewController *navCtrl = [[CustomNavViewController alloc] initWithRootViewController:loginVC];
+    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    appDelegate.window.rootViewController = navCtrl;
+}
+
+/*
+#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

+ 20 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.h

@@ -0,0 +1,20 @@
+//
+//  AboutBodyView.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/28.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AboutBodyView : UIView
+
++ (instancetype)shareInstance;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 44 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.m

@@ -0,0 +1,44 @@
+//
+//  AboutBodyView.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/28.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "AboutBodyView.h"
+
+@interface AboutBodyView ()
+
+@property (weak, nonatomic) IBOutlet UILabel *versonLabel;
+@property (weak, nonatomic) IBOutlet UILabel *phoneLabel;
+@property (weak, nonatomic) IBOutlet UILabel *emailLabel;
+
+@end
+
+
+@implementation AboutBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.versonLabel.text = [NSString stringWithFormat:@"版本号%@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]];
+    
+    _phoneLabel.text = @"027-87718176";
+    _emailLabel.text = @"super_orchestra@163.com";
+    
+}
+
++ (instancetype)shareInstance {
+    AboutBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"AboutBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 129 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/AboutBodyView.xib

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="AboutBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="aboutUs" translatesAutoresizingMaskIntoConstraints="NO" id="Klc-iV-fkK">
+                    <rect key="frame" x="132.5" y="48" width="149" height="50"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="50" id="nJY-MB-ijc"/>
+                        <constraint firstAttribute="width" constant="149" id="oM4-te-4gD"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本号1.1.1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HIz-3v-aSh">
+                    <rect key="frame" x="172.5" y="128" width="69" height="17"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9l1-Oz-TuA">
+                    <rect key="frame" x="0.0" y="165" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="客服反馈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Tk-mE-3Zz">
+                            <rect key="frame" x="16" y="15" width="66" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="027-87718176" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IMX-3Q-nIu">
+                            <rect key="frame" x="289" y="15" width="109" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fUR-A8-NA3">
+                            <rect key="frame" x="0.0" y="49" width="414" height="1"/>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="1" id="ZYJ-gY-in0"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="6Tk-mE-3Zz" firstAttribute="centerY" secondItem="9l1-Oz-TuA" secondAttribute="centerY" id="65F-qL-iQg"/>
+                        <constraint firstItem="6Tk-mE-3Zz" firstAttribute="leading" secondItem="9l1-Oz-TuA" secondAttribute="leading" constant="16" id="J4w-mh-50e"/>
+                        <constraint firstItem="IMX-3Q-nIu" firstAttribute="centerY" secondItem="9l1-Oz-TuA" secondAttribute="centerY" id="XEM-jp-OnO"/>
+                        <constraint firstAttribute="height" constant="50" id="eQe-dB-oHt"/>
+                        <constraint firstAttribute="bottom" secondItem="fUR-A8-NA3" secondAttribute="bottom" id="fca-f2-jZh"/>
+                        <constraint firstItem="fUR-A8-NA3" firstAttribute="leading" secondItem="9l1-Oz-TuA" secondAttribute="leading" id="ffd-nY-sLv"/>
+                        <constraint firstAttribute="trailing" secondItem="IMX-3Q-nIu" secondAttribute="trailing" constant="16" id="h4l-YL-m5F"/>
+                        <constraint firstAttribute="trailing" secondItem="fUR-A8-NA3" secondAttribute="trailing" id="rRX-GY-udx"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YJ1-PU-6TT">
+                    <rect key="frame" x="0.0" y="215" width="414" height="50"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="E-MAIL" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kfb-Ud-UYp">
+                            <rect key="frame" x="16" y="15" width="55" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="dyme2002@dayaedu.com" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="x31-ch-1Va">
+                            <rect key="frame" x="203" y="15" width="195" height="20"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3uU-Qr-qvD">
+                            <rect key="frame" x="0.0" y="49" width="414" height="1"/>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="1" id="tTd-Sz-aOF"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="50" id="6Gj-aF-dCk"/>
+                        <constraint firstAttribute="trailing" secondItem="3uU-Qr-qvD" secondAttribute="trailing" id="BcM-kM-dEp"/>
+                        <constraint firstItem="3uU-Qr-qvD" firstAttribute="leading" secondItem="YJ1-PU-6TT" secondAttribute="leading" id="Kd2-Qd-VKp"/>
+                        <constraint firstItem="x31-ch-1Va" firstAttribute="centerY" secondItem="YJ1-PU-6TT" secondAttribute="centerY" id="Zxc-tr-LYe"/>
+                        <constraint firstAttribute="bottom" secondItem="3uU-Qr-qvD" secondAttribute="bottom" id="f9C-NW-7Vq"/>
+                        <constraint firstAttribute="trailing" secondItem="x31-ch-1Va" secondAttribute="trailing" constant="16" id="fiR-k5-dLC"/>
+                        <constraint firstItem="kfb-Ud-UYp" firstAttribute="centerY" secondItem="YJ1-PU-6TT" secondAttribute="centerY" id="xoW-Rc-Ob0"/>
+                        <constraint firstItem="kfb-Ud-UYp" firstAttribute="leading" secondItem="YJ1-PU-6TT" secondAttribute="leading" constant="16" id="ytV-Ir-Hfz"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.95294117647058818" green="0.95686274509803915" blue="0.97254901960784312" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="HIz-3v-aSh" firstAttribute="top" secondItem="Klc-iV-fkK" secondAttribute="bottom" constant="30" id="0HU-qz-rHk"/>
+                <constraint firstItem="HIz-3v-aSh" firstAttribute="centerX" secondItem="Klc-iV-fkK" secondAttribute="centerX" id="9Iu-fj-WL7"/>
+                <constraint firstAttribute="trailing" secondItem="9l1-Oz-TuA" secondAttribute="trailing" id="Cxk-2O-z0j"/>
+                <constraint firstAttribute="trailing" secondItem="YJ1-PU-6TT" secondAttribute="trailing" id="DOb-Rb-hkr"/>
+                <constraint firstItem="9l1-Oz-TuA" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="ZQ2-fa-6d8"/>
+                <constraint firstItem="9l1-Oz-TuA" firstAttribute="top" secondItem="HIz-3v-aSh" secondAttribute="bottom" constant="20" id="a4R-UO-3MI"/>
+                <constraint firstItem="YJ1-PU-6TT" firstAttribute="top" secondItem="9l1-Oz-TuA" secondAttribute="bottom" id="bI1-Yk-HEH"/>
+                <constraint firstItem="Klc-iV-fkK" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="48" id="ep4-8m-O6X"/>
+                <constraint firstItem="YJ1-PU-6TT" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="ryf-ox-i90"/>
+                <constraint firstItem="Klc-iV-fkK" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="usK-5x-PQ3"/>
+            </constraints>
+            <connections>
+                <outlet property="emailLabel" destination="x31-ch-1Va" id="MGg-Lc-k4X"/>
+                <outlet property="phoneLabel" destination="IMX-3Q-nIu" id="axV-mv-bVY"/>
+                <outlet property="versonLabel" destination="HIz-3v-aSh" id="XxR-UN-c5X"/>
+            </connections>
+            <point key="canvasLocation" x="50.724637681159422" y="35.491071428571423"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="aboutUs" width="149" height="50"/>
+    </resources>
+</document>

+ 23 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.h

@@ -0,0 +1,23 @@
+//
+//  FeedbackBodyView.h
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/25.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^SubmitAction)(NSString * _Nonnull submitStr, NSString * _Nonnull contactStr);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FeedbackBodyView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)submitActionCallback:(SubmitAction)action;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 123 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.m

@@ -0,0 +1,123 @@
+//
+//  FeedbackBodyView.m
+//  StudentDaya
+//
+//  Created by Kyle on 2019/8/25.
+//  Copyright © 2019 DayaMusic. All rights reserved.
+//
+
+#import "FeedbackBodyView.h"
+
+@interface FeedbackBodyView ()<UITextFieldDelegate, UITextViewDelegate>
+
+@property (weak, nonatomic) IBOutlet UITextView *inputText;
+
+@property (weak, nonatomic) IBOutlet UILabel *tipsLabel;
+
+@property (weak, nonatomic) IBOutlet UITextField *contactField;
+@property (weak, nonatomic) IBOutlet UILabel *wxContact;
+@property (weak, nonatomic) IBOutlet UILabel *emailContact;
+
+@property (nonatomic, copy) SubmitAction action;
+
+@end
+
+@implementation FeedbackBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.inputText.delegate = self;
+    self.contactField.delegate = self;
+    self.contactField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"  您的邮箱或手机号" attributes:@{NSForegroundColorAttributeName:HexRGB(0x777777), NSFontAttributeName:[UIFont systemFontOfSize:14.0f weight:UIFontWeightMedium]}];
+    
+    _wxContact.text = @"微信公众号:酷乐秀App";
+    _emailContact.text = @"邮箱:super_orchestra@163.com";
+    
+}
+
++ (instancetype)shareInstance {
+    FeedbackBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"FeedbackBodyView" owner:nil options:nil] firstObject];
+    return view;
+    
+}
+
+- (void)submitActionCallback:(SubmitAction)action {
+    if (action) {
+        self.action = action;
+    }
+}
+
+- (IBAction)submitAction:(id)sender {
+    [self endEditing:YES];
+    if (self.action) {
+        if ([NSString isEmptyString:self.inputText.text]) {
+            [self MBPShow:@"请输入反馈意见"];
+            return;
+        }
+        if ([NSString isEmptyString:self.contactField.text]) {
+            [self MBPShow:@"请输入您的联系方式"];
+            return;
+        }
+        self.action(self.inputText.text, self.contactField.text);
+        
+    }
+}
+
+#pragma mark   ---- delegate
+
+- (void)textViewDidBeginEditing:(UITextView *)textView {
+    self.tipsLabel.hidden = YES;
+}
+- (void)textViewDidEndEditing:(UITextView *)textView {
+    if ([NSString isEmptyString:textView.text]) {
+        self.tipsLabel.hidden = NO;
+    }
+}
+
+- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
+//    if ([text isEqualToString:@"\n"]) {
+//        [self endEditing:YES];
+//        return YES;
+//    }
+    if ([text isEqualToString:@""]) {
+        return YES;
+    }
+//    if ([NSString isContainsTwoEmoji:text]) {
+//        return NO;
+//    }
+    return YES;
+}
+
+
+- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
+    [self endEditing:YES];
+    return YES;
+}
+
+- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
+    [self endEditing:YES];
+}
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    if ([string isEqualToString:@""]) {
+        return YES;
+    }
+//    if ([NSString isContainsTwoEmoji:string]) {
+//        return NO;
+//    }
+    return YES;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 154 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/FeedbackBodyView.xib

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="FeedbackBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CFx-Ai-E7T">
+                    <rect key="frame" x="16" y="25" width="382" height="240"/>
+                    <subviews>
+                        <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="p8m-Qr-UiJ">
+                            <rect key="frame" x="10" y="0.0" width="362" height="240"/>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <color key="textColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="calibratedRGB"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+                        </textView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入您的意见反馈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tu9-z8-FwU">
+                            <rect key="frame" x="10" y="9" width="129" height="17"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="240" id="8q5-qU-3cO"/>
+                        <constraint firstAttribute="trailing" secondItem="p8m-Qr-UiJ" secondAttribute="trailing" constant="10" id="AdT-WT-bn5"/>
+                        <constraint firstItem="p8m-Qr-UiJ" firstAttribute="top" secondItem="CFx-Ai-E7T" secondAttribute="top" id="LaC-pZ-86I"/>
+                        <constraint firstItem="p8m-Qr-UiJ" firstAttribute="leading" secondItem="CFx-Ai-E7T" secondAttribute="leading" constant="10" id="M8A-z4-wJh"/>
+                        <constraint firstItem="tu9-z8-FwU" firstAttribute="leading" secondItem="CFx-Ai-E7T" secondAttribute="leading" constant="10" id="Wm9-7e-b2D"/>
+                        <constraint firstItem="tu9-z8-FwU" firstAttribute="top" secondItem="CFx-Ai-E7T" secondAttribute="top" constant="9" id="YKr-f0-CZP"/>
+                        <constraint firstAttribute="bottom" secondItem="p8m-Qr-UiJ" secondAttribute="bottom" id="wTS-7z-ngk"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                            <color key="value" red="0.90196078430000004" green="0.8980392157" blue="0.8980392157" alpha="1" colorSpace="calibratedRGB"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="或通过以下方式联系我们:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="68d-au-GiC">
+                    <rect key="frame" x="16" y="334" width="161.5" height="17"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微信公众号:酷乐秀App" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RQx-jz-yxS">
+                    <rect key="frame" x="16" y="356" width="155.5" height="17"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="邮箱:super_orchestra@163.com" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lsw-Mu-XKa">
+                    <rect key="frame" x="16" y="378" width="218.5" height="17"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ct3-4Y-vZj">
+                    <rect key="frame" x="28" y="465" width="358" height="50"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="50" id="67L-cr-A5R"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <state key="normal" title="提交"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="25"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="submitAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="idu-YD-Y4S"/>
+                    </connections>
+                </button>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7rr-ck-MeZ">
+                    <rect key="frame" x="16" y="275" width="382" height="44"/>
+                    <subviews>
+                        <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="您的邮箱或手机号" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="XAw-28-RHh">
+                            <rect key="frame" x="10" y="0.0" width="362" height="44"/>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="44" id="Pnx-Wz-MTO"/>
+                            </constraints>
+                            <color key="textColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="calibratedRGB"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <textInputTraits key="textInputTraits"/>
+                        </textField>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                    <constraints>
+                        <constraint firstItem="XAw-28-RHh" firstAttribute="leading" secondItem="7rr-ck-MeZ" secondAttribute="leading" constant="10" id="1N6-HJ-A8t"/>
+                        <constraint firstAttribute="height" constant="44" id="4rr-ad-2ah"/>
+                        <constraint firstAttribute="bottom" secondItem="XAw-28-RHh" secondAttribute="bottom" id="QyL-aY-04k"/>
+                        <constraint firstItem="XAw-28-RHh" firstAttribute="top" secondItem="7rr-ck-MeZ" secondAttribute="top" id="bsM-hW-BQX"/>
+                        <constraint firstAttribute="trailing" secondItem="XAw-28-RHh" secondAttribute="trailing" constant="10" id="wO5-Yk-Yf3"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                            <color key="value" red="0.90196078431372551" green="0.89803921568627454" blue="0.89803921568627454" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="4"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.95294117647058818" green="0.95686274509803915" blue="0.97254901960784312" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="Lsw-Mu-XKa" firstAttribute="leading" secondItem="68d-au-GiC" secondAttribute="leading" id="2AG-z9-Zuw"/>
+                <constraint firstItem="CFx-Ai-E7T" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="25" id="2Ng-AQ-h5m"/>
+                <constraint firstItem="RQx-jz-yxS" firstAttribute="leading" secondItem="68d-au-GiC" secondAttribute="leading" id="7hE-fQ-Xlo"/>
+                <constraint firstItem="7rr-ck-MeZ" firstAttribute="trailing" secondItem="CFx-Ai-E7T" secondAttribute="trailing" id="Dtn-D9-SPL"/>
+                <constraint firstItem="68d-au-GiC" firstAttribute="leading" secondItem="7rr-ck-MeZ" secondAttribute="leading" id="F4L-is-rNc"/>
+                <constraint firstItem="Ct3-4Y-vZj" firstAttribute="top" secondItem="Lsw-Mu-XKa" secondAttribute="bottom" constant="70" id="FTt-e3-fm4"/>
+                <constraint firstItem="RQx-jz-yxS" firstAttribute="top" secondItem="68d-au-GiC" secondAttribute="bottom" constant="5" id="PEs-2l-MqT"/>
+                <constraint firstAttribute="trailing" secondItem="Ct3-4Y-vZj" secondAttribute="trailing" constant="28" id="PkV-JZ-hBK"/>
+                <constraint firstItem="7rr-ck-MeZ" firstAttribute="top" secondItem="CFx-Ai-E7T" secondAttribute="bottom" constant="10" id="RvZ-ie-Ar3"/>
+                <constraint firstAttribute="trailing" secondItem="CFx-Ai-E7T" secondAttribute="trailing" constant="16" id="ccA-8E-vrV"/>
+                <constraint firstItem="Ct3-4Y-vZj" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="fkx-pG-4NY"/>
+                <constraint firstItem="CFx-Ai-E7T" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="16" id="ha2-2w-9Jw"/>
+                <constraint firstItem="7rr-ck-MeZ" firstAttribute="leading" secondItem="CFx-Ai-E7T" secondAttribute="leading" id="o73-Jf-nQG"/>
+                <constraint firstItem="Lsw-Mu-XKa" firstAttribute="top" secondItem="RQx-jz-yxS" secondAttribute="bottom" constant="5" id="pjU-Pj-374"/>
+                <constraint firstItem="68d-au-GiC" firstAttribute="top" secondItem="7rr-ck-MeZ" secondAttribute="bottom" constant="15" id="sWL-MY-FOC"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contactField" destination="XAw-28-RHh" id="OuF-T2-JEo"/>
+                <outlet property="emailContact" destination="Lsw-Mu-XKa" id="Kob-36-JuJ"/>
+                <outlet property="inputText" destination="p8m-Qr-UiJ" id="lmH-vA-8di"/>
+                <outlet property="tipsLabel" destination="tu9-z8-FwU" id="Gm4-Ph-99u"/>
+                <outlet property="wxContact" destination="RQx-jz-yxS" id="pPX-oC-TCn"/>
+            </connections>
+            <point key="canvasLocation" x="137.68115942028987" y="118.52678571428571"/>
+        </view>
+    </objects>
+</document>

+ 30 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/PhoneChangeBodyView.h

@@ -0,0 +1,30 @@
+//
+//  PhoneChangeBodyView.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, CHANGEACTION) {
+    CHANGEACTION_CODE,   // 发送验证码
+    CHANGEACTION_SURE,   // 修改
+};
+
+typedef void(^ChangePhoneBlock)(CHANGEACTION action, NSDictionary * _Nonnull parm);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PhoneChangeBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UIButton *codeButton;
+
++ (instancetype)shareInstance;
+
+- (void)changePhoneCallback:(ChangePhoneBlock)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 103 - 0
MusicGradeExam/MusicGradeExam/UI/UserCenter/Setting/View/PhoneChangeBodyView.m

@@ -0,0 +1,103 @@
+//
+//  PhoneChangeBodyView.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2020/3/9.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "PhoneChangeBodyView.h"
+
+@interface PhoneChangeBodyView ()<UITextFieldDelegate>
+
+@property (weak, nonatomic) IBOutlet UITextField *phoneField;
+
+@property (weak, nonatomic) IBOutlet UITextField *codeField;
+
+@property (nonatomic, copy) ChangePhoneBlock callback;
+
+@end
+
+@implementation PhoneChangeBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.phoneField.delegate = self;
+    self.codeField.delegate = self;
+}
+
++ (instancetype)shareInstance {
+    PhoneChangeBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"PhoneChangeBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)changePhoneCallback:(ChangePhoneBlock)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sendCode:(id)sender {
+    [self endEditing:YES];
+    if ([NSString isEmptyString:self.phoneField.text]) {
+        // 请输入手机号
+        [self MBPShow:@"请输入手机号"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(CHANGEACTION_CODE, @{@"phone" : self.phoneField.text});
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    [self endEditing:YES];
+    if ([NSString isEmptyString:self.phoneField.text]) {
+           // 请输入手机号
+           [self MBPShow:@"请输入手机号"];
+           return;
+       }
+    if ([NSString isEmptyString:self.codeField.text]) {
+        [self MBPShow:@"请输入短信验证码"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(CHANGEACTION_SURE, @{@"phone" : self.phoneField.text,
+                                           @"code" : self.codeField.text,
+                                           });
+    }
+}
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    if ([string isEqualToString:@""]) {
+        return YES;
+    }
+
+    // 输入控制
+    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
+    if (textField == self.phoneField) {
+        if (newString.length > 11) {
+            return NO;
+        }
+    }
+
+    else if (textField == self.codeField) {
+        if (newString.length > 6) {
+            return NO;
+        }
+    }
+    return YES;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است