ソースを参照

网络请求缓存

nanxinlin 6 年 前
コミット
aabc93b917
共有43 個のファイルを変更した2404 個の追加117 個の削除を含む
  1. 2 0
      RainbowPlanet/Podfile
  2. 11 1
      RainbowPlanet/Podfile.lock
  3. 307 39
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  4. 17 0
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+ShanYan.swift
  5. 16 7
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+UM.swift
  6. 6 4
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate.swift
  7. 4 0
      RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift
  8. 3 0
      RainbowPlanet/RainbowPlanet/Define/RainbowPlanet-Bridging-Header.h
  9. 8 4
      RainbowPlanet/RainbowPlanet/Define/ThirdPartyMacro.swift
  10. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/CL_ShanYanSDK
  11. 12 2
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/Headers/CLUIConfigure.h
  12. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/EAccountApiSDK
  13. 47 17
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/Headers/EAccountSDK.h
  14. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/Info.plist
  15. 2 1
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/Headers/OAuthManager.h
  16. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/OAuth
  17. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeDirectory
  18. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeRequirements-1
  19. 3 3
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeResources
  20. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeSignature
  21. 2 1
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/Headers/UniAuthHelper.h
  22. 147 0
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/Headers/UniCustomModel.h
  23. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeDirectory
  24. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeRequirements-1
  25. 18 3
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeResources
  26. BIN
      RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/account_login_sdk_core
  27. 1 0
      RainbowPlanet/RainbowPlanet/Manager/BaiduMapManager/BaiduMapManager.swift
  28. 143 0
      RainbowPlanet/RainbowPlanet/Manager/ShanYanManager/ShanYanManager.swift
  29. 35 31
      RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift
  30. 23 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/Dog.swift
  31. 37 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.swift
  32. 35 4
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.xib
  33. 58 0
      RainbowPlanet/RainbowPlanet/Service/RootModel/RootInfoModel.swift
  34. 66 0
      RainbowPlanet/RainbowPlanet/Service/RootModel/RootModel.swift
  35. 31 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/ApiMacro.swift
  36. 48 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkCacheModel.swift
  37. 266 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager.swift
  38. 27 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkService.swift
  39. 76 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceAPI.swift
  40. 158 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Info.plist
  41. 26 0
      RainbowPlanet/RainbowPlanet/Tools/RealmUtility/ExtensionMethod.swift
  42. 417 0
      RainbowPlanet/RainbowPlanet/Tools/RealmUtility/RealmUtility.swift
  43. 352 0
      RainbowPlanet/RainbowPlanet/Tools/RealmUtility/Rx_RealmUtillit.swift

+ 2 - 0
RainbowPlanet/Podfile

@@ -16,6 +16,8 @@ target 'RainbowPlanet' do
   # json解析
   pod 'SwiftyJSON'
   pod 'ObjectMapper'
+  # 数据存储
+  pod 'RealmSwift'
   # 图片加载
   pod 'Kingfisher'
   # 自动布局

+ 11 - 1
RainbowPlanet/Podfile.lock

@@ -17,6 +17,11 @@ PODS:
     - Moya/Core
     - RxSwift (~> 4.0)
   - ObjectMapper (3.4.2)
+  - Realm (3.13.1):
+    - Realm/Headers (= 3.13.1)
+  - Realm/Headers (3.13.1)
+  - RealmSwift (3.13.1):
+    - Realm (= 3.13.1)
   - Result (4.1.0)
   - RxAtomic (4.4.1)
   - RxCocoa (4.4.1):
@@ -59,6 +64,7 @@ DEPENDENCIES:
   - MLeaksFinder
   - Moya/RxSwift
   - ObjectMapper
+  - RealmSwift
   - RxCocoa
   - RxSwift
   - SnapKit
@@ -87,6 +93,8 @@ SPEC REPOS:
     - MLeaksFinder
     - Moya
     - ObjectMapper
+    - Realm
+    - RealmSwift
     - Result
     - RxAtomic
     - RxCocoa
@@ -113,6 +121,8 @@ SPEC CHECKSUMS:
   MLeaksFinder: 8c435bd2f6d070af18cff082b503b21adc130fc0
   Moya: cf730b3cd9e005401ef37a85143aa141a12fd38f
   ObjectMapper: 0d4402610f4e468903ae64629eec4784531e5c51
+  Realm: 50071da38fe079e0735e47c9f2eae738c68c5996
+  RealmSwift: 8a1e6a02b7a08cd17a31e3115143fb69fe5f3fb9
   Result: bd966fac789cc6c1563440b348ab2598cc24d5c7
   RxAtomic: f8d6adc1ccb87a767811269e4875887bc74dbf19
   RxCocoa: 2f35a76bf8887872e28a1914112395b11b8e0e64
@@ -126,6 +136,6 @@ SPEC CHECKSUMS:
   UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
   UMCShare: 552b29753f1b4da87b51d96545ed19e6263df397
 
-PODFILE CHECKSUM: e7321cadf8196787a3e146da6af158e6e14701ef
+PODFILE CHECKSUM: 20a783d7be0dea6d41d9b43290b02df1af373ad5
 
 COCOAPODS: 1.5.3

+ 307 - 39
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -57,15 +57,6 @@
 		A72A72D422321E2700B21995 /* EnumMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72CC22321E2600B21995 /* EnumMacro.swift */; };
 		A72A72D522321E2700B21995 /* ColorMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72CD22321E2600B21995 /* ColorMacro.swift */; };
 		A72A72D622321E2700B21995 /* ThirdPartyMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72CE22321E2700B21995 /* ThirdPartyMacro.swift */; };
-		A72A72E422321E5200B21995 /* TYRZResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A72D822321E5200B21995 /* TYRZResource.bundle */; };
-		A72A72E522321E5200B21995 /* account_login_sdk_core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72D922321E5200B21995 /* account_login_sdk_core.framework */; };
-		A72A72E622321E5200B21995 /* TYRZSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72DA22321E5200B21995 /* TYRZSDK.framework */; };
-		A72A72E722321E5200B21995 /* account_verify_sdk_core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72DB22321E5200B21995 /* account_verify_sdk_core.framework */; };
-		A72A72E822321E5200B21995 /* CL_ShanYanSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72DC22321E5200B21995 /* CL_ShanYanSDK.framework */; };
-		A72A72E922321E5200B21995 /* uni_account_login_sdk_res.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A72DD22321E5200B21995 /* uni_account_login_sdk_res.bundle */; };
-		A72A72EA22321E5200B21995 /* HTMLResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A72DE22321E5200B21995 /* HTMLResource.bundle */; };
-		A72A72EB22321E5200B21995 /* OAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72DF22321E5200B21995 /* OAuth.framework */; };
-		A72A72EC22321E5200B21995 /* EAccountApiSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72E022321E5200B21995 /* EAccountApiSDK.framework */; };
 		A72A72ED22321E5200B21995 /* AlipaySDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A72E222321E5200B21995 /* AlipaySDK.bundle */; };
 		A72A72EE22321E5200B21995 /* AlipaySDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72E322321E5200B21995 /* AlipaySDK.framework */; };
 		A72A72F022321E8800B21995 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A72EF22321E8800B21995 /* CoreMotion.framework */; };
@@ -91,6 +82,29 @@
 		A72A73402232772900B21995 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = A72A733D2232772900B21995 /* README.txt */; };
 		A72A73412232772900B21995 /* libWeChatSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A733F2232772900B21995 /* libWeChatSDK.a */; };
 		A72A734322327DE300B21995 /* WeChatpayOrderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A734222327DE300B21995 /* WeChatpayOrderModel.swift */; };
+		A72A7346223350ED00B21995 /* ShanYanManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A7345223350ED00B21995 /* ShanYanManager.swift */; };
+		A72A73502233541100B21995 /* EAccountApiSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A73472233540F00B21995 /* EAccountApiSDK.framework */; };
+		A72A73512233541100B21995 /* TYRZSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A73482233540F00B21995 /* TYRZSDK.framework */; };
+		A72A73522233541100B21995 /* uni_account_login_sdk_res.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A73492233540F00B21995 /* uni_account_login_sdk_res.bundle */; };
+		A72A73532233541100B21995 /* TYRZResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A734A2233540F00B21995 /* TYRZResource.bundle */; };
+		A72A73542233541100B21995 /* account_verify_sdk_core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A734B2233541000B21995 /* account_verify_sdk_core.framework */; };
+		A72A73552233541100B21995 /* OAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A734C2233541000B21995 /* OAuth.framework */; };
+		A72A73562233541100B21995 /* HTMLResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A72A734D2233541000B21995 /* HTMLResource.bundle */; };
+		A72A73572233541100B21995 /* account_login_sdk_core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A734E2233541100B21995 /* account_login_sdk_core.framework */; };
+		A72A73582233541100B21995 /* CL_ShanYanSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A734F2233541100B21995 /* CL_ShanYanSDK.framework */; };
+		A72A735A2233577000B21995 /* libc++.1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A72A73592233577000B21995 /* libc++.1.tbd */; };
+		A72A735C2233635B00B21995 /* AppDelegate+ShanYan.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A735B2233635B00B21995 /* AppDelegate+ShanYan.swift */; };
+		A72A737E2233966800B21995 /* RootInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A73742233966800B21995 /* RootInfoModel.swift */; };
+		A72A737F2233966800B21995 /* RootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A73752233966800B21995 /* RootModel.swift */; };
+		A72A7385223396CB00B21995 /* SwiftMoyaNetWorkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A7381223396CB00B21995 /* SwiftMoyaNetWorkService.swift */; };
+		A72A7386223396CB00B21995 /* SwiftMoyaNetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A7382223396CB00B21995 /* SwiftMoyaNetWorkManager.swift */; };
+		A72A7387223396CB00B21995 /* SwiftMoyaServiceAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A7383223396CB00B21995 /* SwiftMoyaServiceAPI.swift */; };
+		A72A7388223396CB00B21995 /* ApiMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A7384223396CB00B21995 /* ApiMacro.swift */; };
+		A72A738D2233B2DE00B21995 /* ExtensionMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A738A2233B2DE00B21995 /* ExtensionMethod.swift */; };
+		A72A738E2233B2DE00B21995 /* Rx_RealmUtillit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A738B2233B2DE00B21995 /* Rx_RealmUtillit.swift */; };
+		A72A738F2233B2DE00B21995 /* RealmUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A738C2233B2DE00B21995 /* RealmUtility.swift */; };
+		A72A73912233B55400B21995 /* Dog.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A73902233B55400B21995 /* Dog.swift */; };
+		A72A73932233BFCD00B21995 /* SwiftMoyaNetWorkCacheModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A73922233BFCD00B21995 /* SwiftMoyaNetWorkCacheModel.swift */; };
 		A77F2C612231FB49001BD3F6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C602231FB49001BD3F6 /* AppDelegate.swift */; };
 		A77F2C682231FB4A001BD3F6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A77F2C672231FB4A001BD3F6 /* Assets.xcassets */; };
 		A77F2C762231FB4A001BD3F6 /* RainbowPlanetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C752231FB4A001BD3F6 /* RainbowPlanetTests.swift */; };
@@ -186,15 +200,6 @@
 		A72A72CC22321E2600B21995 /* EnumMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumMacro.swift; sourceTree = "<group>"; };
 		A72A72CD22321E2600B21995 /* ColorMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorMacro.swift; sourceTree = "<group>"; };
 		A72A72CE22321E2700B21995 /* ThirdPartyMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThirdPartyMacro.swift; sourceTree = "<group>"; };
-		A72A72D822321E5200B21995 /* TYRZResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = TYRZResource.bundle; sourceTree = "<group>"; };
-		A72A72D922321E5200B21995 /* account_login_sdk_core.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = account_login_sdk_core.framework; sourceTree = "<group>"; };
-		A72A72DA22321E5200B21995 /* TYRZSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TYRZSDK.framework; sourceTree = "<group>"; };
-		A72A72DB22321E5200B21995 /* account_verify_sdk_core.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = account_verify_sdk_core.framework; sourceTree = "<group>"; };
-		A72A72DC22321E5200B21995 /* CL_ShanYanSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CL_ShanYanSDK.framework; sourceTree = "<group>"; };
-		A72A72DD22321E5200B21995 /* uni_account_login_sdk_res.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = uni_account_login_sdk_res.bundle; sourceTree = "<group>"; };
-		A72A72DE22321E5200B21995 /* HTMLResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = HTMLResource.bundle; sourceTree = "<group>"; };
-		A72A72DF22321E5200B21995 /* OAuth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OAuth.framework; sourceTree = "<group>"; };
-		A72A72E022321E5200B21995 /* EAccountApiSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = EAccountApiSDK.framework; sourceTree = "<group>"; };
 		A72A72E222321E5200B21995 /* AlipaySDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = AlipaySDK.bundle; sourceTree = "<group>"; };
 		A72A72E322321E5200B21995 /* AlipaySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AlipaySDK.framework; sourceTree = "<group>"; };
 		A72A72EF22321E8800B21995 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
@@ -223,6 +228,29 @@
 		A72A733E2232772900B21995 /* WechatAuthSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WechatAuthSDK.h; sourceTree = "<group>"; };
 		A72A733F2232772900B21995 /* libWeChatSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWeChatSDK.a; sourceTree = "<group>"; };
 		A72A734222327DE300B21995 /* WeChatpayOrderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeChatpayOrderModel.swift; sourceTree = "<group>"; };
+		A72A7345223350ED00B21995 /* ShanYanManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShanYanManager.swift; sourceTree = "<group>"; };
+		A72A73472233540F00B21995 /* EAccountApiSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = EAccountApiSDK.framework; sourceTree = "<group>"; };
+		A72A73482233540F00B21995 /* TYRZSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TYRZSDK.framework; sourceTree = "<group>"; };
+		A72A73492233540F00B21995 /* uni_account_login_sdk_res.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = uni_account_login_sdk_res.bundle; sourceTree = "<group>"; };
+		A72A734A2233540F00B21995 /* TYRZResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = TYRZResource.bundle; sourceTree = "<group>"; };
+		A72A734B2233541000B21995 /* account_verify_sdk_core.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = account_verify_sdk_core.framework; sourceTree = "<group>"; };
+		A72A734C2233541000B21995 /* OAuth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OAuth.framework; sourceTree = "<group>"; };
+		A72A734D2233541000B21995 /* HTMLResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = HTMLResource.bundle; sourceTree = "<group>"; };
+		A72A734E2233541100B21995 /* account_login_sdk_core.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = account_login_sdk_core.framework; sourceTree = "<group>"; };
+		A72A734F2233541100B21995 /* CL_ShanYanSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CL_ShanYanSDK.framework; sourceTree = "<group>"; };
+		A72A73592233577000B21995 /* libc++.1.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.1.tbd"; path = "usr/lib/libc++.1.tbd"; sourceTree = SDKROOT; };
+		A72A735B2233635B00B21995 /* AppDelegate+ShanYan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+ShanYan.swift"; sourceTree = "<group>"; };
+		A72A73742233966800B21995 /* RootInfoModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootInfoModel.swift; sourceTree = "<group>"; };
+		A72A73752233966800B21995 /* RootModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootModel.swift; sourceTree = "<group>"; };
+		A72A7381223396CB00B21995 /* SwiftMoyaNetWorkService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkService.swift; sourceTree = "<group>"; };
+		A72A7382223396CB00B21995 /* SwiftMoyaNetWorkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkManager.swift; sourceTree = "<group>"; };
+		A72A7383223396CB00B21995 /* SwiftMoyaServiceAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftMoyaServiceAPI.swift; sourceTree = "<group>"; };
+		A72A7384223396CB00B21995 /* ApiMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiMacro.swift; sourceTree = "<group>"; };
+		A72A738A2233B2DE00B21995 /* ExtensionMethod.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionMethod.swift; sourceTree = "<group>"; };
+		A72A738B2233B2DE00B21995 /* Rx_RealmUtillit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rx_RealmUtillit.swift; sourceTree = "<group>"; };
+		A72A738C2233B2DE00B21995 /* RealmUtility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmUtility.swift; sourceTree = "<group>"; };
+		A72A73902233B55400B21995 /* Dog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Dog.swift; sourceTree = "<group>"; };
+		A72A73922233BFCD00B21995 /* SwiftMoyaNetWorkCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkCacheModel.swift; sourceTree = "<group>"; };
 		A77F2C5D2231FB49001BD3F6 /* RainbowPlanet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RainbowPlanet.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A77F2C602231FB49001BD3F6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		A77F2C672231FB4A001BD3F6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -260,6 +288,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A72A735A2233577000B21995 /* libc++.1.tbd in Frameworks */,
 				A72A730422321EFA00B21995 /* libc++.tbd in Frameworks */,
 				A72A730222321EEE00B21995 /* libz.tbd in Frameworks */,
 				A72A730022321EE900B21995 /* SystemConfiguration.framework in Frameworks */,
@@ -268,18 +297,18 @@
 				A72A72FA22321EBF00B21995 /* CoreText.framework in Frameworks */,
 				A72A72F822321EB600B21995 /* CoreGraphics.framework in Frameworks */,
 				A72A72F622321EA000B21995 /* UIKit.framework in Frameworks */,
+				A72A73512233541100B21995 /* TYRZSDK.framework in Frameworks */,
 				A72A72F422321E9A00B21995 /* Foundation.framework in Frameworks */,
+				A72A73572233541100B21995 /* account_login_sdk_core.framework in Frameworks */,
 				A72A72F222321E9300B21995 /* CFNetwork.framework in Frameworks */,
 				A72A72F022321E8800B21995 /* CoreMotion.framework in Frameworks */,
+				A72A73582233541100B21995 /* CL_ShanYanSDK.framework in Frameworks */,
+				A72A73552233541100B21995 /* OAuth.framework in Frameworks */,
 				A72A72EE22321E5200B21995 /* AlipaySDK.framework in Frameworks */,
-				A72A72EB22321E5200B21995 /* OAuth.framework in Frameworks */,
-				A72A72E522321E5200B21995 /* account_login_sdk_core.framework in Frameworks */,
+				A72A73542233541100B21995 /* account_verify_sdk_core.framework in Frameworks */,
 				A72A73412232772900B21995 /* libWeChatSDK.a in Frameworks */,
-				A72A72E722321E5200B21995 /* account_verify_sdk_core.framework in Frameworks */,
-				A72A72EC22321E5200B21995 /* EAccountApiSDK.framework in Frameworks */,
-				A72A72E622321E5200B21995 /* TYRZSDK.framework in Frameworks */,
-				A72A72E822321E5200B21995 /* CL_ShanYanSDK.framework in Frameworks */,
 				0A110C4CD931995B8E8BF7C5 /* Pods_RainbowPlanet.framework in Frameworks */,
+				A72A73502233541100B21995 /* EAccountApiSDK.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -318,6 +347,8 @@
 		A72A7252223219BD00B21995 /* Service */ = {
 			isa = PBXGroup;
 			children = (
+				A72A73722233966800B21995 /* RootModel */,
+				A72A7380223396CB00B21995 /* SwiftMoyaService */,
 			);
 			path = Service;
 			sourceTree = "<group>";
@@ -335,6 +366,7 @@
 		A72A725422321B9400B21995 /* Manager */ = {
 			isa = PBXGroup;
 			children = (
+				A72A7344223350D900B21995 /* ShanYanManager */,
 				A72A730522321F1D00B21995 /* PayManager */,
 				A72A726122321DBD00B21995 /* BaiduMapManager */,
 				A72A726422321DBD00B21995 /* UMManager */,
@@ -512,15 +544,15 @@
 		A72A72D722321E5200B21995 /* ShanYanSDK */ = {
 			isa = PBXGroup;
 			children = (
-				A72A72D822321E5200B21995 /* TYRZResource.bundle */,
-				A72A72D922321E5200B21995 /* account_login_sdk_core.framework */,
-				A72A72DA22321E5200B21995 /* TYRZSDK.framework */,
-				A72A72DB22321E5200B21995 /* account_verify_sdk_core.framework */,
-				A72A72DC22321E5200B21995 /* CL_ShanYanSDK.framework */,
-				A72A72DD22321E5200B21995 /* uni_account_login_sdk_res.bundle */,
-				A72A72DE22321E5200B21995 /* HTMLResource.bundle */,
-				A72A72DF22321E5200B21995 /* OAuth.framework */,
-				A72A72E022321E5200B21995 /* EAccountApiSDK.framework */,
+				A72A734E2233541100B21995 /* account_login_sdk_core.framework */,
+				A72A734B2233541000B21995 /* account_verify_sdk_core.framework */,
+				A72A734F2233541100B21995 /* CL_ShanYanSDK.framework */,
+				A72A73472233540F00B21995 /* EAccountApiSDK.framework */,
+				A72A734D2233541000B21995 /* HTMLResource.bundle */,
+				A72A734C2233541000B21995 /* OAuth.framework */,
+				A72A734A2233540F00B21995 /* TYRZResource.bundle */,
+				A72A73482233540F00B21995 /* TYRZSDK.framework */,
+				A72A73492233540F00B21995 /* uni_account_login_sdk_res.bundle */,
 			);
 			path = ShanYanSDK;
 			sourceTree = "<group>";
@@ -583,6 +615,45 @@
 			path = WeChatSDK;
 			sourceTree = "<group>";
 		};
+		A72A7344223350D900B21995 /* ShanYanManager */ = {
+			isa = PBXGroup;
+			children = (
+				A72A7345223350ED00B21995 /* ShanYanManager.swift */,
+			);
+			path = ShanYanManager;
+			sourceTree = "<group>";
+		};
+		A72A73722233966800B21995 /* RootModel */ = {
+			isa = PBXGroup;
+			children = (
+				A72A73742233966800B21995 /* RootInfoModel.swift */,
+				A72A73752233966800B21995 /* RootModel.swift */,
+			);
+			path = RootModel;
+			sourceTree = "<group>";
+		};
+		A72A7380223396CB00B21995 /* SwiftMoyaService */ = {
+			isa = PBXGroup;
+			children = (
+				A72A7384223396CB00B21995 /* ApiMacro.swift */,
+				A72A7383223396CB00B21995 /* SwiftMoyaServiceAPI.swift */,
+				A72A7381223396CB00B21995 /* SwiftMoyaNetWorkService.swift */,
+				A72A7382223396CB00B21995 /* SwiftMoyaNetWorkManager.swift */,
+				A72A73922233BFCD00B21995 /* SwiftMoyaNetWorkCacheModel.swift */,
+			);
+			path = SwiftMoyaService;
+			sourceTree = "<group>";
+		};
+		A72A73892233B2DE00B21995 /* RealmUtility */ = {
+			isa = PBXGroup;
+			children = (
+				A72A738C2233B2DE00B21995 /* RealmUtility.swift */,
+				A72A738B2233B2DE00B21995 /* Rx_RealmUtillit.swift */,
+				A72A738A2233B2DE00B21995 /* ExtensionMethod.swift */,
+			);
+			path = RealmUtility;
+			sourceTree = "<group>";
+		};
 		A77F2C542231FB49001BD3F6 = {
 			isa = PBXGroup;
 			children = (
@@ -647,6 +718,7 @@
 				A72A73092232207600B21995 /* AppDelegate+BaiduMap.swift */,
 				A72A730B2232207600B21995 /* AppDelegate+IQKeyboardManagerSwift.swift */,
 				A72A73082232207600B21995 /* AppDelegate+UM.swift */,
+				A72A735B2233635B00B21995 /* AppDelegate+ShanYan.swift */,
 				A72A733422325A4B00B21995 /* AppDelegate+HandleOpen.swift */,
 			);
 			path = AppDelegate;
@@ -767,8 +839,9 @@
 		A77F2CAB2232010F001BD3F6 /* ViewController */ = {
 			isa = PBXGroup;
 			children = (
-				A77F2CAC2232010F001BD3F6 /* MineViewController.xib */,
+				A72A73902233B55400B21995 /* Dog.swift */,
 				A77F2CAD2232010F001BD3F6 /* MineViewController.swift */,
+				A77F2CAC2232010F001BD3F6 /* MineViewController.xib */,
 			);
 			path = ViewController;
 			sourceTree = "<group>";
@@ -817,6 +890,7 @@
 		A77F2CBC2232022A001BD3F6 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				A72A73892233B2DE00B21995 /* RealmUtility */,
 				A72A728422321DE000B21995 /* AlertView */,
 				A72A727D22321DDF00B21995 /* AppInfo */,
 				A72A727F22321DDF00B21995 /* CGView */,
@@ -846,6 +920,7 @@
 		FA8AAFBADE8BD144A5C36FDB /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				A72A73592233577000B21995 /* libc++.1.tbd */,
 				A72A730322321EFA00B21995 /* libc++.tbd */,
 				A72A730122321EEE00B21995 /* libz.tbd */,
 				A72A72FF22321EE900B21995 /* SystemConfiguration.framework */,
@@ -976,13 +1051,13 @@
 			files = (
 				A77F2CB82232010F001BD3F6 /* ShoppingCartViewController.xib in Resources */,
 				A72A73402232772900B21995 /* README.txt in Resources */,
-				A72A72E422321E5200B21995 /* TYRZResource.bundle in Resources */,
 				A72A72ED22321E5200B21995 /* AlipaySDK.bundle in Resources */,
-				A72A72E922321E5200B21995 /* uni_account_login_sdk_res.bundle in Resources */,
 				A77F2CB62232010F001BD3F6 /* MineViewController.xib in Resources */,
+				A72A73532233541100B21995 /* TYRZResource.bundle in Resources */,
+				A72A73522233541100B21995 /* uni_account_login_sdk_res.bundle in Resources */,
 				A77F2C682231FB4A001BD3F6 /* Assets.xcassets in Resources */,
-				A72A72EA22321E5200B21995 /* HTMLResource.bundle in Resources */,
 				A77F2CB42232010F001BD3F6 /* ShoppingViewController.xib in Resources */,
+				A72A73562233541100B21995 /* HTMLResource.bundle in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1069,6 +1144,8 @@
 				"${BUILT_PRODUCTS_DIR}/MLeaksFinder/MLeaksFinder.framework",
 				"${BUILT_PRODUCTS_DIR}/Moya/Moya.framework",
 				"${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework",
+				"${BUILT_PRODUCTS_DIR}/Realm/Realm.framework",
+				"${BUILT_PRODUCTS_DIR}/RealmSwift/RealmSwift.framework",
 				"${BUILT_PRODUCTS_DIR}/Result/Result.framework",
 				"${BUILT_PRODUCTS_DIR}/RxAtomic/RxAtomic.framework",
 				"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework",
@@ -1091,6 +1168,8 @@
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MLeaksFinder.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RealmSwift.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxAtomic.framework",
 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework",
@@ -1160,6 +1239,7 @@
 				A72A72C522321DE000B21995 /* WKWebViewConfig.swift in Sources */,
 				A72A72BB22321DE000B21995 /* Extension+UILabel.swift in Sources */,
 				A77F2C9E2231FDDC001BD3F6 /* BaseViewController.swift in Sources */,
+				A72A737F2233966800B21995 /* RootModel.swift in Sources */,
 				A77F2CC722320627001BD3F6 /* WRNavigationBar.swift in Sources */,
 				A72A72BE22321DE000B21995 /* Extension+RxTimer.swift in Sources */,
 				A72A72C422321DE000B21995 /* Extension+CAGradientLayer.swift in Sources */,
@@ -1167,11 +1247,15 @@
 				A72A73392232688100B21995 /* AlipayOrderModel.swift in Sources */,
 				A72A72A322321DE000B21995 /* LBXScanView.swift in Sources */,
 				A72A730D2232207700B21995 /* AppDelegate+BaiduMap.swift in Sources */,
+				A72A7386223396CB00B21995 /* SwiftMoyaNetWorkManager.swift in Sources */,
+				A72A735C2233635B00B21995 /* AppDelegate+ShanYan.swift in Sources */,
 				A77F2CCA223209F2001BD3F6 /* BaseTabbarViewController.swift in Sources */,
+				A72A7387223396CB00B21995 /* SwiftMoyaServiceAPI.swift in Sources */,
 				A72A726822321DBD00B21995 /* UMManager.swift in Sources */,
 				A77F2CB92232010F001BD3F6 /* ShoppingCartViewController.swift in Sources */,
 				A72A72B822321DE000B21995 /* Extension+UserDefaults.swift in Sources */,
 				A72A72C222321DE000B21995 /* UIBarButtonItem+SXCreate.m in Sources */,
+				A72A738D2233B2DE00B21995 /* ExtensionMethod.swift in Sources */,
 				A72A72A222321DE000B21995 /* LBXScanNetAnimation.swift in Sources */,
 				A72A72D322321E2700B21995 /* CacheMacro.swift in Sources */,
 				A72A72A422321DE000B21995 /* LBXScanViewController.swift in Sources */,
@@ -1181,7 +1265,9 @@
 				A72A73142232475E00B21995 /* AlipayManager.swift in Sources */,
 				A72A72D522321E2700B21995 /* ColorMacro.swift in Sources */,
 				A72A726622321DBD00B21995 /* BaiduMapManager.swift in Sources */,
+				A72A737E2233966800B21995 /* RootInfoModel.swift in Sources */,
 				A72A7333223256E100B21995 /* PayManager.swift in Sources */,
+				A72A738F2233B2DE00B21995 /* RealmUtility.swift in Sources */,
 				A72A72D622321E2700B21995 /* ThirdPartyMacro.swift in Sources */,
 				A72A72A622321DE000B21995 /* LBXScanViewStyle.swift in Sources */,
 				A72A72B422321DE000B21995 /* Extension+UIImage.swift in Sources */,
@@ -1194,7 +1280,10 @@
 				A72A72A722321DE000B21995 /* LBXPermissions.swift in Sources */,
 				A72A72AE22321DE000B21995 /* CountdownButton.swift in Sources */,
 				A77F2CB72232010F001BD3F6 /* MineViewController.swift in Sources */,
+				A72A7385223396CB00B21995 /* SwiftMoyaNetWorkService.swift in Sources */,
+				A72A7346223350ED00B21995 /* ShanYanManager.swift in Sources */,
 				A72A72A822321DE000B21995 /* LBXScanWrapper.swift in Sources */,
+				A72A73932233BFCD00B21995 /* SwiftMoyaNetWorkCacheModel.swift in Sources */,
 				A72A72BD22321DE000B21995 /* Extension+UIColor.swift in Sources */,
 				A77F2CC822320627001BD3F6 /* WRCustomNavigationBar.swift in Sources */,
 				A72A72BC22321DE000B21995 /* Extension+UIAlertController.swift in Sources */,
@@ -1204,6 +1293,7 @@
 				A72A72A522321DE000B21995 /* LBXScanLineAnimation.swift in Sources */,
 				A72A72C322321DE000B21995 /* Extension+Date.swift in Sources */,
 				A72A72B222321DE000B21995 /* NSObject+BARunTime.m in Sources */,
+				A72A73912233B55400B21995 /* Dog.swift in Sources */,
 				A72A72C622321DE000B21995 /* WebView.swift in Sources */,
 				A72A72D122321E2700B21995 /* HTMLURLMacro.swift in Sources */,
 				A72A73162232481600B21995 /* WeChatpayManager.swift in Sources */,
@@ -1218,6 +1308,8 @@
 				A72A72B522321DE000B21995 /* Extension+UITextView.swift in Sources */,
 				A72A733722325EED00B21995 /* AlipayResultModel.swift in Sources */,
 				A77F2C9C2231FDCF001BD3F6 /* BaseView.swift in Sources */,
+				A72A738E2233B2DE00B21995 /* Rx_RealmUtillit.swift in Sources */,
+				A72A7388223396CB00B21995 /* ApiMacro.swift in Sources */,
 				A72A72B922321DE000B21995 /* Extension+Array.swift in Sources */,
 				A72A733522325A4B00B21995 /* AppDelegate+HandleOpen.swift in Sources */,
 				A72A72AC22321DE000B21995 /* Regex.swift in Sources */,
@@ -1383,6 +1475,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				DEVELOPMENT_TEAM = 3DG4J39B63;
+				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/RainbowPlanet/Lib/ShanYanSDK",
@@ -1404,7 +1497,94 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/RainbowPlanet/Lib/WeChatSDK",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.chxq.RainbowPlanet;
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-ObjC",
+					"-l\"SocialQQ\"",
+					"-l\"SocialSina\"",
+					"-l\"SocialWeChat\"",
+					"-l\"c++\"",
+					"-l\"sqlite3\"",
+					"-l\"sqlite3.0\"",
+					"-l\"z\"",
+					"-framework",
+					"\"AdSupport\"",
+					"-framework",
+					"\"Alamofire\"",
+					"-framework",
+					"\"BMKLocationKit\"",
+					"-framework",
+					"\"CoreGraphics\"",
+					"-framework",
+					"\"CoreLocation\"",
+					"-framework",
+					"\"CoreTelephony\"",
+					"-framework",
+					"\"CryptoSwift\"",
+					"-framework",
+					"\"DeviceKit\"",
+					"-framework",
+					"\"FBRetainCycleDetector\"",
+					"-framework",
+					"\"Foundation\"",
+					"-framework",
+					"\"IQKeyboardManagerSwift\"",
+					"-framework",
+					"\"Kingfisher\"",
+					"-framework",
+					"\"MBProgressHUD\"",
+					"-framework",
+					"\"MJRefresh\"",
+					"-framework",
+					"\"MLeaksFinder\"",
+					"-framework",
+					"\"Moya\"",
+					"-framework",
+					"\"ObjectMapper\"",
+					"-framework",
+					"\"Photos\"",
+					"-framework",
+					"\"QuartzCore\"",
+					"-framework",
+					"\"Result\"",
+					"-framework",
+					"\"RxAtomic\"",
+					"-framework",
+					"\"RxCocoa\"",
+					"-framework",
+					"\"RxSwift\"",
+					"-framework",
+					"\"Security\"",
+					"-framework",
+					"\"SecurityEnvSDK\"",
+					"-framework",
+					"\"SnapKit\"",
+					"-framework",
+					"\"SwiftyJSON\"",
+					"-framework",
+					"\"SystemConfiguration\"",
+					"-framework",
+					"\"UIKit\"",
+					"-framework",
+					"\"UMAnalytics\"",
+					"-framework",
+					"\"UMCommon\"",
+					"-framework",
+					"\"UMCommonLog\"",
+					"-framework",
+					"\"UMPush\"",
+					"-framework",
+					"\"UMShare\"",
+					"-framework",
+					"\"UShareUI\"",
+					"-framework",
+					"\"UTDID\"",
+					"-framework",
+					"\"UserNotifications\"",
+					"-force_load",
+					"\"$(SRCROOT)/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/CL_ShanYanSDK\"",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = "com.chxq.rainbow-planet";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "RainbowPlanet/Define/RainbowPlanet-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -1422,6 +1602,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				DEVELOPMENT_TEAM = 3DG4J39B63;
+				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/RainbowPlanet/Lib/ShanYanSDK",
@@ -1443,7 +1624,94 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/RainbowPlanet/Lib/WeChatSDK",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.chxq.RainbowPlanet;
+				OTHER_LDFLAGS = (
+					"$(inherited)",
+					"-ObjC",
+					"-l\"SocialQQ\"",
+					"-l\"SocialSina\"",
+					"-l\"SocialWeChat\"",
+					"-l\"c++\"",
+					"-l\"sqlite3\"",
+					"-l\"sqlite3.0\"",
+					"-l\"z\"",
+					"-framework",
+					"\"AdSupport\"",
+					"-framework",
+					"\"Alamofire\"",
+					"-framework",
+					"\"BMKLocationKit\"",
+					"-framework",
+					"\"CoreGraphics\"",
+					"-framework",
+					"\"CoreLocation\"",
+					"-framework",
+					"\"CoreTelephony\"",
+					"-framework",
+					"\"CryptoSwift\"",
+					"-framework",
+					"\"DeviceKit\"",
+					"-framework",
+					"\"FBRetainCycleDetector\"",
+					"-framework",
+					"\"Foundation\"",
+					"-framework",
+					"\"IQKeyboardManagerSwift\"",
+					"-framework",
+					"\"Kingfisher\"",
+					"-framework",
+					"\"MBProgressHUD\"",
+					"-framework",
+					"\"MJRefresh\"",
+					"-framework",
+					"\"MLeaksFinder\"",
+					"-framework",
+					"\"Moya\"",
+					"-framework",
+					"\"ObjectMapper\"",
+					"-framework",
+					"\"Photos\"",
+					"-framework",
+					"\"QuartzCore\"",
+					"-framework",
+					"\"Result\"",
+					"-framework",
+					"\"RxAtomic\"",
+					"-framework",
+					"\"RxCocoa\"",
+					"-framework",
+					"\"RxSwift\"",
+					"-framework",
+					"\"Security\"",
+					"-framework",
+					"\"SecurityEnvSDK\"",
+					"-framework",
+					"\"SnapKit\"",
+					"-framework",
+					"\"SwiftyJSON\"",
+					"-framework",
+					"\"SystemConfiguration\"",
+					"-framework",
+					"\"UIKit\"",
+					"-framework",
+					"\"UMAnalytics\"",
+					"-framework",
+					"\"UMCommon\"",
+					"-framework",
+					"\"UMCommonLog\"",
+					"-framework",
+					"\"UMPush\"",
+					"-framework",
+					"\"UMShare\"",
+					"-framework",
+					"\"UShareUI\"",
+					"-framework",
+					"\"UTDID\"",
+					"-framework",
+					"\"UserNotifications\"",
+					"-force_load",
+					"\"$(SRCROOT)/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/CL_ShanYanSDK\"",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = "com.chxq.rainbow-planet";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "RainbowPlanet/Define/RainbowPlanet-Bridging-Header.h";
 				SWIFT_VERSION = 4.2;

+ 17 - 0
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+ShanYan.swift

@@ -0,0 +1,17 @@
+//
+//  AppDelegate+ShanYan.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/3/9.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import Foundation
+
+extension AppDelegate {
+
+    func initShanYan() {
+        ShanYanManager.shared().initShanYanSDK()
+    }
+    
+}

+ 16 - 7
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+UM.swift

@@ -27,13 +27,22 @@ extension AppDelegate {
     
     ///公共
     func common() -> Void {
-        UMCommonLogManager.setUp() //开发者需要显式的调用此函数,日志系统才能工作
-        UMConfigure.setEncryptEnabled(true) //打开加密传输
-        UMConfigure.setLogEnabled(true)  //设置打开日志
-        UMConfigure.initWithAppkey(kUMengAppKey, channel: "App Store") //设置Key
-//        MobClick.setAutoPageEnabled(true) //将自动采集页面信息
-        MobClick.setCrashReportEnabled(true) //开启Crash收集
-        
+
+        //将自动采集页面信息
+        MobClick.setAutoPageEnabled(true)
+        //开发者需要显式的调用此函数,日志系统才能工作
+        UMCommonLogManager.setUp()
+        //打开加密传输
+        UMConfigure.setEncryptEnabled(true)
+        //设置打开日志
+        UMConfigure.setLogEnabled(true)
+        //设置Key
+        UMConfigure.initWithAppkey(kUMengAppKey, channel: "App Store")
+
+        //开启Crash收集
+        MobClick.setCrashReportEnabled(true)
+        //默认为普通应用场景,目前还支持游戏统计场景
+        MobClick.setScenarioType(eScenarioType.E_UM_NORMAL)
         //获得集成测试需要device_id
         let deice_id = UMConfigure.deviceIDForIntegration()
         if deice_id != nil {

+ 6 - 4
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate.swift

@@ -17,12 +17,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
         //初始化地图
         initBaiduMap()
-        //初始化键盘
-        initIQKeyboard()
-        //初始化友盟
-        initUM(launchOptions: launchOptions)
         //初始化窗口
         initWindow()
+        //初始化友盟
+        initUM(launchOptions: launchOptions)
+        //闪验
+        initShanYan()
+        //初始化键盘
+        initIQKeyboard()
         return true
     }
 

+ 4 - 0
RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift

@@ -43,4 +43,8 @@ class BaseViewController: UIViewController {
         navigationController?.popViewController(animated: true)
     }
 
+    func setupViews() {}
+
+    func setupLayouts() {}
+
 }

+ 3 - 0
RainbowPlanet/RainbowPlanet/Define/RainbowPlanet-Bridging-Header.h

@@ -17,6 +17,9 @@
 //微信支付
 #import "WXApi.h"
 
+//闪验
+#import <CL_ShanYanSDK/CL_ShanYanSDK.h>
+
 //友盟
 #import <UMCommon/UMCommon.h>
 #import <UMPush/UMessage.h>

+ 8 - 4
RainbowPlanet/RainbowPlanet/Define/ThirdPartyMacro.swift

@@ -9,8 +9,8 @@
 import Foundation
 
 //MARK: -  bugly
-let kBuglyAppId  = "dea0c63442"
-let kBuglyAppKey  = "475526b6-2b02-4810-972b-1bdbf853d8fe"
+let kBuglyAppId  = ""
+let kBuglyAppKey  = ""
 
 //MARK: - UMeng
 let kUMengAppKey  = "5b3dbd078f4a9d5c100000c1"
@@ -26,7 +26,11 @@ let kWeiXinAppSecret = "c5dc884f79a1bb00e96d76a3e16da39a"
 //MARK: - 微博
 let kWeiboAppKey  = "2824278574"
 let kWeiboAppSecret  = "0be988a21b045ecf948ba5838b72f689"
-
 //MARK: - 百度地图
-let kBaiduMapAppKey  = "UhUyWpGF9ZGUn8uo4vOpyoO7GRjk1Q70"
+let kBaiduMapAppKey  = ""
+
+//MARK: - 闪验
+let kShanYanAppId  = ""
+let kShanYanAppKey  = ""
+
 

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/CL_ShanYanSDK


+ 12 - 2
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/CL_ShanYanSDK.framework/Headers/CLUIConfigure.h

@@ -15,6 +15,9 @@ NS_ASSUME_NONNULL_BEGIN
 @interface CLCTCCUIConfigure : NSObject
 //要拉起授权页的vc(注:SDK不持有接入方VC)
 @property (nonatomic,weak)UIViewController * viewController;
+//viewController/navigationController至少传一个
+//要拉起授权页的导航,(如果为空则使用viewController present方式弹出授权页)
+@property (nonatomic,weak)UINavigationController * navigationController;
 //LOGO图片,可选
 @property (nonatomic,strong)UIImage * logoImg;
 /**
@@ -24,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
  */
 @property (nonatomic, assign) BOOL otherWayHidden;
 
+
 @end
 
 
@@ -41,13 +45,16 @@ NS_ASSUME_NONNULL_BEGIN
  */
 @property (nonatomic, assign) BOOL otherWayHidden;
 
+
+
 @end
 
+
 //联通配置
 @interface CLCUCCUIConfigure : NSObject
-//调一键登录的vc,必传(注:SDK不持有接入方VC)
+//调一键登录的vc,必传(注:CL_ShanYanSDK不持有联通授权页VC)
 @property (nonatomic,weak)UIViewController * viewController;
-//LOGO图片,可选
+/**LOGO图片*/
 @property (nonatomic,strong)UIImage *  UAPageContentLogo;
 /**
  是否隐藏 其他登录方式按钮  隐藏:YES 显示:NO  ,可选
@@ -56,6 +63,9 @@ NS_ASSUME_NONNULL_BEGIN
  -(void)otherLoginWayBtnCliced:(UIButton *)sender{}
  */
 @property (nonatomic, assign) BOOL otherWayHidden;
+
+
+
 @end
 
 NS_ASSUME_NONNULL_END

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/EAccountApiSDK


+ 47 - 17
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/Headers/EAccountSDK.h

@@ -6,7 +6,9 @@
 //  Copyright © 2018年 21CN. All rights reserved.
 //
 
-//定制版SDK v1.4.0
+/**
+ V 1.5.0 修复已知的bug
+ */
 
 #import <Foundation/Foundation.h>
 
@@ -22,8 +24,6 @@ typedef   void (^successHandler) ( NSDictionary * _Nonnull resultDic);
  */
 typedef   void (^failureHandler) (NSError * _Nonnull error);
 
-NS_ASSUME_NONNULL_BEGIN
-
 @interface EAccountSDK : NSObject
 
 /**
@@ -31,24 +31,54 @@ NS_ASSUME_NONNULL_BEGIN
  @param appKey 接入方在账号平台领取的appKey
  @param appSecrect 接入方在账号平台领取的appSecrect
  */
-+ (void)initWithSelfKey:(NSString *)appKey
-              appSecret:(NSString *)appSecrect;
++ (void)initWithSelfKey:(NSString * _Nonnull)appKey
+              appSecret:(NSString * _Nonnull)appSecrect;
 
 
 /**
- 默认为正式环境的bundleID,需要使用测试环境的bundleID(企业证书重签名),请添加这个方法,在发布APP的时候请确保没有使用该方法。
+默认为正式环境的bundleID,需要使用测试环境的bundleID(注意:这里的测试环境,是指在天翼账号配置的测试BundleID,例如开发者使用企业证书重签名给测试人员测试,重签名之后的App的BundleID会改变),请添加这个方法,在发布APP的时候请确保没有使用该方法。
  */
 
 +(void)setTestBundleId;
 
 /**
- *@description 预取号
-  @param apiTimeoutInterval 接口超时时间,传0或者小于0的数,则默认为3s
-*/
+ *@description 预登录接口
+ @param apiTimeoutInterval 接口超时时间,传0或者小于0的数,则默认为3s
+ */
 
-+ (void)getMobileCodeWithTimeout:(NSTimeInterval)apiTimeoutInterval
++ (void)requestPreLogin:(NSTimeInterval)apiTimeoutInterval
+                      completion:(nonnull successHandler)completion
+                         failure:(nonnull failureHandler)fail;
+
+/**
+ *@description 校验接口
+ @param apiTimeoutInterval 接口超时时间,传0或者小于0的数,则默认为3s
+ */
+
++ (void)requestPreVerification:(NSTimeInterval)apiTimeoutInterval
+                            completion:(nonnull successHandler)completion
+                               failure:(nonnull failureHandler)fail;
+
+/**
+ *@description 登录接口
+ *@param accessCode 预取号获取d的accessCode
+ */
++ (void)requestLogin:(NSString * _Nonnull)accessCode
+                  withTimeoutInterval:(NSTimeInterval)apiTimeoutInterval
            completion:(nonnull successHandler)completion
               failure:(nonnull failureHandler)fail;
+
+
+
+/**
+ *@description 预取号
+ @param apiTimeoutInterval 接口超时时间,传0或者小于0的数,则默认为3s
+ */
+
++ (void)getMobileCodeWithTimeout:(NSTimeInterval)apiTimeoutInterval
+                      completion:(nonnull successHandler)completion
+                         failure:(nonnull failureHandler)fail  DEPRECATED_MSG_ATTRIBUTE("Method deprecated. Use `requestPreLogin:completion:failure:`");
+
 /**
  *@description 校验
  @param apiTimeoutInterval 接口超时时间,传0或者小于0的数,则默认为3s
@@ -56,17 +86,17 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (void)getVerificationCodeWithTimeout:(NSTimeInterval)apiTimeoutInterval
                             completion:(nonnull successHandler)completion
-                               failure:(nonnull failureHandler)fail;
+                               failure:(nonnull failureHandler)fail DEPRECATED_MSG_ATTRIBUTE("Method deprecated. Use `requestVerification:completion:failure:`");
+
 /**
  *@description 网络认证
  *@param accessCode 预取号获取d的accessCode
  */
-+ (void)gatewayAuthWithAccessCode:(NSString*)accessCode
-                 timeoutInterval:(NSTimeInterval)apiTimeoutInterval
-           completion:(nonnull successHandler)completion
-              failure:(nonnull failureHandler)fail;
++ (void)gatewayAuthWithAccessCode:(NSString * _Nonnull)accessCode
+              withTimeoutInterval:(NSTimeInterval)apiTimeoutInterval
+                       completion:(nonnull successHandler)completion
+                          failure:(nonnull failureHandler)fail DEPRECATED_MSG_ATTRIBUTE("Method deprecated. Use `requestLogin:completion:failure:`");
 
 
-@end
 
-NS_ASSUME_NONNULL_END
+@end

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/EAccountApiSDK.framework/Info.plist


+ 2 - 1
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/Headers/OAuthManager.h

@@ -2,6 +2,7 @@
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
 #import "ResultListener.h"
+#import <account_login_sdk_core/UniCustomModel.h>
 
 
 @interface OAuthManager : NSObject
@@ -22,7 +23,7 @@
 -(void) user:(NSString *) accessToken listener:(resultListener) listener;
 
 //修改UI
--(void) customUIWithParams:(NSDictionary *)customUIParams customViews:(void(^)(UIView                                                                              *customAreaView))customViews;
+-(void)customUIWithParams:(UniCustomModel *)uniCustomModel customViews:(void(^)(NSDictionary *customAreaDict))customViews;
 //自定义跳转
 -(void)setLoginSuccessPage:(UIViewController *)uiController;
 

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/OAuth


BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeDirectory


BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeRequirements-1


+ 3 - 3
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeResources

@@ -6,7 +6,7 @@
 	<dict>
 		<key>Headers/OAuthManager.h</key>
 		<data>
-		Bl5T/7hExHX1Q7Bpn9IzaJw4bhU=
+		frajf8cli5SbLjgFgzk6//k4RnU=
 		</data>
 		<key>Headers/ResultListener.h</key>
 		<data>
@@ -23,11 +23,11 @@
 		<dict>
 			<key>hash</key>
 			<data>
-			Bl5T/7hExHX1Q7Bpn9IzaJw4bhU=
+			frajf8cli5SbLjgFgzk6//k4RnU=
 			</data>
 			<key>hash2</key>
 			<data>
-			KkY65vwOQ6yTNXW7nORSoHn65r2rykqqX2vMiba2+eY=
+			uJLy/rI0GHMTdO6ypGOhmBeM0DpwrCyfpauaQkjm9OY=
 			</data>
 		</dict>
 		<key>Headers/ResultListener.h</key>

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/OAuth.framework/_CodeSignature/CodeSignature


+ 2 - 1
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/Headers/UniAuthHelper.h

@@ -9,6 +9,7 @@
 #import <Foundation/Foundation.h>
 #import "UniResultListener.h"
 #import <UIKit/UIKit.h>
+#import "UniCustomModel.h"
 
 @interface UniAuthHelper : NSObject
 
@@ -20,7 +21,7 @@
 
 -(void) login : (UIViewController*)uiController timeout:(double)timeout listener:(UniResultListener) listener;
 
--(void)customUIWithParams:(NSDictionary *)customUIParams customViews:(void(^)(UIView                                                                              *customAreaView))customViews;
+-(void)customUIWithParams:(UniCustomModel *)uniCustomModel customViews:(void(^)(NSDictionary *customAreaDict))customViews;
 
 
 -(void)setLoginSuccessPage:(UIViewController *)uiController;

+ 147 - 0
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/Headers/UniCustomModel.h

@@ -0,0 +1,147 @@
+//
+//  UniCustomModel.h
+//  account_login_sdk_core
+//
+//  Created by zhuof on 2019/1/18.
+//  Copyright © 2019年 xiaowo. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UniCustomModel : NSObject
+/*----------------------------------------授权页面-----------------------------------*/
+
+//MARK:Background*************
+
+/**导航栏颜色*/
+@property (nonatomic,strong) UIColor *backgroundColor;
+
+//MARK:导航栏*************
+
+/**导航栏颜色*/
+@property (nonatomic,strong) UIColor *navColor;
+/**导航栏标题*/
+@property (nonatomic,strong) NSAttributedString *navText;
+/**导航返回图标*/
+@property (nonatomic,strong) UIImage *navReturnImg;
+/**导航栏右侧自定义控件*/
+@property (nonatomic,strong) UIBarButtonItem *navControl;
+/**状态栏着色样式*/
+@property (nonatomic,assign) UIStatusBarStyle barStyle;
+/**隐藏导航栏线条*/
+@property (nonatomic,assign) BOOL navLineHidden;
+
+//MARK:图片设置************
+
+/**LOGO图片*/
+@property (nonatomic,strong) UIImage *logoImg;
+/**LOGO图片宽度*/
+@property (nonatomic,assign) CGFloat logoWidth;
+/**LOGO图片高度*/
+@property (nonatomic,assign) CGFloat logoHeight;
+/**LOGO图片偏移量*/
+@property (nonatomic,assign) CGFloat logoOffsetY;
+
+//MARK:登录按钮设置************
+
+/**登录按钮文本*/
+@property (nonatomic,strong) NSString *logBtnText;
+/**登录按钮Y偏移量*/
+@property (nonatomic,assign) CGFloat logBtnOffsetY;
+/**登录按钮文本颜色*/
+@property (nonatomic,strong) UIColor *logBtnTextColor;
+/**登录按钮背景颜色*/
+@property (nonatomic,strong) UIColor *logBtnColor;
+/**登录按钮背景图片*/
+@property (nonatomic,strong) UIImage *logBtnImg;
+/**登录按钮圆角*/
+@property (nonatomic,assign) CGFloat logBtnRadius;
+/**登录按钮字体*/
+@property (nonatomic,strong) UIFont *logBtnTextFont;
+
+//MARK:号码框设置************
+
+/**手机号码字体颜色*/
+@property (nonatomic,strong) UIColor *numberColor;
+/**手机号码Y偏移量*/
+@property (nonatomic,assign) CGFloat numberOffsetY;
+/**手机号码字体*/
+@property (nonatomic,strong) UIFont *numberFont;
+
+//MARK:appName设置************
+
+/**隐藏应用名*/
+@property (nonatomic,assign) BOOL appNameHidden;
+/**应用名字体颜色*/
+@property (nonatomic,strong) UIColor *appNameTextColor;
+/**应用名字体*/
+@property (nonatomic,strong) UIFont *appNameFont;
+/**应用名Y偏移量*/
+@property (nonatomic,assign) CGFloat appNameOffsetY;
+
+//MARK:其他登录方式设置************
+
+/**隐藏其他登录方式按钮*/
+@property (nonatomic,assign) BOOL swithAccHidden;
+/**其他登录方式字体颜色*/
+@property (nonatomic,strong) UIColor *swithAccTextColor;
+/**其他登录方式Y偏移量*/
+@property (nonatomic,assign) CGFloat swithAccOffsetY;
+/**其他登录方式X偏移量*/
+@property (nonatomic,assign) CGFloat swithAccOffsetX;
+/**其他登录方式字体*/
+@property (nonatomic,strong) UIFont *swithAccFont;
+
+//MARK:隐私条款设置************
+
+///**复选框选中时图片*/
+//@property (nonatomic,strong) UIImage *checkedImg;
+/**隐私条款名称颜色(含书名号)*/
+@property (nonatomic,strong) UIColor *privacyTextColor;
+/**隐私条款Y偏移量*/
+@property (nonatomic,assign) CGFloat privacyOffsetY;
+/**开发者隐私条款名称颜色(含书名号)*/
+@property (nonatomic,strong) UIColor *appPrivacyColor;
+/**开发者隐私条款名称(含书名号)*/
+@property (nonatomic,strong) NSString *appPrivacyText;
+/**开发者隐私条款url*/
+@property (nonatomic,strong) NSString *appPrivacyUrl;
+/**隐私条款底部文本*/
+@property (nonatomic,strong) NSString *privacyButtomText;
+
+//MARK:slogan设置************
+
+/**认证服务品牌文字颜色*/
+@property (nonatomic,strong) UIColor *sloganTextColor;
+/**认证服务品牌Y偏移量*/
+@property (nonatomic,assign) CGFloat sloganOffsetY;
+
+
+//MARK:loading设置************
+
+/**loading背景色*/
+@property (nonatomic,strong) UIColor *loadingBgColor;
+/**loading背景圆角*/
+@property (nonatomic,assign) CGFloat loadingBgRadius;
+/**loading背景宽度*/
+@property (nonatomic,assign) CGFloat loadingBgWidth;
+/**loading背景高度*/
+@property (nonatomic,assign) CGFloat loadingBgHeight;
+/**loading提示文字*/
+@property (nonatomic,strong) NSString *loadingText;
+/**loading提示文字颜色*/
+@property (nonatomic,strong) UIColor *loadingTextColor;
+/**loading提示文字字体*/
+@property (nonatomic,strong) UIFont *loadingTextFont;
+/**loading提示文字高度*/
+@property (nonatomic,assign) CGFloat loadingTextHeight;
+/**loading动画帧*/
+@property (nonatomic,strong) NSArray *loadingRes;
+/**loading动画耗时*/
+@property (nonatomic,assign) CGFloat loadingResDuration;
+/**loading动画帧宽度*/
+@property (nonatomic,assign) CGFloat loadingResWidth;
+/**loading动画帧高度*/
+@property (nonatomic,assign) CGFloat loadingResHeight;
+
+@end

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeDirectory


BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeRequirements-1


+ 18 - 3
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/_CodeSignature/CodeResources

@@ -6,7 +6,11 @@
 	<dict>
 		<key>Headers/UniAuthHelper.h</key>
 		<data>
-		OrFNgjZTT531p+hZ4/0DbJr9tAM=
+		883S7v7q4JhVFkn6b7fBkiNabVo=
+		</data>
+		<key>Headers/UniCustomModel.h</key>
+		<data>
+		bzCeKhuZE131kOP0VUzNVInCsL0=
 		</data>
 		<key>Headers/UniResultListener.h</key>
 		<data>
@@ -31,11 +35,22 @@
 		<dict>
 			<key>hash</key>
 			<data>
-			OrFNgjZTT531p+hZ4/0DbJr9tAM=
+			883S7v7q4JhVFkn6b7fBkiNabVo=
+			</data>
+			<key>hash2</key>
+			<data>
+			RpSjTb14Gx1EelroVT321cxTdyfrx4aJYe2PG51YnlQ=
+			</data>
+		</dict>
+		<key>Headers/UniCustomModel.h</key>
+		<dict>
+			<key>hash</key>
+			<data>
+			bzCeKhuZE131kOP0VUzNVInCsL0=
 			</data>
 			<key>hash2</key>
 			<data>
-			RRxXMukHfZjNKXl5FrFpVIj2ytVvnAaAuSkApQ3r2eo=
+			tDmqGsLQwNtEDEiEfyuiY6XUewhxGonMV3AD/lUPCXw=
 			</data>
 		</dict>
 		<key>Headers/UniResultListener.h</key>

BIN
RainbowPlanet/RainbowPlanet/Lib/ShanYanSDK/account_login_sdk_core.framework/account_login_sdk_core


+ 1 - 0
RainbowPlanet/RainbowPlanet/Manager/BaiduMapManager/BaiduMapManager.swift

@@ -33,6 +33,7 @@ class BaiduMapManager: NSObject {
                 let locationModel = LocationModel.init(latitude: String(describing: location!.location!.coordinate.latitude), longitude: String(describing: location!.location!.coordinate.longitude), cityCode: location!.rgcData!.cityCode ?? "", province: location!.rgcData!.province ?? "", city: location!.rgcData!.city ?? "", district: location!.rgcData!.district ?? "", street: location!.rgcData!.street ?? "", locationDescribe: location!.rgcData!.locationDescribe ?? "")
                 LocationModel.setLocationModel(locationModel: locationModel)
             }
+            
         }
     }
 

+ 143 - 0
RainbowPlanet/RainbowPlanet/Manager/ShanYanManager/ShanYanManager.swift

@@ -0,0 +1,143 @@
+//
+//  ShanYanManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/3/9.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+import Alamofire
+import SwiftyJSON
+
+class ShanYanManager: NSObject {
+    private static let _sharedInstance = ShanYanManager()
+
+    private override init() {} // 私有化init方法
+
+    class func shared() -> ShanYanManager {
+        return _sharedInstance
+    }
+
+    /// 成功回调
+    typealias SuccessPayBlock = () -> Void
+    
+    /// 失败回调
+    typealias FailPayBlock = () -> Void
+
+    /// 预初始化
+    func initShanYanSDK() {
+
+        CLShanYanSDKManager.initWithAppId(kShanYanAppId, appKey: kShanYanAppKey, timeOut: 5) { (CLCompleteResult) in
+
+        }
+    }
+
+    /// 预取号
+    func preGetPhonenumber() {
+        CLShanYanSDKManager.preGetPhonenumber()
+    }
+
+    /// 闪验一键登录
+    func quickAuthLogin(successPayBlock : @escaping SuccessPayBlock,failPayBlock : @escaping FailPayBlock) {
+        //电信定制界面
+        let ctccUIConfigure = CLCTCCUIConfigure()
+        ctccUIConfigure.viewController = getCurrentVC()//requried
+        //ctccUIConfigure.logoImg = UIImage.init(named:"??")//Optional
+
+        //移动定制界面
+        let cmccUIConfigure = CLCMCCUIConfigure()
+        cmccUIConfigure.viewController = getCurrentVC()//requried
+        //cmccUIConfigure.logoImg = UIImage.init(named:"??")//Optional
+
+        //联通定制界面
+        let cuccUIConfigure = CLCUCCUIConfigure()
+        cuccUIConfigure.viewController = getCurrentVC()//requried
+        //cuccUIConfigure.uaPageContentLogo = UIImage.init(named:"??")//Optional:
+
+
+        //开发者自己的loading
+        SwiftProgressHUD.shared().showWait("")
+
+        CLShanYanSDKManager.quickAuthLogin(withConfigureCTCC: ctccUIConfigure, cmcc: cmccUIConfigure, cucc: cuccUIConfigure, timeOut: 4) { (completeResult) in
+
+            if completeResult.error != nil {
+                //提示:错误无需提示给用户,可以在用户无感知的状态下直接切换登录方式
+                //提示:错误无需提示给用户,可以在用户无感知的状态下直接切换登录方式
+                //提示:错误无需提示给用户,可以在用户无感知的状态下直接切换登录方式
+
+                DispatchQueue.main.async(execute: {
+                    if completeResult.code == 1011 {
+                        // 用户取消登录
+                        //处理建议:如无特殊需求可不做处理,仅作为状态回调,此时已经回到当前用户自己的页面
+                        SwiftProgressHUD.shared().showWarning("用户取消免密登录")
+                    }else{
+                        //处理建议:其他错误代码表示闪验通道无法继续,可以统一走开发者自己的其他登录方式,也可以对不同的错误单独处理
+                        if completeResult.code == 1009{
+                            // 无SIM卡
+                            SwiftProgressHUD.shared().showWarning("此手机无SIM卡")
+
+                        }else if completeResult.code == 1008{
+                            SwiftProgressHUD.shared().showWarning("请打开蜂窝移动网络")
+                        }else {
+                            // 跳转验证码页面
+                            SwiftProgressHUD.shared().showWarning("网络状况不稳定,切换至验证码登录")
+                        }
+                    }
+                })
+            }else{
+
+                //urlStr:用户后台对接闪验后台后配置的API,以下为Demo提供的调试API及调用示例,在调试阶段可暂时调用此API,也可用此API验证后台API是否正确配置
+                var urlStr : String?
+                let APIString = "https://api.253.com/"
+
+                if let telecom = completeResult.data?["telecom"] as! String?{
+                    switch telecom {
+                    case "CMCC":
+                        urlStr = APIString.appendingFormat("open/flashsdk/mobile-query-m")
+                        break
+                    case "CUCC":
+                        urlStr = APIString.appendingFormat("open/flashsdk/mobile-query-u")
+                        break
+                    case "CTCC":
+                        urlStr = APIString.appendingFormat("open/flashsdk/mobile-query-t")
+                        break
+                    default:
+                        break
+                    }
+                }
+
+                if let urlStr = urlStr{
+                    let dataDict = completeResult.data as! Parameters
+
+                    Alamofire.request(urlStr, method:.post, parameters:dataDict, encoding:URLEncoding.default, headers:[:]).responseJSON(completionHandler: { (response) in
+                        if response.result.isSuccess {
+                            if let json = response.result.value{
+                                let jsonDict = JSON(json)
+                                if jsonDict["code"].intValue == 200000{
+                                    let mobileName = jsonDict["data"]["mobileName"].stringValue
+                                    DispatchQueue.main.async(execute: {
+                                        SwiftProgressHUD.shared().showSuccess("免密登录成功,手机号:\(mobileName)")
+//                                        if let successPayBlock = self?.successPayBlock {
+                                            successPayBlock()
+//                                        }
+
+                                    })
+                                    NXLLog("免密登录成功,手机号:\(mobileName)")
+                                    return;
+                                }
+                            }
+                        }
+                        DispatchQueue.main.async(execute: {
+                            SwiftProgressHUD.shared().showError("免密登录失败:\(response.description)")
+//                            if let failPayBlock = self?.failPayBlock {
+                                failPayBlock()
+//                            }
+                        })
+                    })
+                }
+            }
+        }
+    }
+    
+}

+ 35 - 31
RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift

@@ -181,40 +181,44 @@ class UMManager: NSObject {
     func loginGetUserInfo(platformType: UMSocialPlatformType) {
         UMSocialManager.default().getUserInfo(with: platformType, currentViewController: nil) { result, error in
 
-            let resp = result as? UMSocialUserInfoResponse
+            if error != nil {
 
-            // 第三方登录数据(为空表示平台未提供)
-            // 授权数据
-            if let anUid = resp?.uid {
-                print(" uid: \(anUid)")
-            }
-            if let anOpenid = resp?.openid {
-                print(" openid: \(anOpenid)")
-            }
-            if let aToken = resp?.accessToken {
-                print(" accessToken: \(aToken)")
-            }
-            if let aToken = resp?.refreshToken {
-                print(" refreshToken: \(aToken)")
-            }
-            if let anExpiration = resp?.expiration {
-                print(" expiration: \(anExpiration)")
-            }
+            } else {
+                let resp = result as? UMSocialUserInfoResponse
 
-            // 用户数据
-            if let aName = resp?.name {
-                print(" name: \(aName)")
-            }
-            if let anIconurl = resp?.iconurl {
-                print(" iconurl: \(anIconurl)")
-            }
-            if let aGender = resp?.unionGender {
-                print(" gender: \(aGender)")
-            }
+                // 第三方登录数据(为空表示平台未提供)
+                // 授权数据
+                if let anUid = resp?.uid {
+                    NXLLog(" uid: \(anUid)")
+                }
+                if let anOpenid = resp?.openid {
+                    NXLLog(" openid: \(anOpenid)")
+                }
+                if let aToken = resp?.accessToken {
+                    NXLLog(" accessToken: \(aToken)")
+                }
+                if let aToken = resp?.refreshToken {
+                    NXLLog(" refreshToken: \(aToken)")
+                }
+                if let anExpiration = resp?.expiration {
+                    NXLLog(" expiration: \(anExpiration)")
+                }
 
-            // 第三方平台SDK原始数据
-            if let aResponse = resp?.originalResponse {
-                print(" originalResponse: \(aResponse)")
+                // 用户数据
+                if let aName = resp?.name {
+                    NXLLog(" name: \(aName)")
+                }
+                if let anIconurl = resp?.iconurl {
+                    NXLLog(" iconurl: \(anIconurl)")
+                }
+                if let aGender = resp?.unionGender {
+                    NXLLog(" gender: \(aGender)")
+                }
+
+                // 第三方平台SDK原始数据
+                if let aResponse = resp?.originalResponse {
+                    NXLLog(" originalResponse: \(aResponse)")
+                }
             }
         }
     }

+ 23 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/Dog.swift

@@ -0,0 +1,23 @@
+//
+//  Dog.swift
+//  RealmTest
+//
+//  Created by 南鑫林 on 2017/12/25.
+//  Copyright © 2017年 南鑫林. All rights reserved.
+//
+
+import Foundation
+import RealmSwift
+
+class Dog: Object {
+    @objc dynamic var id: Int = 0
+    @objc dynamic var name: String?
+    override static func primaryKey() -> String? {
+        return "id"
+    }
+    
+}
+
+class Cat: Object {
+    @objc dynamic var name: String?
+}

+ 37 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.swift

@@ -7,11 +7,48 @@
 //
 
 import UIKit
+import RxSwift
 
 class MineViewController: BaseViewController {
 
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        MobClick.beginLogPageView("MineViewController:我的页面")
+    }
+
+    override func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(animated)
+        MobClick.endLogPageView("MineViewController:我的页面")
+    }
+
+    private let disposeBag = DisposeBag()
+
     override func viewDidLoad() {
         super.viewDidLoad()
+        ShanYanManager.shared().preGetPhonenumber()
+    }
+
+
+    override func setupViews() {
+    }
+
+    override func setupLayouts() {
+    }
+
+    @IBAction func weixinLogin(_ sender: UIButton) {
+//        UMManager.shared().loginGetUserInfo(platformType: UMSocialPlatformType.sina)
+
+
+    }
+
+    @IBAction func UMSharedAction(_ sender: UIButton) {
+        UMManager.shared().UMSocialUI(shareType: ShareType.text, viewController: self, text: "test", thumbImage: "", shareImage: "", title: "", descr: "", webpageUrl: "")
+    }
+    @IBAction func OnceLogin(_ UIButton: Any) {
+        ShanYanManager.shared().quickAuthLogin(successPayBlock: {
+
+        }, failPayBlock: {
 
+        })
     }
 }

+ 35 - 4
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.xib

@@ -1,12 +1,16 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MineViewController" customModuleProvider="target">
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MineViewController" customModule="RainbowPlanet" customModuleProvider="target">
             <connections>
                 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
             </connections>
@@ -15,6 +19,33 @@
         <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
             <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4Kp-SH-yHy">
+                    <rect key="frame" x="135" y="124" width="62" height="30"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                    <state key="normal" title="微信登录"/>
+                    <connections>
+                        <action selector="weixinLogin:" destination="-1" eventType="touchUpInside" id="141-hl-LnN"/>
+                    </connections>
+                </button>
+                <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WQK-xB-nCF">
+                    <rect key="frame" x="135" y="178" width="62" height="30"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                    <state key="normal" title="友盟分享"/>
+                    <connections>
+                        <action selector="UMSharedAction:" destination="-1" eventType="touchUpInside" id="MIc-i4-atv"/>
+                    </connections>
+                </button>
+                <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iD1-wa-R3r">
+                    <rect key="frame" x="135" y="238" width="62" height="30"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                    <state key="normal" title="一键登录"/>
+                    <connections>
+                        <action selector="OnceLogin:" destination="-1" eventType="touchUpInside" id="YxS-OX-VMu"/>
+                        <action selector="UMSharedAction:" destination="-1" eventType="touchUpInside" id="YwI-Ji-B6B"/>
+                    </connections>
+                </button>
+            </subviews>
             <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
             <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
         </view>

+ 58 - 0
RainbowPlanet/RainbowPlanet/Service/RootModel/RootInfoModel.swift

@@ -0,0 +1,58 @@
+//
+//	RootInfoModel
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import SwiftyJSON
+
+
+class RootInfoModel : NSObject, NSCoding{
+
+	var info : String!
+
+
+	/**
+	 * Instantiate the instance using the passed json values to set the properties values
+	 */
+	init(fromJson json: JSON!){
+		if json.isEmpty{
+			return
+		}
+		info = json["info"].stringValue
+	}
+
+	/**
+	 * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
+	 */
+	func toDictionary() -> [String:Any]
+	{
+        var dictionary = [String:Any]()
+		if info != nil{
+			dictionary["info"] = info
+		}
+		return dictionary
+	}
+
+    /**
+    * NSCoding required initializer.
+    * Fills the data from the passed decoder
+    */
+    @objc required init(coder aDecoder: NSCoder)
+	{
+         info = aDecoder.decodeObject(forKey: "info") as? String
+
+	}
+
+    /**
+    * NSCoding required method.
+    * Encodes mode properties into the decoder
+    */
+    func encode(with aCoder: NSCoder)
+	{
+		if info != nil{
+			aCoder.encode(info, forKey: "info")
+		}
+
+	}
+
+}

+ 66 - 0
RainbowPlanet/RainbowPlanet/Service/RootModel/RootModel.swift

@@ -0,0 +1,66 @@
+//
+//	RootModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+import RealmSwift
+
+class RootModel : NSObject, NSCoding, Mappable{
+
+	var code : String?
+	var data : String?
+	var msg : String?
+	var type : String?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return RootModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		code <- map["code"]
+		data <- map["data"]
+		msg <- map["msg"]
+		type <- map["type"]
+		
+	}
+
+    /**
+    * NSCoding required initializer.
+    * Fills the data from the passed decoder
+    */
+    @objc required init(coder aDecoder: NSCoder)
+	{
+         code = aDecoder.decodeObject(forKey: "code") as? String
+         data = aDecoder.decodeObject(forKey: "data") as? String
+         msg = aDecoder.decodeObject(forKey: "msg") as? String
+         type = aDecoder.decodeObject(forKey: "type") as? String
+
+	}
+
+    /**
+    * NSCoding required method.
+    * Encodes mode properties into the decoder
+    */
+    @objc func encode(with aCoder: NSCoder)
+	{
+		if code != nil{
+			aCoder.encode(code, forKey: "code")
+		}
+		if data != nil{
+			aCoder.encode(data, forKey: "data")
+		}
+		if msg != nil{
+			aCoder.encode(msg, forKey: "msg")
+		}
+		if type != nil{
+			aCoder.encode(type, forKey: "type")
+		}
+
+	}
+
+}

+ 31 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/ApiMacro.swift

@@ -0,0 +1,31 @@
+//
+//  ApiMacro.swift
+//  CreaditPayment
+//
+//  Created by 南鑫林 on 2018/7/28.
+//  Copyright © 2018年 南鑫林. All rights reserved.
+//
+
+import Foundation
+
+let kDevelopSever = true
+let kTestSever = false
+let kProductSever = false
+
+// MARK: - 数据服务器
+func kApiDataPrefix() -> String {
+    if kDevelopSever /** 接口前缀-开发服务器*/ {
+        return "" //办公室地址公网IP
+    } else if kTestSever /** 接口前缀-测试服务器*/{
+        return ""
+    }else if kProductSever /** 接口前缀-生产服务器*/ {
+        return ""
+    }else {
+        return ""
+    }
+}
+// MARK: - 图片服务器
+let kApiPicPrefix = "http://app.jinhuayurun.com"
+
+// MARK: - 获取secret值
+let kSecretApi = "/secret.do"

+ 48 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkCacheModel.swift

@@ -0,0 +1,48 @@
+//
+//  SwiftMoyaNetWorkCacheModel.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/3/9.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+import RealmSwift
+
+class SwiftMoyaNetWorkCacheModel: Object{
+
+    @objc dynamic var data: String!
+    @objc dynamic var path: String!
+
+
+    /**
+     * Instantiate the instance using the passed dictionary values to set the properties values
+     */
+    class func fromDictionary(dictionary: [String:Any]) -> SwiftMoyaNetWorkCacheModel  {
+        let this = SwiftMoyaNetWorkCacheModel()
+        if let dataValue = dictionary["data"] as? String{
+            this.data = dataValue
+        }
+        if let pathValue = dictionary["path"] as? String{
+            this.path = pathValue
+        }
+        return this
+    }
+
+    /**
+     * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
+     */
+    func toDictionary() -> [String:Any]
+    {
+        var dictionary = [String:Any]()
+        if data != nil{
+            dictionary["data"] = data
+        }
+        if path != nil{
+            dictionary["path"] = path
+        }
+        return dictionary
+    }
+
+
+}

+ 266 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager.swift

@@ -0,0 +1,266 @@
+//
+//  SwiftMoyaNetWorkManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2018/8/7.
+//  Copyright © 2018年 南鑫林. All rights reserved.
+//
+
+import Foundation
+import Alamofire
+import Moya
+import SwiftyJSON
+import ObjectMapper
+import RxAtomic
+import RxSwift
+import RxCocoa
+import RealmSwift
+/// 超时时长
+private var requestTimeOut:Double = 20
+
+///网络请求的基本设置,这里可以拿到是具体的哪个网络请求,可以在这里做一些设置
+private let myEndpointClosure = { (target: MultiTarget) -> Endpoint in
+    ///这里把endpoint重新构造一遍主要为了解决网络请求地址里面含有? 时无法解析的bug https://github.com/Moya/Moya/issues/1198
+    let url = target.baseURL.absoluteString + target.path
+    var task = target.task
+    /*
+     👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
+     如果需要在每个请求中都添加类似token参数的参数请取消注释上面代码
+     */
+    var endpoint = Endpoint(
+        url: url,
+        sampleResponseClosure: { .networkResponse(200, target.sampleData) },
+        method: target.method,
+        task: task,
+        httpHeaderFields: target.headers
+    )
+    requestTimeOut = 20//每次请求都会调用endpointClosure 到这里设置超时时长 也可单独每个接口设置
+    
+    return endpoint
+}
+
+///网络请求的设置
+private let requestClosure = { (endpoint: Endpoint, done: MoyaProvider.RequestResultClosure) in
+    do {
+        var request = try endpoint.urlRequest()
+        //设置请求时长
+        request.timeoutInterval = requestTimeOut
+        // 打印请求参数
+        if let requestData = request.httpBody {
+            NXLLog("\n"+"请求地址="+"\(request.url!)"+"\n"+"请求方式"+"\(request.httpMethod ?? "")"+"\n"+"发送参数="+"\(String(data: request.httpBody!, encoding: String.Encoding.utf8) ?? "")")
+        }else{
+            NXLLog("\n"+"请求地址="+"\(request.url!)"+"\n"+"请求方式"+"=\(String(describing: request.httpMethod!))")
+        }
+        done(.success(request))
+    } catch {
+        done(.failure(MoyaError.underlying(error, nil)))
+    }
+}
+
+/// NetworkActivityPlugin插件用来监听网络请求,界面上做相应的展示
+///但这里我没怎么用这个。。。 loading的逻辑直接放在网络处理里面了
+private let networkPlugin = NetworkActivityPlugin.init { (changeType, targetType) in
+    print("networkPlugin \(changeType)")
+    //targetType 是当前请求的基本信息
+    switch(changeType){
+    case .began:
+        DispatchQueue.main.async(execute: { () -> Void in
+            UIApplication.shared.isNetworkActivityIndicatorVisible = true
+        })
+        NXLLog("==================================================================");
+    case .ended:
+        DispatchQueue.main.async(execute: { () -> Void in
+            UIApplication.shared.isNetworkActivityIndicatorVisible = false
+        })
+        NXLLog("==================================================================");
+    }
+}
+
+private let provider = MoyaProvider<MultiTarget>(endpointClosure: myEndpointClosure, requestClosure: requestClosure, plugins: [networkPlugin], trackInflights: false)
+
+/// 基于Alamofire,网络是否连接,,这个方法不建议放到这个类中,可以放在全局的工具类中判断网络链接情况
+/// 用get方法是因为这样才会在获取isNetworkConnect时实时判断网络链接请求,如有更好的方法可以fork
+private var isNetworkConnect: Bool {
+    get{
+        let network = NetworkReachabilityManager()
+        return network?.isReachable ?? true //无返回就默认网络已连接
+    }
+}
+
+
+class SwiftMoyaNetWorkManager: NSObject {
+
+    private let disposeBag = DisposeBag()
+    private var dataBaseName : String = "RainbowPlanet"
+
+
+    private static let _sharedInstance = SwiftMoyaNetWorkManager()
+    private override init() {} // 私有化init方法
+    /// 获取单例
+    ///
+    /// - Returns: SwiftMoyaNetWorkManager对象
+    class func shared() -> SwiftMoyaNetWorkManager {
+        return _sharedInstance
+    }
+
+    /// 成功回调
+    typealias successCallback = (_ data: Any) -> Void
+
+    typealias falseCallback = () -> Void
+    var falseCallback : falseCallback?
+
+    // MARK: - 网络请求
+    /// 网络请求
+    ///
+    /// - Parameters:
+    ///   - target: 请求地址加参数
+    ///   - completion: 请求成功回调
+    func request(target: MultiTarget,isCache:Bool = false,completion: @escaping successCallback) -> Void {
+        //判断是否链接网络
+        if !isNetworkConnect{
+             SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
+            return
+        }
+
+        //获取缓存
+        if isCache {
+            getIsCache(target: target, isCache: isCache, completion: completion)
+        }
+
+        provider.rx
+            .request(target)
+            .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
+            .observeOn(MainScheduler.instance)
+            .subscribe(onSuccess: {
+                [weak self] (response) in
+                self?.getResponseStatusCode(response: response, completion: {[weak self] (data) in
+                    completion(data)
+                    //设置缓存
+                    self?.setIsCache(target: target,isCache: isCache)
+
+                })
+            }) {
+                [weak self] (error) in
+                if let falseCallback = self?.falseCallback  {
+                    falseCallback()
+                }
+                SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
+            }
+            .disposed(by: disposeBag)
+    }
+
+    // MARK: - 获取状态码
+    /// 获取状态码
+    ///
+    /// - Parameters:
+    ///   - response: 响应结果
+    ///   - completion: 回调
+    private func getResponseStatusCode(response:Response, completion: @escaping successCallback) -> Void {
+        let json = try? JSON(response.mapJSON())
+        if json != nil {
+            NXLLog("\nstatusCode=\(response.statusCode)\njson未解密=\n\(json!.description)");
+        }
+        if response.statusCode == 200 {
+            let  json = JSON(parseJSON: json!.description)
+            let rootModel = RootModel(JSONString: json.description)
+            NXLLog("\njson=\n\(rootModel!.toJSONString()!)");
+            completion(rootModel as Any)
+            
+        } else if response.statusCode == 401 { //需要给出提示跳转到首页刷新数据 需要发送一个通知
+            let infoModel = RootInfoModel(fromJson: json)
+            SwiftProgressHUD.shared().showError(infoModel.info!)
+        } else if response.statusCode == 503 ||  response.statusCode == 403 || response.statusCode == 201 {
+            if self.falseCallback != nil {
+                self.falseCallback!()
+            }
+            let infoModel = RootInfoModel(fromJson: json)
+            SwiftProgressHUD.shared().showError(infoModel.info!)
+        } else {
+            if self.falseCallback != nil {
+                self.falseCallback!()
+            }
+            NXLLog("\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
+            SwiftProgressHUD.shared().showError(response.description)
+        }
+    }
+
+
+    /// 添加缓存
+    ///
+    /// - Parameters:
+    ///   - target: 路径
+    ///   - isCache: 缓存
+    func setIsCache(target: MultiTarget,isCache:Bool) {
+        if isCache {
+            Rx_RealmUtillit.creatDB(self.dataBaseName).subscribe().disposed(by: disposeBag)
+            var dic = Dictionary<String, Any>()
+            dic.updateValue(target.target.path, forKey: "path")
+            dic.updateValue(target.target.path, forKey: "data")
+            let cacheModel = SwiftMoyaNetWorkCacheModel.init(value: dic)
+
+            Rx_RealmUtillit.getDefaultRealm().subscribe(onNext: { (realm) in
+                mPrint("realmPath:", realm?.configuration.fileURL as Any)
+
+            }).disposed(by: disposeBag)
+
+            Rx_RealmUtillit.getObject(type: SwiftMoyaNetWorkCacheModel.self, filter: "path = '\(target.target.path)'").subscribe(onNext: {[weak self] (objects) in
+
+                if objects!.count > 0 {
+                    Rx_RealmUtillit.updateObject(SwiftMoyaNetWorkCacheModel.self, value: dic, update: true).subscribe(onNext: { (error) in
+
+                    }).disposed(by: (self?.disposeBag)!)
+
+                } else {
+                    Rx_RealmUtillit.addObject(cacheModel).subscribe(onNext: { (error) in
+
+                    }).disposed(by: (self?.disposeBag)!)
+                }
+            }).disposed(by: disposeBag)
+        }
+    }
+
+    func getIsCache(target: MultiTarget,isCache:Bool,completion: @escaping successCallback) {
+        if isCache {
+            Rx_RealmUtillit.openReferenceDB(self.dataBaseName).subscribe().disposed(by: disposeBag)
+
+            Rx_RealmUtillit.getDefaultRealm().subscribe(onNext: { (realm) in
+                mPrint("realmPath:", realm?.configuration.fileURL as Any)
+
+            }).disposed(by: disposeBag)
+
+            Rx_RealmUtillit.getObject(type: SwiftMoyaNetWorkCacheModel.self, filter: "path = '\(target.target.path)'").subscribe(onNext: { (objects) in
+                if objects!.count > 0 {
+                    //TODO: 需要处理的
+                    completion("")
+                }
+            }).disposed(by: disposeBag)
+        }
+    }
+
+
+    // MARK: - 取消所有请求
+    /// 取消所有请求
+    func cancelAllRequest() {
+        provider.manager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
+            dataTasks.forEach { $0.cancel() }
+            uploadTasks.forEach { $0.cancel() }
+            downloadTasks.forEach { $0.cancel() }
+        }
+    }
+
+    // MARK: - 取消指定请求
+    /// 取消指定请求
+    ///
+    /// - Parameter url: 指定的网络请求地址
+    func cancelDesignationRequest(url:String) {
+        provider.manager.session.getTasksWithCompletionHandler {
+            (sessionDataTask, uploadData, downloadData) in
+            sessionDataTask.forEach {
+                //只取消指定url的请求
+                if ($0.originalRequest?.url?.absoluteString == url) {
+                    $0.cancel()
+                }
+            }
+        }
+    }
+}

+ 27 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkService.swift

@@ -0,0 +1,27 @@
+//
+//  SwiftMoyaNetWorkService.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2018/11/8.
+//  Copyright © 2018 南鑫林. All rights reserved.
+//
+
+import UIKit
+import Moya
+import SwiftyJSON
+import ObjectMapper
+
+class SwiftMoyaNetWorkService: NSObject {
+
+    private static let sharedInstance = SwiftMoyaNetWorkService()
+
+    private override init() {} // 私有化init方法
+
+    class func shared() -> SwiftMoyaNetWorkService {
+        return sharedInstance
+    }
+
+    /// 数据回调
+    typealias apiCallBack = (Any) -> (Void)
+    
+}

+ 76 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceAPI.swift

@@ -0,0 +1,76 @@
+//
+//  SwiftMoyaService.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2018/8/7.
+//  Copyright © 2018年 南鑫林. All rights reserved.
+//
+
+import Foundation
+import Moya
+
+//请求分类
+public enum SwiftMoyaServiceAPI {
+    case secret //获取secret值
+}
+
+///请求配置
+extension SwiftMoyaServiceAPI: TargetType {
+    // MARK: - 服务器地址
+    public var baseURL: URL {
+        switch self {
+        case
+        //获取secret值
+        .secret
+        :
+            return URL(string: kApiDataPrefix())!
+        }
+    }
+
+    // MARK: - 各个请求的具体路径
+    public var path: String {
+        switch self {
+        /// 获取secret值
+        case .secret:
+            return kSecretApi
+        }
+    }
+
+    // MARK: - 请求类型
+    public var method: Moya.Method {
+        switch self {
+        case
+        //获取secret值
+        .secret
+        :
+            return .get
+        }
+    }
+
+    // MARK: - 请求任务事件(这里附带上参数)
+    public var task: Task {
+        switch self {
+        case
+        .secret
+        :
+            return .requestPlain
+        }
+    }
+    
+
+    // MARK: - 是否执行Alamofire验证
+    public var validate: Bool {
+        return false
+    }
+    
+    // MARK: - 这个就是做单元测试模拟的数据,只会在单元测试文件中有作用
+    public var sampleData: Data {
+        return "{}".data(using: String.Encoding.utf8)!
+    }
+
+    // MARK: - 请求头
+    public var headers: [String : String]? {
+        //同task,具体选择看后台 有application/x-www-form-urlencoded 、application/json
+        return ["Content-Type":"application/x-www-form-urlencoded"]
+    }
+}

+ 158 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Info.plist

@@ -18,10 +18,168 @@
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
 	<string>1.0</string>
+	<key>CFBundleURLTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>CFBundleURLName</key>
+			<string>weibo</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>wb2824278574</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>CFBundleURLName</key>
+			<string>tencent</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>tencent1105803948</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>CFBundleURLName</key>
+			<string>QQ</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>QQ41e93aac</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>CFBundleURLName</key>
+			<string>weixin</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>wx647d93490caf548f</string>
+			</array>
+		</dict>
+	</array>
 	<key>CFBundleVersion</key>
 	<string>1</string>
+	<key>LSApplicationQueriesSchemes</key>
+	<array>
+		<string>wechat</string>
+		<string>weixin</string>
+		<string>sinaweibohd</string>
+		<string>sinaweibo</string>
+		<string>sinaweibosso</string>
+		<string>weibosdk</string>
+		<string>weibosdk2.5</string>
+		<string>mqqapi</string>
+		<string>mqq</string>
+		<string>mqqOpensdkSSoLogin</string>
+		<string>mqqconnect</string>
+		<string>mqqopensdkdataline</string>
+		<string>mqqopensdkgrouptribeshare</string>
+		<string>mqqopensdkfriend</string>
+		<string>mqqopensdkapi</string>
+		<string>mqqopensdkapiV2</string>
+		<string>mqqopensdkapiV3</string>
+		<string>mqqopensdkapiV4</string>
+		<string>mqzoneopensdk</string>
+		<string>wtloginmqq</string>
+		<string>wtloginmqq2</string>
+		<string>mqqwpa</string>
+		<string>mqzone</string>
+		<string>mqzonev2</string>
+		<string>mqzoneshare</string>
+		<string>wtloginqzone</string>
+		<string>mqzonewx</string>
+		<string>mqzoneopensdkapiV2</string>
+		<string>mqzoneopensdkapi19</string>
+		<string>mqzoneopensdkapi</string>
+		<string>mqqbrowser</string>
+		<string>mttbrowser</string>
+		<string>tim</string>
+		<string>timapi</string>
+		<string>timopensdkfriend</string>
+		<string>timwpa</string>
+		<string>timgamebindinggroup</string>
+		<string>timapiwallet</string>
+		<string>timOpensdkSSoLogin</string>
+		<string>wtlogintim</string>
+		<string>timopensdkgrouptribeshare</string>
+		<string>timopensdkapiV4</string>
+		<string>timgamebindinggroup</string>
+		<string>timopensdkdataline</string>
+		<string>wtlogintimV1</string>
+		<string>timapiV1</string>
+		<string>alipay</string>
+		<string>alipayshare</string>
+	</array>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+		<key>NSExceptionDomains</key>
+		<dict>
+			<key>sina.cn</key>
+			<dict>
+				<key>NSExceptionMinimumTLSVersion</key>
+				<string>TLSv1.0</string>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+			<key>sina.com.cn</key>
+			<dict>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+			<key>sinaimg.cn</key>
+			<dict>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+			<key>sinajs.cn</key>
+			<dict>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+			<key>weibo.cn</key>
+			<dict>
+				<key>NSExceptionMinimumTLSVersion</key>
+				<string>TLSv1.0</string>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+			<key>weibo.com</key>
+			<dict>
+				<key>NSExceptionMinimumTLSVersion</key>
+				<string>TLSv1.0</string>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+				<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+				<false/>
+			</dict>
+		</dict>
+	</dict>
 	<key>UIRequiredDeviceCapabilities</key>
 	<array>
 		<string>armv7</string>

+ 26 - 0
RainbowPlanet/RainbowPlanet/Tools/RealmUtility/ExtensionMethod.swift

@@ -0,0 +1,26 @@
+//
+//  ExtensionMethod.swift
+//  RealmTest
+//
+//  Created by 南鑫林 on 2017/12/15.
+//  Copyright © 2017年 南鑫林. All rights reserved.
+//
+
+import Foundation
+
+
+/// 创建数据库的名字
+///
+/// - db: db
+public enum dataBaseName: String {
+    case db = "db"
+}
+
+/// 在run debug的状态打印所需要的信息
+///
+/// - Parameter items: 所要打印的内容
+public func mPrint(_ items: Any...) {
+    #if DEBUG
+    debugPrint(items)
+    #endif
+}

+ 417 - 0
RainbowPlanet/RainbowPlanet/Tools/RealmUtility/RealmUtility.swift

@@ -0,0 +1,417 @@
+//
+//  RealmUtility.swift
+//  RealmTest
+//
+//  Created by 南鑫林 on 2017/12/13.
+//  Copyright © 2017年 南鑫林. All rights reserved.
+//  Realm数据库单例工具
+
+import Foundation
+import RealmSwift
+
+class RealmUtility: NSObject {
+    
+    //MARK: - 单例实例
+    /// 获取RealmUtility的实例
+    static var `default`: RealmUtility  = RealmUtility()
+    private override init() {
+        super.init()
+    }
+    
+    //MARK: - 创建数据库
+    /// 创建数据库
+    ///
+    /// - Parameters:
+    ///   - dataBaseName: 数据库名字
+    ///   - isReadOnly: 是否是只读
+    /// - Returns: Realm实例
+    @discardableResult
+    public func creatDB(_ dataBaseName: String, isReadOnly: Bool = false) -> Realm? {
+        let realm = openDB(dataBaseName, isReadOnly: isReadOnly)
+        return realm
+    }
+    
+    /// 打开数据库
+    ///
+    /// - Parameter name: 数据库名字
+    /// - isReadOnly: 是否是只读
+    /// - Returns: Realm实例
+    @discardableResult
+    private func openDB(_ dataBaseName: String, isReadOnly: Bool = false) -> Realm? {
+        guard let dbPath = getCreatDatabasePath(dataBaseName) else {
+            return nil
+        }
+        var config = Realm.Configuration()
+        config.fileURL = dbPath
+        config.readOnly = isReadOnly
+        Realm.Configuration.defaultConfiguration = config
+        do {
+            let realm = try Realm.init(configuration: config)
+            return realm
+        }catch let error {
+            mPrint("打开或者创建数据库失败:\n\(error.localizedDescription)")
+            return nil
+        }
+    }
+    
+    
+    /// 设置通过Realm()获取数据库的配置
+    ///
+    /// - Parameters:
+    ///   - realmName: 数据库的名字
+    ///   - isReadOnly: 是否是这是只读
+    public func setDefaltRealmConfiguration(_ realmName: String,isReference: Bool = false, isReadOnly: Bool = false) -> Bool{
+        var realmPath: URL?
+        if isReference {
+            realmPath = getReferenceDatabasePaeh(realmName)
+        }else {
+            realmPath = getCreatDatabasePath(realmName)
+        }
+        if realmPath == nil {
+            return false
+        }
+        var config = Realm.Configuration()
+        config.fileURL = realmPath
+        config.readOnly = isReadOnly
+        Realm.Configuration.defaultConfiguration = config
+        return true
+    }
+    
+    /// 打开预植的数据库
+    ///
+    /// - Parameters:
+    ///   - dataBaseName: 数据库名字
+    ///   - isReadOnly: 是否是只读
+    /// - Returns: Realm实例
+    @discardableResult
+    public func openReferenceDB(_ dataBaseName: String, isReadOnly: Bool = true) -> Realm? {
+        guard let dbPath = getReferenceDatabasePaeh(dataBaseName) else {
+            return nil
+        }
+        var config = Realm.Configuration()
+        config.fileURL = dbPath
+        config.readOnly = isReadOnly
+        Realm.Configuration.defaultConfiguration = config
+        do {
+            let realm = try Realm.init(configuration: config)
+            return realm
+        }catch let error {
+            mPrint("打开或者创建数据库失败:\n\(error.localizedDescription)")
+            return nil
+        }
+    }
+    
+    /// 获取当前默认的数据
+    ///
+    /// - Returns: 返回默认的Realm的数据库实例
+    @discardableResult
+    public func getDefaultRealm() -> Realm? {
+        do {
+            return try Realm()
+        }catch let error {
+            mPrint("获取默认的Realm的数据库失败:\n\(error.localizedDescription)")
+            return nil
+        }
+    }
+    
+    //MARK: - 增
+    /// 创建表 || 更新表
+    ///
+    /// - Parameters:
+    ///   - type: 表向对应的对象
+    ///   - value: 值
+    ///   - update: 是否是更新, 如果是"true", Realm会查找对象并更新它, 否则添加对象
+    ///   - result: 最后添加对象是成功, 如果成功将对象返回
+    public func creatObject(_ type: RealmSwift.Object.Type, value: Any? = nil, update: Bool = false, result: ((RealmSwift.Object?, Error?) -> Void)? = nil){
+        let realm = getDefaultRealm()
+        do {
+            try realm?.write {
+                let object = (value == nil) ? realm?.create(type) : realm?.create(type, value: value!, update: update)
+                result?(object, nil)
+            }
+        } catch let error {
+            mPrint("获取默认的Realm的数据库失败:\n\(error.localizedDescription)")
+            result?(nil, error)
+        }
+    }
+    
+   
+    /// 添加数据 || 根据主键更新数据
+    ///
+    /// - Parameters:
+    ///   - object: 要添加的数据
+    ///   - update: 是否更新, 如果是true
+    ///   - result: 添加数据的状态
+    public func addObject(_ object: RealmSwift.Object, update: Bool = false, result: ((Error?) -> Void)? = nil) {
+        let realm = getDefaultRealm()
+        do {
+            try realm?.write {
+                realm?.add(object, update: update)
+                result?(nil)
+            }
+        } catch let error {
+            mPrint("添加数据失败:\n \(error.localizedDescription)")
+            result?(error)
+        }
+    }
+    
+    //MARK: - 删
+    /// 删除数据
+    ///
+    /// - Parameters:
+    ///   - object: 要删除的对象
+    ///   - result: 删除的状态
+    public func deleteObject(_ object: RealmSwift.Object, result: ((Error?) -> Void)? = nil) {
+        let realm = getDefaultRealm()
+        do {
+            try realm?.write {
+                realm?.delete(object)
+                result?(nil)
+            }
+        } catch let error {
+            mPrint("添加数据失败:\n \(error.localizedDescription)")
+            result?(error)
+        }
+    }
+    
+    
+    /// 删除当前数据库中所有的数据
+    ///
+    /// - Parameter result: 删除的状态
+    public func deleteAllObject(result: ((Error?) -> Void)? = nil) {
+        let realm = getDefaultRealm()
+        do {
+            try realm?.write {
+                realm?.deleteAll()
+                result?(nil)
+            }
+        } catch let error {
+            mPrint("添加数据失败:\n \(error.localizedDescription)")
+            result?(error)
+        }
+    }
+    
+    /// 删除当前打开的数据库
+    ///
+    /// - Parameter dataBaseName: 数据库的名字
+    /// - Returns: 删除的状态
+    @discardableResult
+    public func deleteCreatDBFile() -> Bool {
+       return  autoreleasepool { () -> Bool in
+            let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
+            let realmURLs = [
+                realmURL,
+                realmURL.appendingPathExtension("lock"),
+                realmURL.appendingPathExtension("note"),
+                realmURL.appendingPathExtension("management")
+            ]
+            for URL in realmURLs {
+                do {
+                    try FileManager.default.removeItem(at: URL)
+                    return true
+                } catch {
+                    // 错误处理
+                    return false
+                }
+            }
+            return false
+        }
+    }
+    
+    //MARK: - 改
+    /// 根据主键进行更新
+    ///
+    /// - Parameters:
+    ///   - object: 要更新的对象
+    ///   - update: 是否根据主键更新, 如果是"false"则是添加数据
+    ///   - result: 更新数据的结果
+    public func updateObject(_ object: RealmSwift.Object, update: Bool = true, result: ((Error?) -> Void)? = nil) {
+        addObject(object, update: update, result: result)
+    }
+    
+    
+    /// 根据主键进行更新
+    ///
+    /// - Parameters:
+    ///   - type: 要更新的对象类型
+    ///   - value: 要更新的值, 例如: ["id": 1, "price": 9000.0]
+    ///   - update: 是否根据主键进行更新, 如果为"false"则为创建表
+    ///   - result: 更新的结果
+    public func updateObject(_ type: RealmSwift.Object.Type, value: Any? = nil, update: Bool = true, result: ((RealmSwift.Object?, Error?) -> Void)? = nil) {
+        creatObject(type, value: value, update: update, result: result)
+    }
+    
+    
+    /// 直接更新对象
+    ///
+    /// - Parameters:
+    ///   - property: 要更改的属性
+    ///   - value: 更改的值
+    /// - Returns: 更改的结果
+    @discardableResult
+    public func updateObject( property: inout Any, value: Any) -> Bool {
+        let realm = getDefaultRealm()
+        do {
+            try realm?.write {
+                 property = value
+            }
+            return true
+        } catch let error {
+            mPrint("直接更新对象属性错误: \(error.localizedDescription)")
+            return false
+        }
+    }
+    
+    
+    /// 更改表中所有的字段的值
+    ///
+    /// - Parameters:
+    ///   - type: 表的对象类型
+    ///   - key: 要更改的字段名
+    ///   - value: 更改的值
+    /// - Returns: 返回更改结果
+    public func updateObjects(type: RealmSwift.Object.Type, key: String, value: Any) -> Bool {
+        let objects = getObjects(type: type)
+        do {
+            try getDefaultRealm()?.write {
+                objects?.setValue(value, forKeyPath: key)
+            }
+            return true
+        } catch let error {
+            mPrint("更改一个表中的所有数据错误: \(error.localizedDescription)")
+            return false
+        }
+    }
+    
+    
+    /// 根据主键进行对某个对象中的数据进行更新
+    ///
+    /// - Parameters:
+    ///   - type: 表类型
+    ///   - primaryKey: 主键
+    ///   - key: 要更改属性
+    ///   - value: 更改的值
+    /// - Returns: 更改的状态
+    public func updateObject(type: RealmSwift.Object.Type, primaryKey: Any, key: String, value: Any) -> Bool {
+        let object = getObjectWithPrimaryKey(type: type, primaryKey: primaryKey)
+        do {
+            try getDefaultRealm()?.write {
+                object?.setValue(value, forKeyPath: key)
+            }
+            return true
+        } catch let error {
+            mPrint("更新数据出错: \(error.localizedDescription)")
+            return false
+        }
+    }
+    
+    //MARK: - 查
+    /// 查找一个表中的所有的数据
+    ///
+    /// - Parameter type: 对象类型
+    /// - Returns: 查到的数据
+    public func getObjects(type: RealmSwift.Object.Type) -> RealmSwift.Results<RealmSwift.Object>?{
+         return getDefaultRealm()?.objects(type)
+    }
+    
+    /// 根据主键查找某个对象
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - primaryKey: 主键
+    /// - Returns: 查到的数据
+    public func getObjectWithPrimaryKey(type: RealmSwift.Object.Type, primaryKey: Any) -> RealmSwift.Object? {
+        return getDefaultRealm()?.object(ofType: type, forPrimaryKey: primaryKey)
+    }
+    
+    
+    /// 使用断言字符串查询
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - filter: 过滤条件
+    /// - Returns: 查询到的数据
+    /// - example:
+    ///   - var tanDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'")
+    public func getObject(type: RealmSwift.Object.Type, filter: String) -> RealmSwift.Results<RealmSwift.Object>? {
+        return getObjects(type: type)?.filter(filter)
+    }
+    
+    
+    /// 使用谓词进行查询
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - predicate: 谓词对象
+    /// - Returns: 查询到的数据
+    /// - example:
+    ///   - let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "tan", "B")
+    ///   - tanDogs = realm.objects(Dog.self).filter(predicate)
+    public func getObject(type: RealmSwift.Object.Type, predicate: NSPredicate) -> RealmSwift.Results<RealmSwift.Object>? {
+        return getObjects(type: type)?.filter(predicate)
+    }
+
+
+    /// 对查询的数据进行排序,请注意, 不支持 将多个属性用作排序基准,此外也无法链式排序(只有最后一个 sorted 调用会被使用)。 如果要对多个属性进行排序,请使用 sorted(by:) 方法,然后向其中输入多个 SortDescriptor 对象。
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - filter: 过滤条件
+    ///   - sortedKey: 需要排序的字段
+    /// - Returns: 最后的结果
+    public func getObject(type: RealmSwift.Object.Type, filter: String, sortedKey: String) -> RealmSwift.Results<RealmSwift.Object>? {
+        return getObject(type: type, filter: filter)?.sorted(byKeyPath: sortedKey)
+    }
+    
+    
+    /// 对查询的数据进行排序, 请注意, 不支持 将多个属性用作排序基准,此外也无法链式排序(只有最后一个 sorted 调用会被使用)。 如果要对多个属性进行排序,请使用 sorted(by:) 方法,然后向其中输入多个 SortDescriptor 对象。
+    ///
+    /// - Parameters:
+    ///   - type: 队形类型
+    ///   - predicate: 谓词对象
+    ///   - sortedKey: 排序的字段
+    /// - Returns: 排序后的数据
+    public func getObject(type: RealmSwift.Object.Type, predicate: NSPredicate, sortedKey: String) -> RealmSwift.Results<RealmSwift.Object>? {
+        return getObject(type: type, predicate: predicate)?.sorted(byKeyPath: sortedKey)
+    }
+    
+    
+}
+
+extension RealmUtility {
+    /// 在创建数据库的时候要保存的数据库路径, 保存在caches 文件中
+    ///
+    /// - Paramter fileName: 数据库名字
+    /// - Returns: 数据库保存的路径
+    private func getCreatDatabasePath(_ fileName: String) -> URL? {
+        let cachesPaeh = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first
+        guard var filePath = cachesPaeh else {
+            return nil
+        }
+        filePath = filePath + "/DB/\(fileName)"
+        
+        do {
+            if !FileManager.default.fileExists(atPath: filePath) {
+                try FileManager.default.createDirectory(atPath: filePath, withIntermediateDirectories: true, attributes: nil)
+            }
+        }catch let error {
+            mPrint("创建数据库文件夹:\(error.localizedDescription)")
+            return nil
+        }
+        let path = filePath + "/\(fileName).realm"
+        mPrint(path)
+        return URL.init(string: path)
+    }
+    
+    
+    /// 获取引用的数据的路径
+    ///
+    /// - Parameter fileName: 数据库的名字
+    /// - Returns: 本地引用的数据库的路径
+    private func getReferenceDatabasePaeh(_ fileName: String) -> URL? {
+        let path = Bundle.main.path(forResource: fileName, ofType: "realm")
+        let url = path != nil ? URL.init(string: path!) : nil
+        return url
+    }
+    
+}

+ 352 - 0
RainbowPlanet/RainbowPlanet/Tools/RealmUtility/Rx_RealmUtillit.swift

@@ -0,0 +1,352 @@
+//
+//  Rx_RealmUtillit.swift
+//  RealmTest
+//
+//  Created by 南鑫林 on 2017/12/25.
+//  Copyright © 2017年 南鑫林. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+import RealmSwift
+class Rx_RealmUtillit: NSObject {
+    //MARK: - 创建数据库
+    /// 创建数据库
+    ///
+    /// - Parameters:
+    ///   - dataBaseName: 数据库名字
+    ///   - isReadOnly: 是否是只读
+    /// - Returns: Realm消息
+    @discardableResult
+    class func creatDB(_ dataBaseName: String, isReadOnly: Bool = false) -> Observable<Realm?> {
+        return Observable.create({ (observable) -> Disposable in
+            let realm = RealmUtility.default.creatDB(dataBaseName, isReadOnly: isReadOnly)
+            observable.onNext(realm)
+            return Disposables.create ()
+        })
+    }
+    
+    
+    /// 设置默认数据库配置
+    ///
+    /// - Parameters:
+    ///   - realmName: 数据库名字
+    ///   - isReference: 是否是引用数据库
+    ///   - isReadOnly: 是否是只读
+    /// - Returns: 结果
+    @discardableResult
+    class func setDefaltRealmConfiguration(_ realmName: String,isReference: Bool = false, isReadOnly: Bool = false) -> Observable<Bool> {
+        return Observable.create({ (observable) -> Disposable in
+            let isSuccess = RealmUtility.default.setDefaltRealmConfiguration(realmName, isReference: isReference, isReadOnly: isReadOnly)
+            observable.onNext(isSuccess)
+            return Disposables.create()
+        })
+    }
+    
+    /// 打开预植的数据库
+    ///
+    /// - Parameters:
+    ///   - dataBaseName: 数据库名字
+    ///   - isReadOnly: 是否是只读
+    /// - Returns: Realm实例
+    @discardableResult
+    class func openReferenceDB(_ dataBaseName: String, isReadOnly: Bool = true) -> Observable<Realm?> {
+        return Observable.create({ (observable) -> Disposable in
+            let realm = RealmUtility.default.openReferenceDB(dataBaseName, isReadOnly: isReadOnly)
+            observable.onNext(realm)
+            return Disposables.create {
+                
+            }
+        })
+    }
+    
+    /// 获取当前默认的数据
+    ///
+    /// - Returns: 返回默认的Realm的数据库实例
+    @discardableResult
+    class func getDefaultRealm() -> Observable<Realm?>  {
+        return Observable.create({ (observable) -> Disposable in
+            let realm = RealmUtility.default.getDefaultRealm()
+            observable.onNext(realm)
+            return Disposables.create {
+                
+            }
+        })
+    }
+    
+    //MARK: - 增
+    /// 创建表 || 更新表
+    ///
+    /// - Parameters:
+    ///   - type: 表向对应的对象
+    ///   - value: 值
+    ///   - update: 是否是更新, 如果是"true", Realm会查找对象并更新它, 否则添加对象
+    /// - Returns: 创建的对象或者更新过后的对象
+    @discardableResult
+    class func creatObject(_ type: RealmSwift.Object.Type, value: Any? = nil, update: Bool = false) -> Observable<(RealmSwift.Object?, Error?)>{
+        return Observable.create { (observable) -> Disposable in
+            RealmUtility.default.creatObject(type, value: value, update: update, result: { (object, error) in
+                observable.onNext((object, error))
+            })
+            return Disposables.create {
+                
+            }
+        }
+    }
+    
+    /// 添加数据 || 根据主键更新数据
+    ///
+    /// - Parameters:
+    ///   - object: 要添加的数据
+    ///   - update: 是否更新, 如果是true
+    /// - Returns: 添加数据是否成功, error为空则成功, 不为空则失败
+    class func addObject(_ object: RealmSwift.Object, update: Bool = false) -> Observable<Error?> {
+        return Observable.create({ (observable) -> Disposable in
+            RealmUtility.default.addObject(object, update: update, result: { (error) in
+                observable.onNext(error)
+            })
+            return Disposables.create {
+                
+            }
+        })
+    }
+    
+    //MARK: - 删
+    /// 删除数据
+    ///
+    /// - Parameters:
+    ///   - object: 要删除的对象
+    /// - Returns: 删除数据是否成功, error为空则成功, 不为空则失败
+    class func deleteObject(_ object: RealmSwift.Object) -> Observable<Error?> {
+        return Observable.create({ (observable) -> Disposable in
+            RealmUtility.default.deleteObject(object, result: { (error) in
+                observable.onNext(error)
+            })
+            return Disposables.create {
+                
+            }
+        })
+    }
+    
+    /// 删除当前数据库中所有的数据
+    ///
+    /// - Returns: 添加数据库中的所有数据是否成功, error为空则成功, 不为空则失败
+    @discardableResult
+    class func deleteAllObject() -> Observable<Error?> {
+        return Observable.create({ (observable) -> Disposable in
+            RealmUtility.default.deleteAllObject(result: { (error) in
+                observable.onNext(error)
+            })
+            return Disposables.create {
+                
+            }
+        })
+    }
+    
+    /// 删除当前打开的数据库
+    ///
+    /// - Parameter dataBaseName: 数据库的名字
+    /// - Returns: 删除当前打开的数据是否成功
+    @discardableResult
+    class func deleteCreatDBFile() -> Observable<Bool> {
+        return Observable.create({ (observable) -> Disposable in
+            let isSuccess = RealmUtility.default.deleteCreatDBFile()
+            observable.onNext(isSuccess)
+            return Disposables.create()
+        })
+    }
+    
+    //MARK: - 改
+    /// 根据主键进行更新
+    ///
+    /// - Parameters:
+    ///   - object: 要更新的对象
+    ///   - update: 是否根据主键更新, 如果是"false"则是添加数据
+    /// - Returns: 根据主键进行更新是否成功, error为空则成功, 不为空则失败
+    @discardableResult
+    class func updateObject(_ object: RealmSwift.Object, update: Bool = true) -> Observable<Error?> {
+        
+        return Observable.create({ (observable) -> Disposable in
+            RealmUtility.default.updateObject(object, update: update, result: { (error) in
+                observable.onNext(error)
+            })
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 根据主键进行更新
+    ///
+    /// - Parameters:
+    ///   - type: 要更新的对象类型
+    ///   - value: 要更新的值, 例如: ["id": 1, "price": 9000.0]
+    ///   - update: 是否根据主键进行更新, 如果为"false"则为创建表
+    /// - Returns: 根据主键进行更新是否成功, error为空则成功, 不为空则失败
+    @discardableResult
+    class func updateObject(_ type: RealmSwift.Object.Type, value: Any? = nil, update: Bool = true) -> Observable<(RealmSwift.Object?, Error?)> {
+        return Observable.create({ (observable) -> Disposable in
+            RealmUtility.default.updateObject(type, value: value, update: update, result: { (object, error) in
+                observable.onNext((object, error))
+            })
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 直接更新对象
+    ///
+    /// - Parameters:
+    ///   - property: 要更改的属性
+    ///   - value: 更改的值
+    /// - Returns: 更改的结果
+//    @discardableResult
+//    public class func updateObject(_ property: inout Any, value: Any) -> Observable<Bool> {
+//        return Observable.create({ (observable) -> Disposable in
+//            let isSuccess = RealmUtility.default.updateObject(property: &property, value: value)
+//            observable.onNext(isSuccess)
+//            return Disposables.create()
+//        })
+//    }
+
+    
+    /// 更改表中所有的字段的值
+    ///
+    /// - Parameters:
+    ///   - type: 表的对象类型
+    ///   - key: 要更改的字段名
+    ///   - value: 更改的值
+    /// - Returns: 更改表中所有的字段的值是否成功
+    @discardableResult
+    class func updateObjects(type: RealmSwift.Object.Type, key: String, value: Any) -> Observable<Bool> {
+        return Observable.create({ (observable) -> Disposable in
+            let isSuccess = RealmUtility.default.updateObjects(type: type, key: key, value: value)
+            observable.onNext(isSuccess)
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 根据主键进行对某个对象中的数据进行更新
+    ///
+    /// - Parameters:
+    ///   - type: 表类型
+    ///   - primaryKey: 主键
+    ///   - key: 要更改属性
+    ///   - value: 更改的值
+    /// - Returns: 根据主键进行对某个对象中的数据进行更新是否成功
+    @discardableResult
+    class func updateObject(type: RealmSwift.Object.Type, primaryKey: Any, key: String, value: Any) -> Observable<Bool> {
+        return Observable.create({ (observable) -> Disposable in
+            let isSuccess = RealmUtility.default.updateObject(type: type, primaryKey: primaryKey, key: key, value: value)
+            observable.onNext(isSuccess)
+            return Disposables.create()
+        })
+    }
+    
+    //MARK: - 查
+    /// 查找一个表中的所有的数据
+    ///
+    /// - Parameter type: 对象类型
+    /// - Returns: 查到的数据
+    @discardableResult
+    class func getObjects(type: RealmSwift.Object.Type) -> Observable<RealmSwift.Results<RealmSwift.Object>?>{
+        return Observable.create({ (obsevable) -> Disposable in
+            let objects = RealmUtility.default.getObjects(type: type)
+            obsevable.onNext(objects)
+            return Disposables.create()
+        })
+    }
+    
+    /// 根据主键查找某个对象
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - primaryKey: 主键
+    /// - Returns: 查到的数据
+    @discardableResult
+    class func getObjectWithPrimaryKey(type: RealmSwift.Object.Type, primaryKey: Any) -> Observable<RealmSwift.Object?> {
+        return Observable.create({ (observable) -> Disposable in
+            let object = RealmUtility.default.getObjectWithPrimaryKey(type: type, primaryKey: primaryKey)
+            observable.onNext(object)
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 使用断言字符串查询
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - filter: 过滤条件
+    /// - Returns: 查询到的数据
+    /// - example:
+    ///   - var tanDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'")
+    @discardableResult
+    class func getObject(type: RealmSwift.Object.Type, filter: String) -> Observable<RealmSwift.Results<RealmSwift.Object>?> {
+        return Observable.create({ (observable) -> Disposable in
+            let objects = RealmUtility.default.getObject(type: type, filter: filter)
+            observable.onNext(objects)
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 使用谓词进行查询
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - predicate: 谓词对象
+    /// - Returns: 查询到的数据
+    /// - example:
+    ///   - let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "tan", "B")
+    ///   - tanDogs = realm.objects(Dog.self).filter(predicate)
+    @discardableResult
+    class func getObject(type: RealmSwift.Object.Type, predicate: NSPredicate) -> Observable<RealmSwift.Results<RealmSwift.Object>?> {
+        return Observable.create({ (observable) -> Disposable in
+            let object = RealmUtility.default.getObject(type: type, predicate: predicate)
+            observable.onNext(object)
+            return Disposables.create()
+        })
+    }
+    
+    
+    /// 对查询的数据进行排序
+    ///
+    /// - Parameters:
+    ///   - type: 对象类型
+    ///   - filter: 过滤条件
+    ///   - sortedKey: 需要排序的字段
+    /// - Returns: 最后的结果
+    /// - notice: 请注意, 不支持 将多个属性用作排序基准,此外也无法链式排序(只有最后一个 sorted 调用会被使用)。 如果要对多个属性进行排序,请使用 sorted(by:) 方法,然后向其中输入多个 SortDescriptor 对象。
+    @discardableResult
+    class func getObject(type: RealmSwift.Object.Type, filter: String, sortedKey: String) -> Observable<RealmSwift.Results<RealmSwift.Object>?> {
+        return Observable.create({ (observable) -> Disposable in
+            let object = RealmUtility.default.getObject(type: type, filter: filter, sortedKey: sortedKey)
+            observable.onNext(object)
+            return Disposables.create()
+        })
+    }
+    
+    /// 对查询的数据进行排序
+    ///
+    /// - Parameters:
+    ///   - type: 队形类型
+    ///   - predicate: 谓词对象
+    ///   - sortedKey: 排序的字段
+    /// - Returns: 排序后的数据
+    /// - notice: 请注意, 不支持 将多个属性用作排序基准,此外也无法链式排序(只有最后一个 sorted 调用会被使用)。 如果要对多个属性进行排序,请使用 sorted(by:) 方法,然后向其中输入多个 SortDescriptor 对象。
+    @discardableResult
+    class func getObject(type: RealmSwift.Object.Type, predicate: NSPredicate, sortedKey: String) -> Observable<RealmSwift.Results<RealmSwift.Object>?> {
+        return Observable.create({ (observable) -> Disposable in
+            let objects = RealmUtility.default.getObject(type: type, predicate: predicate, sortedKey: sortedKey)
+            observable.onNext(objects)
+            return Disposables.create()
+        })
+    }
+}
+
+
+
+
+
+