Selaa lähdekoodia

webView基本替换完成

南鑫林 5 vuotta sitten
vanhempi
commit
14beb30810
28 muutettua tiedostoa jossa 1099 lisäystä ja 1445 poistoa
  1. 34 56
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 0 175
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebBaseViewController.swift
  3. 0 170
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebViewController.swift
  4. 77 0
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseNewWebViewController.swift
  5. 0 120
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseWebViewController.swift
  6. 4 0
      RainbowPlanet/RainbowPlanet/Macro/RainbowPlanet-Bridging-Header.h
  7. 1 1
      RainbowPlanet/RainbowPlanet/Manager/RongCloudIMManager/RongCloudIMManager.swift
  8. 1 1
      RainbowPlanet/RainbowPlanet/Manager/WebViewJavascriptBridgeManager/WebViewJavascriptBridgeManager.swift
  9. 35 35
      RainbowPlanet/RainbowPlanet/Model/UserModel/UserModel.swift
  10. 10 92
      RainbowPlanet/RainbowPlanet/Modules/BackyardModule/Backyard/ViewController/BackyardViewController.swift
  11. 0 138
      RainbowPlanet/RainbowPlanet/Modules/BackyardModule/BackyardActivity/BackyardActivityViewController.swift
  12. 10 103
      RainbowPlanet/RainbowPlanet/Modules/H5Modules/H5Common/ViewController/H5CommonViewController.swift
  13. 2 2
      RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/UserPersonalCenter/View/RainbowBeanPhysical/RainbowBeanPhysicalView.swift
  14. 4 2
      RainbowPlanet/RainbowPlanet/Modules/PublishModule/PublishArticle/ViewController/PublishArticleViewController.swift
  15. 15 15
      RainbowPlanet/RainbowPlanet/Router/H5RouterModuleType.swift
  16. 2 2
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceManger/SwiftMoyaNetWorkManager/ApiMacro.swift
  17. 0 50
      RainbowPlanet/RainbowPlanet/Tools/AuthorizationSwift/AuthorizationSwift.swift
  18. 247 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/NXLWebView.swift
  19. 54 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/NSObject+PARuntime.h
  20. 215 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/NSObject+PARuntime.m
  21. 19 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCache.h
  22. 95 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCache.m
  23. 37 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCookie.h
  24. 235 0
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCookie.m
  25. 0 93
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/WKWebViewConfig.swift
  26. 0 22
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/WKWebViewEnum.swift
  27. 0 366
      RainbowPlanet/RainbowPlanet/Tools/WKWebView/WebView.swift
  28. 2 2
      RainbowPlanet/RainbowPlanet/ViewModel/UserMemberTotalBeanViewModel/UserMemberTotalBeanViewModel.swift

+ 34 - 56
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -35,7 +35,6 @@
 		A71AA5152272160A008FF1A5 /* ExpressAddressListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA5142272160A008FF1A5 /* ExpressAddressListTableViewCell.swift */; };
 		A71AA519227219D7008FF1A5 /* EditExpressAddressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA518227219D7008FF1A5 /* EditExpressAddressViewController.swift */; };
 		A71AA51C227219EF008FF1A5 /* EditExpressAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA51B227219EF008FF1A5 /* EditExpressAddressView.swift */; };
-		A71AA51F22729F35008FF1A5 /* AuthorizationSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */; };
 		A71AA5212272E527008FF1A5 /* Extension+UINavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */; };
 		A71AA52622732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA52522732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift */; };
 		A71AA52822732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA52722732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift */; };
@@ -109,8 +108,6 @@
 		A72A72C022321DE000B21995 /* Extension+UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A729A22321DE000B21995 /* Extension+UIView.swift */; };
 		A72A72C322321DE000B21995 /* Extension+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A729D22321DE000B21995 /* Extension+Date.swift */; };
 		A72A72C422321DE000B21995 /* Extension+CAGradientLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A729E22321DE000B21995 /* Extension+CAGradientLayer.swift */; };
-		A72A72C522321DE000B21995 /* WKWebViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72A022321DE000B21995 /* WKWebViewConfig.swift */; };
-		A72A72C622321DE000B21995 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72A122321DE000B21995 /* WebView.swift */; };
 		A72A72CF22321E2700B21995 /* NotificationCenterMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72C722321E2500B21995 /* NotificationCenterMacro.swift */; };
 		A72A72D022321E2700B21995 /* FontMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72C822321E2500B21995 /* FontMacro.swift */; };
 		A72A72D222321E2700B21995 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72A72CA22321E2600B21995 /* Common.swift */; };
@@ -284,7 +281,6 @@
 		A77F2C982231FD25001BD3F6 /* BaseNavigationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C972231FD25001BD3F6 /* BaseNavigationViewController.swift */; };
 		A77F2C9C2231FDCF001BD3F6 /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C9B2231FDCF001BD3F6 /* BaseView.swift */; };
 		A77F2C9E2231FDDC001BD3F6 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C9D2231FDDC001BD3F6 /* BaseViewController.swift */; };
-		A77F2CA02231FE45001BD3F6 /* BaseWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C9F2231FE45001BD3F6 /* BaseWebViewController.swift */; };
 		A77F2CC3223203BA001BD3F6 /* AppDelegate+Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2CC2223203BA001BD3F6 /* AppDelegate+Window.swift */; };
 		A77F2CC722320627001BD3F6 /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2CC522320627001BD3F6 /* WRNavigationBar.swift */; };
 		A77F2CC822320627001BD3F6 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2CC622320627001BD3F6 /* WRCustomNavigationBar.swift */; };
@@ -332,7 +328,6 @@
 		A7824B082271F53A00ABA381 /* EditSetDefaultTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7824B072271F53A00ABA381 /* EditSetDefaultTableViewCell.swift */; };
 		A784F29D234C370F00E49140 /* PhotoAlbumUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = A784F29C234C370F00E49140 /* PhotoAlbumUtil.swift */; };
 		A784F2A5234C86EC00E49140 /* ATAuthSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A784F2A4234C86EC00E49140 /* ATAuthSDK.framework */; };
-		A784F2A8234DB0AE00E49140 /* BackyardActivityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A784F2A7234DB0AE00E49140 /* BackyardActivityViewController.swift */; };
 		A784F2AB234ED15600E49140 /* DatePickerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A784F2AA234ED15600E49140 /* DatePickerManager.swift */; };
 		A784F2AE234F352000E49140 /* BrowsePicturesSaveImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A784F2AD234F352000E49140 /* BrowsePicturesSaveImageView.swift */; };
 		A784F2B12350124200E49140 /* CopyLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A784F2B02350124200E49140 /* CopyLabel.swift */; };
@@ -375,6 +370,11 @@
 		A7B4E7352281907A0012914A /* CMSModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B4E7342281907A0012914A /* CMSModel.swift */; };
 		A7B4E73A228192D20012914A /* CMSTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B4E739228192D10012914A /* CMSTemplateModel.swift */; };
 		A7B77393236A897800BF26F1 /* Extension+Dictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B77392236A897800BF26F1 /* Extension+Dictionary.swift */; };
+		A7B7748E236AF22300BF26F1 /* NXLWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B7748D236AF22300BF26F1 /* NXLWebView.swift */; };
+		A7B77496236B2E5600BF26F1 /* WKWebView+PAWebCookie.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B77490236B2E5600BF26F1 /* WKWebView+PAWebCookie.m */; };
+		A7B77497236B2E5600BF26F1 /* WKWebView+PAWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B77491236B2E5600BF26F1 /* WKWebView+PAWebCache.m */; };
+		A7B77498236B2E5600BF26F1 /* NSObject+PARuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B77492236B2E5600BF26F1 /* NSObject+PARuntime.m */; };
+		A7B7749A236B37AE00BF26F1 /* BaseNewWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B77499236B37AE00BF26F1 /* BaseNewWebViewController.swift */; };
 		A7BA1902230EA80000E3B969 /* TGCaculateNumberTool.m in Sources */ = {isa = PBXBuildFile; fileRef = A7BA1901230EA80000E3B969 /* TGCaculateNumberTool.m */; };
 		A7BB684F2268DCEC00AB07A2 /* SelfRecommendationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BB684D2268DCEC00AB07A2 /* SelfRecommendationViewController.swift */; };
 		A7BB68552268DE8600AB07A2 /* SelfRecommendationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BB68542268DE8600AB07A2 /* SelfRecommendationView.swift */; };
@@ -438,9 +438,6 @@
 		A7D4608E227616F800A5A54E /* SQLiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D4608D227616F800A5A54E /* SQLiteManager.swift */; };
 		A7D46090227617D200A5A54E /* SQLModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D4608F227617D200A5A54E /* SQLModel.swift */; };
 		A7D46092227619CD00A5A54E /* BaiduToCityFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D46091227619CC00A5A54E /* BaiduToCityFactory.swift */; };
-		A7D5F22922BB686200F8E9AF /* BaseJSWebBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F22822BB686200F8E9AF /* BaseJSWebBaseViewController.swift */; };
-		A7D5F22B22BB687100F8E9AF /* BaseJSWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F22A22BB687100F8E9AF /* BaseJSWebViewController.swift */; };
-		A7D5F22D22BB689700F8E9AF /* WKWebViewEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F22C22BB689700F8E9AF /* WKWebViewEnum.swift */; };
 		A7D5F23322BB9BE600F8E9AF /* H5CommonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F23222BB9BE600F8E9AF /* H5CommonViewController.swift */; };
 		A7D5F24D22BC720000F8E9AF /* WVJBModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F24C22BC720000F8E9AF /* WVJBModel.swift */; };
 		A7D5F25022BC7B3700F8E9AF /* WebViewJavascriptBridgeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F24F22BC7B3700F8E9AF /* WebViewJavascriptBridgeManager.swift */; };
@@ -768,7 +765,6 @@
 		A71AA5142272160A008FF1A5 /* ExpressAddressListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpressAddressListTableViewCell.swift; sourceTree = "<group>"; };
 		A71AA518227219D7008FF1A5 /* EditExpressAddressViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditExpressAddressViewController.swift; sourceTree = "<group>"; };
 		A71AA51B227219EF008FF1A5 /* EditExpressAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditExpressAddressView.swift; sourceTree = "<group>"; };
-		A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationSwift.swift; sourceTree = "<group>"; };
 		A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+UINavigationController.swift"; sourceTree = "<group>"; };
 		A71AA52522732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaServiceConfigApi.swift; sourceTree = "<group>"; };
 		A71AA52722732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkServiceConfig.swift; sourceTree = "<group>"; };
@@ -845,8 +841,6 @@
 		A72A729A22321DE000B21995 /* Extension+UIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Extension+UIView.swift"; sourceTree = "<group>"; };
 		A72A729D22321DE000B21995 /* Extension+Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Extension+Date.swift"; sourceTree = "<group>"; };
 		A72A729E22321DE000B21995 /* Extension+CAGradientLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Extension+CAGradientLayer.swift"; sourceTree = "<group>"; };
-		A72A72A022321DE000B21995 /* WKWebViewConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WKWebViewConfig.swift; sourceTree = "<group>"; };
-		A72A72A122321DE000B21995 /* WebView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = "<group>"; };
 		A72A72C722321E2500B21995 /* NotificationCenterMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationCenterMacro.swift; sourceTree = "<group>"; };
 		A72A72C822321E2500B21995 /* FontMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontMacro.swift; sourceTree = "<group>"; };
 		A72A72CA22321E2600B21995 /* Common.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Common.swift; sourceTree = "<group>"; };
@@ -1031,7 +1025,6 @@
 		A77F2C972231FD25001BD3F6 /* BaseNavigationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNavigationViewController.swift; sourceTree = "<group>"; };
 		A77F2C9B2231FDCF001BD3F6 /* BaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseView.swift; sourceTree = "<group>"; };
 		A77F2C9D2231FDDC001BD3F6 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = "<group>"; };
-		A77F2C9F2231FE45001BD3F6 /* BaseWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseWebViewController.swift; sourceTree = "<group>"; };
 		A77F2CC2223203BA001BD3F6 /* AppDelegate+Window.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Window.swift"; sourceTree = "<group>"; };
 		A77F2CC522320627001BD3F6 /* WRNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRNavigationBar.swift; sourceTree = "<group>"; };
 		A77F2CC622320627001BD3F6 /* WRCustomNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRCustomNavigationBar.swift; sourceTree = "<group>"; };
@@ -1085,7 +1078,6 @@
 		A7824B072271F53A00ABA381 /* EditSetDefaultTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSetDefaultTableViewCell.swift; sourceTree = "<group>"; };
 		A784F29C234C370F00E49140 /* PhotoAlbumUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoAlbumUtil.swift; sourceTree = "<group>"; };
 		A784F2A4234C86EC00E49140 /* ATAuthSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ATAuthSDK.framework; sourceTree = "<group>"; };
-		A784F2A7234DB0AE00E49140 /* BackyardActivityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackyardActivityViewController.swift; sourceTree = "<group>"; };
 		A784F2AA234ED15600E49140 /* DatePickerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatePickerManager.swift; sourceTree = "<group>"; };
 		A784F2AD234F352000E49140 /* BrowsePicturesSaveImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsePicturesSaveImageView.swift; sourceTree = "<group>"; };
 		A784F2B02350124200E49140 /* CopyLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyLabel.swift; sourceTree = "<group>"; };
@@ -1129,6 +1121,14 @@
 		A7B4E7342281907A0012914A /* CMSModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMSModel.swift; sourceTree = "<group>"; };
 		A7B4E739228192D10012914A /* CMSTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMSTemplateModel.swift; sourceTree = "<group>"; };
 		A7B77392236A897800BF26F1 /* Extension+Dictionary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+Dictionary.swift"; sourceTree = "<group>"; };
+		A7B7748D236AF22300BF26F1 /* NXLWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLWebView.swift; sourceTree = "<group>"; };
+		A7B77490236B2E5600BF26F1 /* WKWebView+PAWebCookie.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKWebView+PAWebCookie.m"; sourceTree = "<group>"; };
+		A7B77491236B2E5600BF26F1 /* WKWebView+PAWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKWebView+PAWebCache.m"; sourceTree = "<group>"; };
+		A7B77492236B2E5600BF26F1 /* NSObject+PARuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+PARuntime.m"; sourceTree = "<group>"; };
+		A7B77493236B2E5600BF26F1 /* WKWebView+PAWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WKWebView+PAWebCache.h"; sourceTree = "<group>"; };
+		A7B77494236B2E5600BF26F1 /* WKWebView+PAWebCookie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WKWebView+PAWebCookie.h"; sourceTree = "<group>"; };
+		A7B77495236B2E5600BF26F1 /* NSObject+PARuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+PARuntime.h"; sourceTree = "<group>"; };
+		A7B77499236B37AE00BF26F1 /* BaseNewWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNewWebViewController.swift; sourceTree = "<group>"; };
 		A7BA1900230EA80000E3B969 /* TGCaculateNumberTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TGCaculateNumberTool.h; sourceTree = "<group>"; };
 		A7BA1901230EA80000E3B969 /* TGCaculateNumberTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TGCaculateNumberTool.m; sourceTree = "<group>"; };
 		A7BB684D2268DCEC00AB07A2 /* SelfRecommendationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelfRecommendationViewController.swift; sourceTree = "<group>"; };
@@ -1193,9 +1193,6 @@
 		A7D4608D227616F800A5A54E /* SQLiteManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SQLiteManager.swift; sourceTree = "<group>"; };
 		A7D4608F227617D200A5A54E /* SQLModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SQLModel.swift; sourceTree = "<group>"; };
 		A7D46091227619CC00A5A54E /* BaiduToCityFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaiduToCityFactory.swift; sourceTree = "<group>"; };
-		A7D5F22822BB686200F8E9AF /* BaseJSWebBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseJSWebBaseViewController.swift; sourceTree = "<group>"; };
-		A7D5F22A22BB687100F8E9AF /* BaseJSWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseJSWebViewController.swift; sourceTree = "<group>"; };
-		A7D5F22C22BB689700F8E9AF /* WKWebViewEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewEnum.swift; sourceTree = "<group>"; };
 		A7D5F23222BB9BE600F8E9AF /* H5CommonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = H5CommonViewController.swift; sourceTree = "<group>"; };
 		A7D5F24C22BC720000F8E9AF /* WVJBModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WVJBModel.swift; sourceTree = "<group>"; };
 		A7D5F24F22BC7B3700F8E9AF /* WebViewJavascriptBridgeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewJavascriptBridgeManager.swift; sourceTree = "<group>"; };
@@ -1775,14 +1772,6 @@
 			path = View;
 			sourceTree = "<group>";
 		};
-		A71AA51D22729F0B008FF1A5 /* AuthorizationSwift */ = {
-			isa = PBXGroup;
-			children = (
-				A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */,
-			);
-			path = AuthorizationSwift;
-			sourceTree = "<group>";
-		};
 		A71AA5242273202E008FF1A5 /* SwiftMoyaServiceConfig */ = {
 			isa = PBXGroup;
 			children = (
@@ -2249,9 +2238,8 @@
 		A72A729F22321DE000B21995 /* WKWebView */ = {
 			isa = PBXGroup;
 			children = (
-				A72A72A022321DE000B21995 /* WKWebViewConfig.swift */,
-				A72A72A122321DE000B21995 /* WebView.swift */,
-				A7D5F22C22BB689700F8E9AF /* WKWebViewEnum.swift */,
+				A7B7748F236B2E5600BF26F1 /* PAWebViewCache */,
+				A7B7748D236AF22300BF26F1 /* NXLWebView.swift */,
 			);
 			path = WKWebView;
 			sourceTree = "<group>";
@@ -2483,7 +2471,6 @@
 			isa = PBXGroup;
 			children = (
 				A7D5F21B22BB1F0100F8E9AF /* Backyard */,
-				A784F2A6234DB06F00E49140 /* BackyardActivity */,
 			);
 			path = BackyardModule;
 			sourceTree = "<group>";
@@ -3174,9 +3161,7 @@
 		A77F2C942231FCD2001BD3F6 /* BaseWebViewController */ = {
 			isa = PBXGroup;
 			children = (
-				A77F2C9F2231FE45001BD3F6 /* BaseWebViewController.swift */,
-				A7D5F22822BB686200F8E9AF /* BaseJSWebBaseViewController.swift */,
-				A7D5F22A22BB687100F8E9AF /* BaseJSWebViewController.swift */,
+				A7B77499236B37AE00BF26F1 /* BaseNewWebViewController.swift */,
 			);
 			path = BaseWebViewController;
 			sourceTree = "<group>";
@@ -3285,7 +3270,6 @@
 				A7D4608C227616E600A5A54E /* FMDB */,
 				A71901712275F56C00104A50 /* BaiduToCityFactory */,
 				A757C9312274882E00226355 /* MJRefreshEX */,
-				A71AA51D22729F0B008FF1A5 /* AuthorizationSwift */,
 				A73D7C662268A032002A4CE3 /* SwiftyStarRatingView */,
 				A729B5A62266DBFA004AE098 /* AlertSheetView */,
 				A72A727322321DDE00B21995 /* Log */,
@@ -3553,22 +3537,6 @@
 			path = PhotoAlbumUtil;
 			sourceTree = "<group>";
 		};
-		A784F2A6234DB06F00E49140 /* BackyardActivity */ = {
-			isa = PBXGroup;
-			children = (
-				A784F2A9234DB21600E49140 /* ViewController */,
-				A784F2A7234DB0AE00E49140 /* BackyardActivityViewController.swift */,
-			);
-			path = BackyardActivity;
-			sourceTree = "<group>";
-		};
-		A784F2A9234DB21600E49140 /* ViewController */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			path = ViewController;
-			sourceTree = "<group>";
-		};
 		A784F2AC234ED16500E49140 /* DatePickerManager */ = {
 			isa = PBXGroup;
 			children = (
@@ -3868,6 +3836,19 @@
 			path = CMSModel;
 			sourceTree = "<group>";
 		};
+		A7B7748F236B2E5600BF26F1 /* PAWebViewCache */ = {
+			isa = PBXGroup;
+			children = (
+				A7B77494236B2E5600BF26F1 /* WKWebView+PAWebCookie.h */,
+				A7B77490236B2E5600BF26F1 /* WKWebView+PAWebCookie.m */,
+				A7B77491236B2E5600BF26F1 /* WKWebView+PAWebCache.m */,
+				A7B77493236B2E5600BF26F1 /* WKWebView+PAWebCache.h */,
+				A7B77495236B2E5600BF26F1 /* NSObject+PARuntime.h */,
+				A7B77492236B2E5600BF26F1 /* NSObject+PARuntime.m */,
+			);
+			path = PAWebViewCache;
+			sourceTree = "<group>";
+		};
 		A7BA1903230EA80800E3B969 /* CaculateNumberTool */ = {
 			isa = PBXGroup;
 			children = (
@@ -6057,7 +6038,6 @@
 				A70B8430228FF6D400882BC5 /* ProductCartCountModel.swift in Sources */,
 				A7F304B9233324B400A4850F /* RongCloudIMRouterModuleType.swift in Sources */,
 				A770E5ED22D4298100CBD0A4 /* CommentReplyView.swift in Sources */,
-				A77F2CA02231FE45001BD3F6 /* BaseWebViewController.swift in Sources */,
 				BDAF83B422B3B6DF0004BCC3 /* RecommendMajorCommentCell.swift in Sources */,
 				A72A72C022321DE000B21995 /* Extension+UIView.swift in Sources */,
 				BDAF83B022B3B63B0004BCC3 /* RecommendCommentHeader.swift in Sources */,
@@ -6065,7 +6045,6 @@
 				A770E5DD22CEDF4F00CBD0A4 /* OpenAppModel.swift in Sources */,
 				A719EE6E22AF441F001AAC98 /* CommunityViewController.swift in Sources */,
 				BD13B6C622BA034D008BB323 /* PublishEditTitleCell.swift in Sources */,
-				A72A72C522321DE000B21995 /* WKWebViewConfig.swift in Sources */,
 				A72A72BB22321DE000B21995 /* Extension+UILabel.swift in Sources */,
 				BDAF83A822B343C50004BCC3 /* RecommendBottomCommentView.swift in Sources */,
 				BD12B66B22B4A01300AEB10B /* RecommendSubCommentTableViewFooter.swift in Sources */,
@@ -6101,7 +6080,6 @@
 				A714348722DD9D4700132DA9 /* RedemptionAreaViewController.swift in Sources */,
 				A784F2BD2350730C00E49140 /* PublishNewPopView.swift in Sources */,
 				A73A56DE22DC9CCE004920FE /* UpdateVersionManager.swift in Sources */,
-				A7D5F22B22BB687100F8E9AF /* BaseJSWebViewController.swift in Sources */,
 				BD1DC6C5228CFD0B00B89C57 /* SwiftMoyaNetWorkServiceOrder.swift in Sources */,
 				A72A72C422321DE000B21995 /* Extension+CAGradientLayer.swift in Sources */,
 				A7778CA72243A05400C7C47A /* IQKeyboardManagerSwiftManager.swift in Sources */,
@@ -6215,6 +6193,7 @@
 				A71AA50C2272126A008FF1A5 /* EditAddressFooterView.swift in Sources */,
 				A7CC7528227196C4003C4F38 /* AccountSecuritySetTableViewCell.swift in Sources */,
 				A7F2D6E122B25EF30093000B /* CardContentPicVideoModel.swift in Sources */,
+				A7B77498236B2E5600BF26F1 /* NSObject+PARuntime.m in Sources */,
 				BD0FAA5622C4752C00DDFB37 /* AliyunPublishTopView.m in Sources */,
 				A7F688F52355D933000C313F /* CircleQuestionsAnswersTableViewCell.swift in Sources */,
 				A74322A922B900180017C367 /* CommunityFindFriendsViewController.swift in Sources */,
@@ -6240,7 +6219,6 @@
 				BD61225422C355C800D3F513 /* AliyunMagicCameraViewController.m in Sources */,
 				BDAF83A222B330540004BCC3 /* RecommendSimilarCell.swift in Sources */,
 				BD2FCBE222B21CF70006D974 /* CommunityRecommendController.swift in Sources */,
-				A71AA51F22729F35008FF1A5 /* AuthorizationSwift.swift in Sources */,
 				A770E61222D6625700CBD0A4 /* ShareCommunityContentView.swift in Sources */,
 				A7824AFD2271EAC900ABA381 /* SelfMentionContactsListTableViewCell.swift in Sources */,
 				A7DF50DF22A5590200998908 /* BrowsePicturesViewController.swift in Sources */,
@@ -6299,6 +6277,7 @@
 				BDD22F0B228FAA5B00D43BFB /* ImageUrlModel.swift in Sources */,
 				A76068E022E43DAC008DF18F /* CardContentUserDeleteView.swift in Sources */,
 				A747D83D235D8046007F4E33 /* CircleAlbumViewController.swift in Sources */,
+				A7B77497236B2E5600BF26F1 /* WKWebView+PAWebCache.m in Sources */,
 				BD6122BB22C3639E00D3F513 /* AlivcEditIconButton.m in Sources */,
 				A72A72D522321E2700B21995 /* ColorMacro.swift in Sources */,
 				BD0FAA5C22C4C32E00DDFB37 /* AliyunCropViewController.m in Sources */,
@@ -6472,13 +6451,11 @@
 				A76068F322E4B11B008DF18F /* UIImage+Gif.swift in Sources */,
 				A71AA5212272E527008FF1A5 /* Extension+UINavigationController.swift in Sources */,
 				BD981A8F22C9FEEF0043D951 /* CommunityPublishModel.swift in Sources */,
-				A7D5F22D22BB689700F8E9AF /* WKWebViewEnum.swift in Sources */,
 				A7D07CD222B784B800186014 /* UserPersonalCenterHeaderView.swift in Sources */,
 				A7CC751822716202003C4F38 /* SetView.swift in Sources */,
 				BD2FCBEA22B267280006D974 /* RecommendNoneCommentCell.swift in Sources */,
 				A7E19FB122BA3A0D009BCCE1 /* SearchTopicListTableViewCell.swift in Sources */,
 				A7B4E73A228192D20012914A /* CMSTemplateModel.swift in Sources */,
-				A72A72C622321DE000B21995 /* WebView.swift in Sources */,
 				A76068E722E48DC5008DF18F /* BrowsePictureRouterModuleType.swift in Sources */,
 				A78168DF2341A8FD00033496 /* AliyunVodUptoyouEffectsModel.swift in Sources */,
 				BD12B66922B47D4800AEB10B /* RecommendSubCommentTableViewCell.swift in Sources */,
@@ -6588,12 +6565,12 @@
 				A7F68916235738EB000C313F /* CircleLeavingMessageCommentTopStepTableViewCell.swift in Sources */,
 				A7A98DFD227E84F4005306E9 /* SwiftMoyaServiceProductApi.swift in Sources */,
 				BD01B1FB22BC673A00CE9F36 /* PublishTakePhotoController.swift in Sources */,
+				A7B7748E236AF22300BF26F1 /* NXLWebView.swift in Sources */,
 				A7D07CCF22B77E0200186014 /* UserPersonalCenterOrderCollectionViewCell.swift in Sources */,
 				BD0808EC22C5BA3100D12E6A /* AliyunCompositionInfo.m in Sources */,
 				A78168E22341CE1D00033496 /* PublishNewEffectFilterBeautyView.swift in Sources */,
 				A72A72D222321E2700B21995 /* Common.swift in Sources */,
 				BD1FC17F22B08D3C00D55081 /* CommunityMyFollowTopicController.swift in Sources */,
-				A784F2A8234DB0AE00E49140 /* BackyardActivityViewController.swift in Sources */,
 				A71AF0A6226EDDC8001730FE /* SearchViewController.swift in Sources */,
 				BD13B6DC22BA03BC008BB323 /* SearchAddrNavigationbarView.swift in Sources */,
 				A757849D22C1CBF400D4DB61 /* SwiftMoyaNetWorkH5Manager.swift in Sources */,
@@ -6620,7 +6597,6 @@
 				BD0FAA6522C4C35E00DDFB37 /* AliyunCycleProgressView.m in Sources */,
 				A7AA9F6322C62B270086498B /* CommunityRecommnendViewController.swift in Sources */,
 				BDF7CAD022DC920A007CD5F4 /* SwiftLocationPOIModel.swift in Sources */,
-				A7D5F22922BB686200F8E9AF /* BaseJSWebBaseViewController.swift in Sources */,
 				BD1FC18122B08D7A00D55081 /* CommunityMyFollowTopicCell.swift in Sources */,
 				A7C0FDE722B4A38500BC1E86 /* CardContentCommentListTableViewCell.swift in Sources */,
 				A757C92E22744ACE00226355 /* AddressManagerListModel.swift in Sources */,
@@ -6663,6 +6639,7 @@
 				A72A72AC22321DE000B21995 /* Regex.swift in Sources */,
 				BD12B67422B4EC9700AEB10B /* KSMediaPickerController.swift in Sources */,
 				A770E5F922D5E0E500CBD0A4 /* CommunityShareContentViewController.swift in Sources */,
+				A7B7749A236B37AE00BF26F1 /* BaseNewWebViewController.swift in Sources */,
 				A7811C87231AB49800C2D8DE /* CommunityReportTableViewCell.swift in Sources */,
 				A7778CC52246035700C7C47A /* PhoneCountryAreaViewController.swift in Sources */,
 				A7811CA7231FB13700C2D8DE /* KSTriangleDisclosureIndicator.m in Sources */,
@@ -6670,6 +6647,7 @@
 				A784F2B12350124200E49140 /* CopyLabel.swift in Sources */,
 				A77FAF0523595D3E002A1D08 /* CircleCommentReplyParentTableViewCell.swift in Sources */,
 				A72A72BF22321DE000B21995 /* Extension+UIButton.swift in Sources */,
+				A7B77496236B2E5600BF26F1 /* WKWebView+PAWebCookie.m in Sources */,
 				BDE376DA22C22A260055E2EA /* UIButton+AliyunBlock.m in Sources */,
 				A7F304B523331B0800A4850F /* IMChatRoomViewController.swift in Sources */,
 				A7D07CBF22B73EE600186014 /* UserPersonalCenterViewController.swift in Sources */,

+ 0 - 175
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebBaseViewController.swift

@@ -1,175 +0,0 @@
-//
-//  BaseJSWebBaseViewController.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/6/20.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import UIKit
-import WebKit
-import WebViewJavascriptBridge
-
-class BaseJSWebBaseViewController: BaseViewController {
-
-    deinit {
-        removeWebView()
-    }
-    //加载普通URL
-    var URLString : String?
-    //加载本地URL
-    var HTMLName : String?
-    //保存请求链接
-    var snapShotsArray:Array<Any>?
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        setupViews()
-//        setupData()
-        
-    }
-    
-    override func setupViews() {
-//        removeWKWebViewCookies()
-        if #available(iOS 11.0, *) {
-            UIScrollView.appearance().contentInsetAdjustmentBehavior = .automatic
-        } else {
-            if self.responds(to: #selector(setter: self.automaticallyAdjustsScrollViewInsets)) {
-                self.automaticallyAdjustsScrollViewInsets = true
-            }
-        }
-        view.addSubview(wkWebView)
-        view.addSubview(progressView)
-        WebViewJavascriptBridge.enableLogging()
-        view.insertSubview(navigationBar, aboveSubview: wkWebView)
-    }
-    
-    override func setupData() {
-        //// 加载普通URL
-        if (URLString != nil) {
-            NXLLog(URLString!)
-            webloadType(.URLString(url: URLString!))
-        }
-        
-        // 加载本地URL
-        if (HTMLName != nil ) {
-            webloadType(.HTMLName(name: HTMLName!))
-        }
-        
-    }
-    
-    lazy var bridge: WebViewJavascriptBridge = {
-        let bridge = WebViewJavascriptBridge(forWebView: self.wkWebView)
-        bridge?.setWebViewDelegate(self)
-        return bridge!
-    }()
-    
-    lazy var wkWebView: WKWebView = {
-        /// 创建webveiew
-        let wkWebView = WKWebView(frame: CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight-kNavBarTotalHeight))
-        // 监听支持KVO的属性
-        wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
-        wkWebView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
-        return wkWebView
-    }()
-    
-    /// 进度条
-    lazy var progressView: UIProgressView = {
-        let progressView =  UIProgressView(progressViewStyle: .default)
-        progressView.frame = CGRect(x: CGFloat(0.0), y:kNavBarTotalHeight, width: CGFloat(wkWebView.width), height: 3)
-        progressView.trackTintColor = UIColor.clear
-        progressView.progressTintColor = kThemeColor
-        return progressView
-    }()
-    
-    /// 加载webView
-    func webloadType(_ loadType:WKWebLoadType) {
-        switch loadType {
-        case .URLString(let urltring):
-            let urlstr = URL(string: urltring)
-            let request = URLRequest(url: urlstr!)
-            wkWebView.load(request)
-        case .HTMLName(let string):
-            loadHost(string: string)
-        default:
-            break
-        }
-    }
-    
-    
-    /// 加载本得html
-    ///
-    /// - Parameter string: <#string description#>
-    func loadHost(string:String) {
-        let path = Bundle.main.path(forResource: string, ofType: "html")
-        // 获得html内容
-        do {
-            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
-            // 加载js
-            wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
-        } catch { }
-    }
-    
-    /// 刷新
-    public func reload() {
-        wkWebView.reload()
-    }
-    
-    /// 后退
-    public func goBack() {
-        wkWebView.goBack()
-    }
-    
-    /// 前进
-    public func goForward() {
-        wkWebView.goForward()
-    }
-    
-    /// 遗传webView
-    public func removeWebView(){
-        if isViewLoaded {
-            wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
-        }
-        wkWebView.navigationDelegate = nil
-        wkWebView.uiDelegate = nil
-        self.view.removeFromSuperview()
-    }
-    
-    //请求链接处理
-    func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
-        // 连接是否为空
-        guard let urlStr = snapShotsArray?.last else { return }
-        // 转换成URL
-        let url = URL(string: urlStr as! String)
-        // 转换成NSURLRequest
-        let lastRequest = NSURLRequest(url: url!)
-        // 如果url是很奇怪的就不push
-        if request.url?.absoluteString == "about:blank"{ return }
-        // 如果url一样就不进行push
-        if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
-        // snapshotView
-        let currentSnapShotView = wkWebView.snapshotView(afterScreenUpdates: true);
-        //向数组添加字典
-        snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
-    }
-    
-    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
-        if keyPath == "estimatedProgress"{
-            // 设置进度条透明度
-            progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
-            // 给进度条添加进度和动画
-            progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
-            // 结束进度
-            if Float(wkWebView.estimatedProgress) >= 1.0{
-                progressView.alpha = 0.0
-                progressView .setProgress(0.0, animated: false)
-            }
-        }else if keyPath == "title" {
-            let vc = wkWebView.findViewController() as? BaseViewController
-            _ = vc?.navigationBar.title = wkWebView.title
-        }else {
-            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
-            
-        }
-    }
-}

+ 0 - 170
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebViewController.swift

@@ -1,170 +0,0 @@
-//
-//  BaseJSWebViewController.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/6/20.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import UIKit
-import WebKit
-import WebViewJavascriptBridge
-
-class BaseJSWebViewController: BaseViewController {
-    
-    override func didReceiveMemoryWarning() {
-        super.didReceiveMemoryWarning()
-    }
-    
-    deinit {
-        removeWebView()
-    }
-    //加载普通URL
-    var URLString : String?
-    //加载本地URL
-    var HTMLName : String?
-    //保存请求链接
-    var snapShotsArray:Array<Any>?
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        setupViews()
-//        setupData()
-    }
-    
-    override func setupViews() {
-//        removeWKWebViewCookies()
-        view.addSubview(wkWebView)
-        view.addSubview(progressView)
-        WebViewJavascriptBridge.enableLogging()
-    }
-    
-    override func setupLayouts() {
-        
-    }
-    
-    override func setupData() {
-        //// 加载普通URL
-        if (URLString != nil) {
-            webloadType(.URLString(url: URLString!))
-        }
-        
-        // 加载本地URL
-        if (HTMLName != nil ) {
-            webloadType(.HTMLName(name: HTMLName!))
-        }
-        
-    }
-    
-    lazy var bridge: WebViewJavascriptBridge = {
-        let bridge = WebViewJavascriptBridge(forWebView: self.wkWebView)
-        bridge?.setWebViewDelegate(self)
-        return bridge!
-    }()
-    
-    lazy var wkWebView: WKWebView = {
-        /// 创建webveiew
-        let wkWebView = WKWebView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-44-kNavBarTotalHeight-kTabBarTotalHeight))
-        // 监听支持KVO的属性
-        wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
-        return wkWebView
-    }()
-    
-    /// 进度条
-    lazy var progressView: UIProgressView = {
-        let progressView =  UIProgressView(progressViewStyle: .default)
-        progressView.frame = CGRect(x: CGFloat(0.0), y:0, width: CGFloat(wkWebView.width), height: 3)
-        progressView.trackTintColor = UIColor.clear
-        progressView.progressTintColor = kThemeColor
-        return progressView
-    }()
-    
-    /// 加载webView
-    func webloadType(_ loadType:WKWebLoadType) {
-        switch loadType {
-        case .URLString(let urltring):
-            let urlstr = URL(string: urltring)
-            let request = URLRequest(url: urlstr!)
-            wkWebView.load(request)
-        case .HTMLName(let string):
-            loadHost(string: string)
-        default:
-            break
-        }
-    }
-    
-    
-    /// 加载本得html
-    ///
-    /// - Parameter string: <#string description#>
-    func loadHost(string:String) {
-        let path = Bundle.main.path(forResource: string, ofType: "html")
-        // 获得html内容
-        do {
-            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
-            // 加载js
-            wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
-        } catch { }
-    }
-    
-    /// 刷新
-    public func reload() {
-        wkWebView.reload()
-    }
-    
-    /// 后退
-    public func goBack() {
-        wkWebView.goBack()
-    }
-    
-    /// 前进
-    public func goForward() {
-        wkWebView.goForward()
-    }
-    
-    /// 遗传webView
-    public func removeWebView(){
-        if isViewLoaded {
-            wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
-        }
-        wkWebView.navigationDelegate = nil
-        wkWebView.uiDelegate = nil
-        self.view.removeFromSuperview()
-    }
-    
-    //请求链接处理
-    func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
-        // 连接是否为空
-        guard let urlStr = snapShotsArray?.last else { return }
-        // 转换成URL
-        let url = URL(string: urlStr as! String)
-        // 转换成NSURLRequest
-        let lastRequest = NSURLRequest(url: url!)
-        // 如果url是很奇怪的就不push
-        if request.url?.absoluteString == "about:blank"{ return }
-        // 如果url一样就不进行push
-        if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
-        // snapshotView
-        let currentSnapShotView = wkWebView.snapshotView(afterScreenUpdates: true);
-        //向数组添加字典
-        snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
-    }
-    
-    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
-        if keyPath == "estimatedProgress"{
-            // 设置进度条透明度
-            progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
-            // 给进度条添加进度和动画
-            progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
-            // 结束进度
-            if Float(wkWebView.estimatedProgress) >= 1.0{
-                progressView.alpha = 0.0
-                progressView .setProgress(0.0, animated: false)
-            }
-        }else {
-            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
-            
-        }
-    }
-
-}

+ 77 - 0
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseNewWebViewController.swift

@@ -0,0 +1,77 @@
+//
+//  BaseNewWebViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/31.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class BaseNewWebViewController: BaseViewController {
+
+    deinit {
+        NXLLog("deinit")
+    }
+    
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+    
+    //加载普通URL
+    var urlString : String?
+    //加载本地URL
+    var htmlName : String?
+    
+    /// 是否自定义请求 只使用于网络请求
+    var isCustomURLRequest : Bool? = false
+    //加载普通URL
+    var urlRequest : URLRequest?
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupViews()
+        setupLayouts()
+        setupData()
+    }
+    
+    override func setupViews() {
+        view.addSubview(webView)
+    }
+    
+    override func setupLayouts() {
+        
+    }
+    
+    override func setupData() {
+
+    }
+
+    
+    lazy var webView: NXLWebView = {
+        let webView = NXLWebView()
+        if isCustomURLRequest ?? false {
+            if urlRequest != nil {
+                webView.loadRequest(urlRequest: urlRequest)
+            }
+        } else {
+            if urlString != nil {
+                webView.wkWebViewLoadType(wkWebViewLoadType: NXLWebView.WKWebViewLoadType.URLString(urlStr: urlString ?? "about:blank"))
+            }
+            
+            if htmlName != nil {
+                webView.wkWebViewLoadType(wkWebViewLoadType: NXLWebView.WKWebViewLoadType.HTMLName(name: htmlName ?? "about:blank"))
+            }
+        }
+        
+        return webView
+    }()
+    
+    override func willMove(toParent parent: UIViewController?) {
+        if !(parent != nil) {
+//            webView.goBack()
+        }
+    }
+    
+}

+ 0 - 120
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseWebViewController.swift

@@ -1,120 +0,0 @@
-//
-//  BaseWebViewController.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/3/8.
-//  Copyright © 2019 南鑫林. All rights reserved.
-//
-
-import UIKit
-import WebKit
-
-class BaseWebViewController: BaseViewController {
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        setupViews()
-        setupLayouts()
-        setupData()
-    }
-    
-    override func didReceiveMemoryWarning() {
-        super.didReceiveMemoryWarning()
-        // Dispose of any resources that can be recreated.
-    }
-    
-    //加载普通URL
-    var URLString : String?
-    //加载本地URL
-    var HTMLName : String?
-    //加载本地的js
-    var scriptMessageHandlerArray : Array<Any>?
-    //POST加载字典
-    var parameters = [String : Any]()
-    
-    //MARK: - view
-    override func setupViews() {
-        view.addSubview(wkWebView)
-    }
-    override func setupLayouts() {
-    }
-    override func setupData() {
-        navigationBar.onClickLeftButton = {
-            self.wkWebView.webView.stopLoading()
-            if self.wkWebView.webView.canGoBack {
-                self.wkWebView.webView.goBack()
-            }else {
-                self.navigationController?.popViewController(animated: true)
-            }
-        }
-    }
-    
-    //MARK: - lazy
-    
-    lazy var wkWebView: WebView = {
-        let wkWebView = WebView.init(frame: CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight - kNavBarTotalHeight))
-        wkWebView.delegate = self
-        wkWebView.webConfig = webConfig
-        //// 加载普通URL
-        if (URLString != nil) {
-            wkWebView.webloadType(self, .URLString(url: URLString!))
-        }
-        
-        // 加载本地URL
-        if (HTMLName != nil && scriptMessageHandlerArray != nil) {
-            webConfig.scriptMessageHandlerArray = scriptMessageHandlerArray as! [String]
-            wkWebView.webloadType(self, .HTMLName(name: HTMLName!))
-        }
-        
-        // POST加载
-        if !parameters.isEmpty &&  URLString != nil {
-            wkWebView.webloadType(self, .POST(url: URLString!, parameters: parameters))
-        }
-        
-        return wkWebView
-    }()
-    
-    lazy var webConfig: WKWebViewConfig = {
-        var webConfig = WKWebViewConfig()
-        return webConfig
-    }()
-    
-}
-
-extension BaseWebViewController:WKWebViewDelegate{
-    /// 服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void){
-        
-    }
-    
-    /// 页面开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!){
-        
-    }
-    
-    /// 页面加载完成
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){
-        
-    }
-    
-    /// 跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error){
-        
-    }
-    
-    /// 内容加载失败
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error){
-        
-    }
-    
-    /// 执行JS注入方法
-    func webViewUserContentController(_ scriptMessageHandlerArray:[String], didReceive message: WKScriptMessage){
-        
-    }
-    
-    /// JS执行回调方法
-    func webViewEvaluateJavaScript(_ result:Any?,error:Error?){
-        
-    }
-}
-

+ 4 - 0
RainbowPlanet/RainbowPlanet/Macro/RainbowPlanet-Bridging-Header.h

@@ -88,6 +88,10 @@
 
 #import "PGDatePickManager.h"
 
+#import "WKWebView+PAWebCookie.h"
+#import "WKWebView+PAWebCache.h"
+#import "NSObject+PARuntime.h"
+
 
 
 

+ 1 - 1
RainbowPlanet/RainbowPlanet/Manager/RongCloudIMManager/RongCloudIMManager.swift

@@ -79,7 +79,7 @@ class RongCloudIMManager: NSObject {
         if UserModel.shared().getModel()?.rongCloudToken != nil {
             loginRCIM {}
         }else {
-            if UserModel.shared().getModel()?.token != nil {
+            if UserModel.shared().getModel()?.token != nil && UserModel.shared().getModel()?.token != ""  {
                 SwiftMoyaNetWorkServiceUser.shared().userRefreshApi { (data) -> (Void) in
                     RongCloudIMManager.shared.loginRCIM {}
                 }

+ 1 - 1
RainbowPlanet/RainbowPlanet/Manager/WebViewJavascriptBridgeManager/WebViewJavascriptBridgeManager.swift

@@ -98,7 +98,7 @@ class WebViewJavascriptBridgeManager: NSObject {
         })
     }
     
-    func jump(bridge: WebViewJavascriptBridge? = nil,wvjbModel:WVJBModel?,viewController:BaseJSWebBaseViewController? = nil) {
+    func jump(bridge: WebViewJavascriptBridge? = nil,wvjbModel:WVJBModel?,viewController:BaseNewWebViewController? = nil) {
         // 链接
         if wvjbModel?.modelType == .link {
             Mediator.push(H5RouterModuleType.pushWeb(URLString: wvjbModel!.params!.url!))

+ 35 - 35
RainbowPlanet/RainbowPlanet/Model/UserModel/UserModel.swift

@@ -36,7 +36,6 @@ public class UserModel : NSObject, NSCoding, Mappable{
     
     var rongCloudToken : String?
     var rcIMUid : String?
-    
     var version : String?
 
 
@@ -203,40 +202,41 @@ public class UserModel : NSObject, NSCoding, Mappable{
         
         var userInfoDic = Dictionary<String,Any>()
         userInfoDic.updateValue("userInfo", forKey: "type")
-        var userModelDic = Dictionary<String,Any>()
-        if userModel?.gender == nil {
-            userModelDic.updateValue("" as Any, forKey: "gender")
-        }
-        if userModel?.isPassword == nil {
-            userModelDic.updateValue("" as Any, forKey: "is_password")
-        }
-        if userModel?.tokenTtl == nil {
-            userModelDic.updateValue("" as Any, forKey: "token_ttl")
-        }
-        if userModel?.uid == nil {
-            userModelDic.updateValue("" as Any, forKey: "uid")
-        }
-        if userModel?.isFollowSuggestTopic == nil {
-            userModelDic.updateValue("" as Any, forKey: "is_follow_suggest_topic")
-        }
-        if userModel?.isNewMember == nil {
-            userModelDic.updateValue("" as Any, forKey: "is_new_member")
-        }
-        if userModel?.inviteUid == nil {
-            userModelDic.updateValue("" as Any, forKey: "invite_uid")
-        }
-        
-        if userModel?.bindWeixinUserModel == nil {
-            userModel?.bindWeixinUserModel = BindThirdPartyUserModel()
-        }
-        
-        if userModel?.bindQQUserModel == nil {
-            userModel?.bindQQUserModel = BindThirdPartyUserModel()
-        }
-        
-        userModelDic.append(dict: (userModel?.toJSON())!)
-        userInfoDic.updateValue(userModelDic as Any, forKey: "params")
-        NXLLog(JSON(userInfoDic).debugDescription)
+//        var userModelDic = Dictionary<String,Any>()
+//        if userModel?.gender == nil {
+//            userModelDic.updateValue("" as Any, forKey: "gender")
+//        }
+//        if userModel?.isPassword == nil {
+//            userModelDic.updateValue("" as Any, forKey: "is_password")
+//        }
+//        if userModel?.tokenTtl == nil {
+//            userModelDic.updateValue("" as Any, forKey: "token_ttl")
+//        }
+//        if userModel?.uid == nil {
+//            userModelDic.updateValue("" as Any, forKey: "uid")
+//        }
+//        if userModel?.isFollowSuggestTopic == nil {
+//            userModelDic.updateValue("" as Any, forKey: "is_follow_suggest_topic")
+//        }
+//        if userModel?.isNewMember == nil {
+//            userModelDic.updateValue("" as Any, forKey: "is_new_member")
+//        }
+//        if userModel?.inviteUid == nil {
+//            userModelDic.updateValue("" as Any, forKey: "invite_uid")
+//        }
+//
+//        if userModel?.bindWeixinUserModel == nil {
+//            userModel?.bindWeixinUserModel = BindThirdPartyUserModel()
+//        }
+//
+//        if userModel?.bindQQUserModel == nil {
+//            userModel?.bindQQUserModel = BindThirdPartyUserModel()
+//        }
+//
+//        userModelDic.append(dict: (userModel?.toJSON())!)
+//        userInfoDic.updateValue(userModelDic as Any, forKey: "params")
+//        NXLLog(JSON(userInfoDic).debugDescription)
+        userInfoDic.updateValue(userModel?.toJSON() as Any, forKey: "params")
         return userInfoDic
     }
 

+ 10 - 92
RainbowPlanet/RainbowPlanet/Modules/BackyardModule/Backyard/ViewController/BackyardViewController.swift

@@ -12,7 +12,7 @@ import WebViewJavascriptBridge
 import SwiftyJSON
 import MJRefresh
 
-class BackyardViewController: BaseJSWebViewController {
+class BackyardViewController: BaseNewWebViewController {
     
     deinit {
         NXLLog("deinit")
@@ -23,11 +23,10 @@ class BackyardViewController: BaseJSWebViewController {
     weak var observe : NSObjectProtocol?
     
     override func viewDidLoad() {
+        self.urlString = kH5PlanetUrl
         super.viewDidLoad()
-//        removeWKWebViewCookies()
-        self.URLString = kH5PlanetUrl
         navigationBar.isHidden = true
-         setupViews()
+        setupViews()
         setupData()
     }
     
@@ -49,38 +48,31 @@ class BackyardViewController: BaseJSWebViewController {
     //MARK: - view
     override func setupViews() {
         super.setupViews()
-        self.wkWebView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-kTabBarTotalHeight)
-        self.wkWebView.navigationDelegate = self
+        self.webView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-kTabBarTotalHeight)
     }
     override func setupData() {
         super.setupData()
 
-        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: bridge)
+        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: webView.bridge)
 
-        WebViewJavascriptBridgeManager.shared.registerHandlerApp(bridge: bridge) { (wvjbModel) in
+        WebViewJavascriptBridgeManager.shared.registerHandlerApp(bridge: webView.bridge) { (wvjbModel) in
             WebViewJavascriptBridgeManager.shared.jump(wvjbModel: wvjbModel)
         }
         observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("followApi"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
             if notification.userInfo == nil {
-                WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.bridge)
+                WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.webView.bridge)
             }
         }
         
         observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("login"), object: nil, queue: OperationQueue.main, using: {
             [weak self] (notification) in
-            WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.bridge)
+            WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.webView.bridge)
 
         })
         
         observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("loginOut"), object: nil, queue: OperationQueue.main, using: {
             [weak self] (notification) in
-            WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.bridge)
-        })
-        
-        //将要进入前台的时候
-        observe = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main, using: {
-            [weak self] (notification) in
-//            WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.bridge)
+            WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: self?.webView.bridge)
         })
 
         observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("BackyardViewModuleTop"), object: nil, queue: OperationQueue.main, using: {
@@ -89,82 +81,8 @@ class BackyardViewController: BaseJSWebViewController {
             if silent == nil {
                 silent = 0
             }
-            WebViewJavascriptBridgeManager.shared.callHandlerH5Refresh(bridge: self?.bridge, refreshModelType: .planet,silent:silent)
+            WebViewJavascriptBridgeManager.shared.callHandlerH5Refresh(bridge: self?.webView.bridge, refreshModelType: .planet,silent:silent)
         })
         
     }
 }
-
-extension BackyardViewController : WKNavigationDelegate {
-    
-    //服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        
-        let navigationURL = navigationAction.request.url?.absoluteString
-        if let requestURL = navigationURL?.removingPercentEncoding {
-            //拨打电话
-            //兼容安卓的服务器写法:<a class = "mobile" href = "tel://电话号码"></a>
-            //或者:<a class = "mobile" href = "tel:电话号码"></a>
-            if requestURL.hasPrefix("tel://") {
-                //取消WKWebView 打电话请求
-                decisionHandler(.cancel);
-                //用openURL 这个API打电话
-                if let mobileURL:URL = URL(string: requestURL) {
-                    if #available(iOS 10, *) {
-                        UIApplication.shared.open(mobileURL, options: [:], completionHandler: nil)
-                    } else {
-                        UIApplication.shared.openURL(mobileURL)
-                    }
-                }
-            }
-            
-        }
-        switch navigationAction.navigationType {
-        case WKNavigationType.linkActivated:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.formSubmitted:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.backForward:
-            break
-        case WKNavigationType.reload:
-            break
-        case WKNavigationType.formResubmitted:
-            break
-        case WKNavigationType.other:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        @unknown default:
-            break
-        }
-        decisionHandler(.allow)
-    }
-    
-    //开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-    }
-    
-    //这个是网页加载完成,导航的变化
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-
-    }
-    
-    //跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
-        
-    }
-    // 内容加载失败时候调用
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
-        progressView.isHidden = true
-    }
-    
-    // 打开新窗口委托
-    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
-        if navigationAction.targetFrame?.isMainFrame == nil {
-            webView.load(navigationAction.request)
-        }
-        return nil
-    }
-
-}

+ 0 - 138
RainbowPlanet/RainbowPlanet/Modules/BackyardModule/BackyardActivity/BackyardActivityViewController.swift

@@ -1,138 +0,0 @@
-//
-//  BackyardActivityViewController.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/10/9.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import UIKit
-import WebKit
-import WebViewJavascriptBridge
-import SwiftyJSON
-
-class BackyardActivityViewController: BaseJSWebViewController {
-
-    deinit {
-        NXLLog("deinit")
-        if observe != nil {
-            NotificationCenter.default.removeObserver(observe!)
-        }
-    }
-    weak var observe : NSObjectProtocol?
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        
-        self.URLString = kH5PlanetUrl
-        navigationBar.isHidden = true
-        setupViews()
-        setupData()
-    }
-    
-    override func viewWillAppear(_ animated: Bool) {
-        super.viewWillAppear(animated)
-        navigationController?.navigationBar.isHidden = true
-        if UserModel.isTokenNil() {
-            statusBarStyle = .default
-        }else {
-            statusBarStyle = .lightContent
-        }
-    }
-    
-    override func didReceiveMemoryWarning() {
-        super.didReceiveMemoryWarning()
-        // Dispose of any resources that can be recreated.
-    }
-    
-    //MARK: - view
-    override func setupViews() {
-        super.setupViews()
-        self.wkWebView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-kTabBarTotalHeight)
-        self.wkWebView.navigationDelegate = self
-    }
-    override func setupData() {
-        super.setupData()
-        
-        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: bridge)
-        
-        WebViewJavascriptBridgeManager.shared.registerHandlerApp(bridge: bridge) { (wvjbModel) in
-            WebViewJavascriptBridgeManager.shared.jump(wvjbModel: wvjbModel)
-        }
-        
-    }
-}
-
-extension BackyardActivityViewController : WKNavigationDelegate {
-    
-    //服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        
-        let navigationURL = navigationAction.request.url?.absoluteString
-        if let requestURL = navigationURL?.removingPercentEncoding {
-            //拨打电话
-            //兼容安卓的服务器写法:<a class = "mobile" href = "tel://电话号码"></a>
-            //或者:<a class = "mobile" href = "tel:电话号码"></a>
-            if requestURL.hasPrefix("tel://") {
-                //取消WKWebView 打电话请求
-                decisionHandler(.cancel);
-                //用openURL 这个API打电话
-                if let mobileURL:URL = URL(string: requestURL) {
-                    if #available(iOS 10, *) {
-                        UIApplication.shared.open(mobileURL, options: [:], completionHandler: nil)
-                    } else {
-                        UIApplication.shared.openURL(mobileURL)
-                    }
-                }
-            }
-            
-        }
-        switch navigationAction.navigationType {
-        case WKNavigationType.linkActivated:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.formSubmitted:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.backForward:
-            break
-        case WKNavigationType.reload:
-            break
-        case WKNavigationType.formResubmitted:
-            break
-        case WKNavigationType.other:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        @unknown default:
-            break
-        }
-        decisionHandler(.allow)
-    }
-    
-    //开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-    }
-    
-    //这个是网页加载完成,导航的变化
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-        
-    }
-    
-    //跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
-        
-    }
-    // 内容加载失败时候调用
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
-        progressView.isHidden = true
-    }
-    
-    // 打开新窗口委托
-    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
-        if navigationAction.targetFrame?.isMainFrame == nil {
-            webView.load(navigationAction.request)
-        }
-        return nil
-    }
-    
-}

+ 10 - 103
RainbowPlanet/RainbowPlanet/Modules/H5Modules/H5Common/ViewController/H5CommonViewController.swift

@@ -13,11 +13,10 @@ import SwiftyMediator
 import Kingfisher
 
 
-class H5CommonViewController: BaseJSWebBaseViewController {
+class H5CommonViewController: BaseNewWebViewController {
     
     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
-        KingfisherManager.shared.cache.clearDiskCache()
         KingfisherManager.shared.cache.clearMemoryCache()
     }
     
@@ -33,28 +32,18 @@ class H5CommonViewController: BaseJSWebBaseViewController {
         setupViews()
         setupLayouts()
         setupData()
+        
     }
     
     override func setupLayouts() {
         super.setupLayouts()
+        webView.frame = CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight-kNavBarTotalHeight)
+
     }
     
     //MARK: - view
     override func setupViews() {
         super.setupViews()
-        self.wkWebView.navigationDelegate = self
-        self.wkWebView.scrollView.delegate = self
-//        if #available(iOS 11.0, *) {
-//            UIScrollView.appearance().contentInsetAdjustmentBehavior = .automatic
-//        } else {
-//            if self.responds(to: #selector(setter: self.automaticallyAdjustsScrollViewInsets)) {
-//                self.automaticallyAdjustsScrollViewInsets = true
-//            }
-//        }
-//        WRNavigationBar.defaultNavBarBarTintColor = kThemeColor
-//        WRNavigationBar.defaultNavBarTitleColor = UIColor.white
-//        WRNavigationBar.defaultNavBarTintColor = UIColor.white
-//        WRNavigationBar.defaultNavBarBackgroundImage = UIImage.imageWithColor(color: kThemeColor)
         UINavigationBar.appearance().tintColor = UIColor.black
         
     }
@@ -62,23 +51,22 @@ class H5CommonViewController: BaseJSWebBaseViewController {
     override func setupData() {
         super.setupData()
         
-        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: bridge)
+        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: webView.bridge)
         observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("WVJBRefresh"), object: nil, queue: OperationQueue.main, using: {
             [weak self] (notification) in
             let refreshModelType = notification.object as? WVJBRefreshModelType
-            WebViewJavascriptBridgeManager.shared.callHandlerH5Refresh(bridge: self?.bridge, refreshModelType: refreshModelType)
+            WebViewJavascriptBridgeManager.shared.callHandlerH5Refresh(bridge: self?.webView.bridge, refreshModelType: refreshModelType)
         })
 
-        WebViewJavascriptBridgeManager.shared.registerHandlerApp(bridge: bridge) {
+        WebViewJavascriptBridgeManager.shared.registerHandlerApp(bridge: webView.bridge) {
            [weak self] (wvjbModel) in
-            WebViewJavascriptBridgeManager.shared.jump(bridge: self?.bridge,wvjbModel: wvjbModel,viewController: self)
+            WebViewJavascriptBridgeManager.shared.jump(bridge: self?.webView.bridge,wvjbModel: wvjbModel,viewController: self)
         }
         
         navigationBar.onClickLeftButton = {
             [weak self] in
-            self?.wkWebView.stopLoading()
-            if (self?.wkWebView.canGoBack)! {
-                self?.goBack()
+            if self?.webView.wkWebView.canGoBack ?? false {
+                self?.webView.goBack()
             }else {
                 NotificationCenter.default.post(name: NSNotification.Name("CommunityModulePlanetTop"), object: 1)
                 self?.navigationController?.popViewController(animated: true)
@@ -89,84 +77,3 @@ class H5CommonViewController: BaseJSWebBaseViewController {
     
 }
 
-extension H5CommonViewController : UIScrollViewDelegate {
-//    func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
-//        
-//        return false
-//    }
-}
-
-extension H5CommonViewController : WKNavigationDelegate  {
-    
-    //服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        
-        let navigationURL = navigationAction.request.url?.absoluteString
-        if let requestURL = navigationURL?.removingPercentEncoding {
-            //拨打电话
-            //兼容安卓的服务器写法:<a class = "mobile" href = "tel://电话号码"></a>
-            //或者:<a class = "mobile" href = "tel:电话号码"></a>
-            if requestURL.hasPrefix("tel://") {
-                //取消WKWebView 打电话请求
-                decisionHandler(.cancel);
-                //用openURL 这个API打电话
-                if let mobileURL:URL = URL(string: requestURL) {
-                    if #available(iOS 10, *) {
-                        UIApplication.shared.open(mobileURL, options: [:], completionHandler: nil)
-                    } else {
-                        UIApplication.shared.openURL(mobileURL)
-                    }
-                }
-            }
-            
-        }
-        switch navigationAction.navigationType {
-        case WKNavigationType.linkActivated:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.formSubmitted:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.backForward:
-            break
-        case WKNavigationType.reload:
-            break
-        case WKNavigationType.formResubmitted:
-            break
-        case WKNavigationType.other:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        @unknown default:
-            break
-        }
-        decisionHandler(.allow)
-    }
-    
-    //开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-        
-    }
-    
-    //这个是网页加载完成,导航的变化
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-
-    }
-    
-    //跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
-        NXLLog(error)
-    }
-    // 内容加载失败时候调用
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
-        progressView.isHidden = true
-    }
-    
-    // 打开新窗口委托
-    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
-        if navigationAction.targetFrame?.isMainFrame == nil {
-            webView.load(navigationAction.request)
-        }
-        return nil
-    }
-    
-}

+ 2 - 2
RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/UserPersonalCenter/View/RainbowBeanPhysical/RainbowBeanPhysicalView.swift

@@ -66,9 +66,9 @@ extension RainbowBeanPhysicalView: UICollectionViewDelegateFlowLayout,UICollecti
         collectionView.deselectItem(at: indexPath, animated: true)
         let vc = H5CommonViewController()
         if indexPath.row == 0 {
-            vc.URLString = kH5ContentId2Url
+            vc.urlString = kH5ContentId2Url
         }else  if indexPath.row == 1 {
-            vc.URLString = kH5ContentId5Url
+            vc.urlString = kH5ContentId5Url
         }
         let currentVC = findViewController()
         currentVC?.navigationController?.pushViewController(vc, animated: true)

+ 4 - 2
RainbowPlanet/RainbowPlanet/Modules/PublishModule/PublishArticle/ViewController/PublishArticleViewController.swift

@@ -8,7 +8,7 @@
 
 import UIKit
 
-class PublishArticleViewController: H5CommonViewController {
+class PublishArticleViewController: BaseNewWebViewController {
     
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
@@ -28,6 +28,8 @@ class PublishArticleViewController: H5CommonViewController {
     
     override func setupLayouts() {
         super.setupLayouts()
+        self.webView.frame = CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight-kNavBarTotalHeight)
+
         publishButton.snp.makeConstraints { (make) in
             make.centerY.equalTo(navigationBar.leftButton)
             make.right.equalTo(-14)
@@ -58,7 +60,7 @@ class PublishArticleViewController: H5CommonViewController {
             }
         }
         publishButton.rx.tap.subscribe(onNext: { [weak self] (_) in
-            WebViewJavascriptBridgeManager.shared.callHandlerPublish(bridge: self?.bridge)
+            WebViewJavascriptBridgeManager.shared.callHandlerPublish(bridge: self?.webView.bridge)
         }).disposed(by: disposeBag)
     }
     

+ 15 - 15
RainbowPlanet/RainbowPlanet/Router/H5RouterModuleType.swift

@@ -51,63 +51,63 @@ extension H5RouterModuleType: MediatorSourceType {
         switch self {
         case .pushWeb(let URLString): //公共的h5
             let vc = H5CommonViewController()
-            vc.URLString = URLString
+            vc.urlString = URLString
             return vc        
         case .pushCategory: //兑换商品分类页面
             let vc = H5CommonViewController()
-            vc.URLString = kH5CategoryUrl
+            vc.urlString = kH5CategoryUrl
             return vc
         case .pushContentId4: //赚豆秘籍
             let vc = H5CommonViewController()
-            vc.URLString = kH5ContentId4Url
+            vc.urlString = kH5ContentId4Url
             return vc
         case .pushContentId6: //用户协议
             let vc = H5CommonViewController()
-            vc.URLString = kH5ContentId6Url
+            vc.urlString = kH5ContentId6Url
             return vc
         case .pushContentId7: //内容协议
             let vc = H5CommonViewController()
-            vc.URLString = kH5ContentId7Url
+            vc.urlString = kH5ContentId7Url
             return vc
         case .pushContentId11: //隐私协议
             let vc = H5CommonViewController()
-            vc.URLString = kH5ContentId11Url
+            vc.urlString = kH5ContentId11Url
             return vc
         case .pushBeanRecord: //赚豆明细
             let vc = H5CommonViewController()
-            vc.URLString = kH5BeanRecordUrl
+            vc.urlString = kH5BeanRecordUrl
             return vc
         case .pushOrder: //我的订单
             let vc = H5CommonViewController()
-            vc.URLString = kH5OrderUrl
+            vc.urlString = kH5OrderUrl
             return vc
         case .pushSubject(let id): //兑换商品专题页面
             let vc = H5CommonViewController()
-            vc.URLString = kH5SubjectUrl + id
+            vc.urlString = kH5SubjectUrl + id
             return vc
         case .pushDetail(let id): //兑换商品详情页面
             let vc = H5CommonViewController()
-            vc.URLString = kH5DetailUrl + id
+            vc.urlString = kH5DetailUrl + id
             return vc
         case .pushActivityId(let id): //活动只有Id
             let vc = H5CommonViewController()
-            vc.URLString = kH5ActivityIdUrl + id
+            vc.urlString = kH5ActivityIdUrl + id
             return vc
         case .pushFeedback: //反馈页面
             let vc = H5CommonViewController()
-            vc.URLString = kH5FeedbackUrl
+            vc.urlString = kH5FeedbackUrl
             return vc
         case .pushOffline: //活动列表
             let vc = H5CommonViewController()
-            vc.URLString = kH5OfflineUrl
+            vc.urlString = kH5OfflineUrl
             return vc
         case .pushOfflineDetail(let id): //活动列表
             let vc = H5CommonViewController()
-            vc.URLString = kH5OfflineDetailIdUrl + id
+            vc.urlString = kH5OfflineDetailIdUrl + id
             return vc
         case .pushPostArticle: //发布文章
             let vc = PublishArticleViewController()
-            vc.URLString = kH5PostArticleUrl
+            vc.urlString = kH5PostArticleUrl
             return vc
         }
     }

+ 2 - 2
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceManger/SwiftMoyaNetWorkManager/ApiMacro.swift

@@ -15,8 +15,8 @@ let kBetaSever = false
 let kProductSever = false
 
 /// H5Service
-let kH5PersonalService = true
-let kH5DevelopSever = false
+let kH5PersonalService = false
+let kH5DevelopSever = true
 let kH5BetaSever = false
 let kH5ProductSever = false
 

+ 0 - 50
RainbowPlanet/RainbowPlanet/Tools/AuthorizationSwift/AuthorizationSwift.swift

@@ -1,50 +0,0 @@
-//
-//  AuthorizationSwift.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/4/26.
-//  Copyright © 2019 南鑫林. All rights reserved.
-//
-
-import UIKit
-
-class AuthorizationSwift: NSObject {
-    
-    static let shared : AuthorizationSwift = AuthorizationSwift()
-
-    
-    @available(iOS 10.0, *)
-    func userNotificationCenterAuthorization() {
-        UNUserNotificationCenter.current().getNotificationSettings {
-            settings in
-            switch settings.authorizationStatus {
-            case .authorized:
-                return
-            case .notDetermined:
-                //请求授权
-              
-                    UNUserNotificationCenter.current()
-                        .requestAuthorization(options: [.alert, .sound, .badge]) {
-                            (accepted, error) in
-                            if !accepted {
-                                print("用户不允许消息通知。")
-                            }
-                    }
-                 break
-            case .denied:
-                DispatchQueue.main.async(execute: { () -> Void in
-                    let url = URL(string: UIApplication.openSettingsURLString)
-                    if let url = url, UIApplication.shared.canOpenURL(url) {
-                        UIApplication.shared.open(url, options: [:],
-                                                  completionHandler: {
-                                                    (success) in
-                        })
-                    }
-                })
-                 break
-            default:
-                break
-            }
-        }
-    }
-}

+ 247 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/NXLWebView.swift

@@ -0,0 +1,247 @@
+//
+//  NXLWebView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/31.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import WebKit
+import WebViewJavascriptBridge
+
+class NXLWebView: BaseView {
+    
+    //网页加载类型
+    enum WKWebViewLoadType {
+        
+        /// 加载普通URL
+        case URLString(urlStr:String)
+        
+        /// 加载本地HTML(传名字就可以了)
+        case HTMLName(name:String)
+        
+        /// 加载POST请求(url:请求URL,parameters:请求参数)
+        case POST(url:String,parameters: [String:Any])
+    }
+    
+    deinit {
+        NXLLog("deinit")
+        wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
+        wkWebView.removeObserver(self, forKeyPath: "title")
+        wkWebView.clearHTMLCache()
+    }
+
+    override func setupViews() {
+        addSubview(wkWebView)
+        addSubview(progressView)
+    }
+    
+    override func setupLayouts() {
+        wkWebView.snp.makeConstraints { (make) in
+            make.edges.equalToSuperview()
+        }
+        progressView.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.height.equalTo(3)
+        }
+    }
+    
+    override func setupData() {
+        
+    }
+    
+    lazy var bridge: WebViewJavascriptBridge = {
+        let bridge = WebViewJavascriptBridge(forWebView: wkWebView)
+        bridge?.setWebViewDelegate(self)
+        return bridge!
+    }()
+    
+    ///  webView实例
+    lazy var wkWebView: WKWebView = {
+        let wkWebView = WKWebView(frame: CGRect.zero, configuration: wkWebViewConfiguration)
+        wkWebView.backgroundColor = UIColor.white
+        wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
+        wkWebView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
+        wkWebView.scrollView.showsVerticalScrollIndicator = false
+        wkWebView.scrollView.showsHorizontalScrollIndicator = false
+        wkWebView.scrollView.decelerationRate = UIScrollView.DecelerationRate.normal
+        wkWebView.isUserInteractionEnabled = true
+        wkWebView.isMultipleTouchEnabled = true
+        wkWebView.uiDelegate = self
+        wkWebView.scrollView.delegate = self
+        wkWebView.navigationDelegate = self
+        return wkWebView
+    }()
+    
+    /// 配置webView
+    lazy var wkWebViewConfiguration: WKWebViewConfiguration = {
+        let wkWebViewConfiguration = WKWebViewConfiguration()
+        wkWebViewConfiguration.userContentController = WKUserContentController()
+        wkWebViewConfiguration.preferences = WKPreferences()
+        wkWebViewConfiguration.preferences.minimumFontSize = 8
+        wkWebViewConfiguration.preferences.javaScriptEnabled = true
+        wkWebViewConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = true
+        wkWebViewConfiguration.processPool = WKProcessPool()
+        wkWebViewConfiguration.allowsAirPlayForMediaPlayback = true
+        return wkWebViewConfiguration
+    }()
+    
+    /// 加载进度条
+    lazy var progressView: UIProgressView = {
+        let progressView =  UIProgressView(progressViewStyle: UIProgressView.Style.default)
+        progressView.trackTintColor =  UIColor.clear
+        progressView.progressTintColor = kThemeColor
+        return progressView
+    }()
+
+}
+
+extension NXLWebView {
+    
+    /// 加载webView
+    func wkWebViewLoadType(wkWebViewLoadType:WKWebViewLoadType) {
+        switch wkWebViewLoadType {
+        case .URLString(let urlStr):
+            loadRequest(urlRequest: URLRequest(url: URL(string: urlStr) ?? URL(string: "about:blank")!))
+        case .HTMLName(let name):
+            loadLocalHTML(htmlName: name)
+        case .POST(let urlStr, parameters: let params):
+            loadRequest(urlRequest: URLRequest(url: URL(string: urlStr) ?? URL(string: "about:blank")!), parameters: params)
+        }
+    }
+    
+    /// 请求网络资源
+    ///
+    /// - Parameter urlRequest: 请求的具体地址和设置
+    func loadRequest(urlRequest:URLRequest?) {
+        wkWebView.load(urlRequest ?? URLRequest(url: URL(string: "about:blank")!))
+    }
+    
+    
+    /// 请求网络资源 post
+    ///
+    /// - Parameters:
+    ///   - urlRequest: 请求的具体地址和设置
+    ///   - params: 参数
+    func loadRequest(urlRequest:URLRequest?,parameters:Dictionary<String,Any>?) {
+        ///暂时不知道怎么处理
+    }
+    
+    
+    /// 加载本地HTML页面
+    ///
+    /// - Parameter htmlName:  html页面文件名称
+    func loadLocalHTML(htmlName:String?) {
+        
+        // 获得html内容
+        let path = Bundle.main.path(forResource: htmlName, ofType: "html")
+        do {
+            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
+            // 加载js
+            wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
+        } catch {
+            wkWebView.load(URLRequest(url: URL(string: "about:blank")!))
+        }
+        
+    }
+    
+    /// 刷新
+    func reload() {
+        wkWebView.reload()
+    }
+    
+    /// 后退
+    func goBack() {
+        if wkWebView.canGoBack {
+            wkWebView.goBack()
+        }else {
+            UIViewController.topMost?.navigationController?.popViewController(animated: true)
+        }
+    }
+    
+    /// 前进
+    func goForward() {
+        if wkWebView.canGoForward {
+            wkWebView.goForward()
+        }
+    }
+    
+}
+
+// MARK: - observe
+extension NXLWebView {
+    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
+        if keyPath == "estimatedProgress"{
+            // 设置进度条透明度
+            progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
+            // 给进度条添加进度和动画
+            progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
+            // 结束进度
+            if Float(wkWebView.estimatedProgress) >= 1.0{
+                progressView.alpha = 0.0
+                progressView.setProgress(0.0, animated: false)
+            }
+        }else if keyPath == "title" {
+            let vc = UIViewController.topMost as? BaseViewController
+            _ = vc?.navigationBar.title = wkWebView.title
+        }else {
+            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+        }
+    }
+}
+
+
+// MARK: - WKUIDelegate
+extension NXLWebView : WKUIDelegate {
+    
+}
+
+
+// MARK: - UIScrollViewDelegate
+extension NXLWebView : UIScrollViewDelegate {
+    
+}
+
+
+// MARK: - WKNavigationDelegate
+extension NXLWebView : WKNavigationDelegate {
+    
+    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
+        let response = navigationResponse.response as! HTTPURLResponse
+        if response.url?.scheme?.lowercased().contains("http") ?? false {
+            let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields as! [String : String], for: response.url!)
+            if #available(iOS 11.0, *) {
+                 //浏览器自动存储cookie
+            }else {
+                DispatchQueue.global().sync {
+                    [weak self] in
+                    if !cookies.isEmpty {
+                        for cookie in cookies {
+                            self?.wkWebView.insert(cookie)
+                        }
+                    }
+                }
+            }
+        }
+        decisionHandler(WKNavigationResponsePolicy.allow)
+    }
+    
+    
+    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
+        progressView.alpha = 0.0
+        progressView.setProgress(0.0, animated: false)
+    }
+    
+    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
+        progressView.alpha = 0.0
+        progressView.setProgress(0.0, animated: false)
+    }
+    
+    func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
+        WebViewJavascriptBridgeManager.shared.callHandlerH5(bridge: bridge)
+    }
+    
+}
+
+

+ 54 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/NSObject+PARuntime.h

@@ -0,0 +1,54 @@
+//
+//  NSObject+PARuntime.h
+//  Pkit
+//
+//  Created by llyouss on 2017/12/25.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface NSObject (PARuntime)
+
+
+/**
+ *  将 ‘字典数组‘ 转换成当前模型的对象数组
+ *
+ *  @param array 字典数组
+ *
+ *  @return 返回模型对象的数组
+ */
++ (NSArray *)ba_objectsWithArray:(NSArray *)array;
+
+/**
+ *  返回当前类的所有属性列表
+ *
+ *  @return 属性名称
+ */
++ (NSArray *)ba_propertysList;
+
+/**
+ *  返回当前类的所有成员变量数组
+ *
+ *  @return 当前类的所有成员变量!
+ *
+ *  Tips:用于调试, 可以尝试查看所有不开源的类的ivar
+ */
++ (NSArray *)ba_ivarList;
+
+/**
+ *  返回当前类的所有方法
+ *
+ *  @return 当前类的所有成员变量!
+ */
++ (NSArray *)ba_methodList;
+
+/**
+ *  返回当前类的所有协议
+ *
+ *  @return 当前类的所有协议!
+ */
++ (NSArray *)ba_protocolList;
+
+
+@end

+ 215 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/NSObject+PARuntime.m

@@ -0,0 +1,215 @@
+//
+//  NSObject+PARuntime.m
+//  Pkit
+//
+//  Created by llyouss on 2017/12/25.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import "NSObject+PARuntime.h"
+#import <objc/runtime.h>
+
+@implementation NSObject (PARuntime)
+
+
+#pragma mark - 根据传递进来的所有字典数组 字典转模型
++ (NSArray *)ba_objectsWithArray:(NSArray *)array
+{
+    if (array.count == 0)
+    {
+        return nil;
+    }
+    
+    // 判断是否是字典数组
+    NSAssert([array[0] isKindOfClass:[NSDictionary class]], @"必须传入字典数组");
+    
+    // 获取属性列表数组
+    NSArray *propertyList = [self ba_propertysList];
+    
+    NSMutableArray *arrayM = [NSMutableArray array];
+    
+    for (NSDictionary *dict in array)
+    {
+        // 创建模型
+        id model = [self new];
+        
+        // 遍历数组
+        for (NSString *key in dict)
+        {
+            // 判断属性列表数组中是否包含当前key 如果有, 意味着属性存在
+            if ([propertyList containsObject:key]) {
+                // 字典转模型
+                [model setValue:dict[key] forKey:key];
+            }
+        }
+        // 添加到可变数组中
+        [arrayM addObject:model];
+    }
+    return arrayM.copy;
+}
+
+#pragma mark - 获取本类所有 ‘属性‘ 的数组
+/** 程序运行的时候动态的获取当前类的属性列表
+ *  程序运行的时候,类的属性不会变化
+ */
+const void *ba_propertyListKey = @"ba_propertyListKey";
++ (NSArray *)ba_propertysList
+{
+    NSArray *result = objc_getAssociatedObject(self, ba_propertyListKey);
+    
+    if (result != nil)
+    {
+        return result;
+    }
+    
+    NSMutableArray *arrayM = [NSMutableArray array];
+    // 获取当前类的属性数组
+    // count -> 属性的数量
+    unsigned int count = 0;
+    objc_property_t *list = class_copyPropertyList([self class], &count);
+    
+    for (unsigned int i = 0; i < count; i++) {
+        // 根据下标获取属性
+        objc_property_t property = list[i];
+        
+        // 获取属性的名字
+        const char *cName = property_getName(property);
+        
+        // 转换成OC字符串
+        NSString *name = [NSString stringWithUTF8String:cName];
+        [arrayM addObject:name];
+    }
+    
+    /*! ⚠️注意: 一定要释放数组 class_copyPropertyList底层为C语言,所以我们一定要记得释放properties */
+    free(list);
+    
+    // ---保存属性数组对象---
+    objc_setAssociatedObject(self, ba_propertyListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
+    
+    return objc_getAssociatedObject(self, ba_propertyListKey);
+}
+
+#pragma mark - 获取本类所有 ‘方法‘ 的数组
+const void *ba_methodListKey = "ba_methodListKey";
++ (NSArray *)ba_methodList
+{
+    // 1. 使用运行时动态添加属性
+    NSArray *methodsList = objc_getAssociatedObject(self, ba_methodListKey);
+    
+    // 2. 如果数组中直接返回方法数组
+    if (methodsList != nil)
+    {
+        return methodsList;
+    }
+    
+    // 3. 获取当前类的方法数组
+    unsigned int count = 0;
+    Method *list = class_copyMethodList([self class], &count);
+    
+    NSMutableArray *arrayM = [NSMutableArray array];
+    for (unsigned int i = 0; i < count; i++)
+    {
+        // 根据下标获取方法
+        Method method = list[i];
+        
+        SEL methodName = method_getName(method);
+        
+        NSString *methodName_OC = NSStringFromSelector(methodName);
+        
+        //IMP imp = method_getImplementation(method);
+        const char *name_s =sel_getName(method_getName(method));
+        int arguments = method_getNumberOfArguments(method);
+        const char* encoding = method_getTypeEncoding(method);
+        NSLog(@"方法名:%@,参数个数:%d,编码方式:%@",[NSString stringWithUTF8String:name_s],
+              arguments,
+              [NSString stringWithUTF8String:encoding]);
+        
+        [arrayM addObject:methodName_OC];
+    }
+    
+    // 4. 释放数组
+    free(list);
+    
+    // 5. 保存方法的数组对象
+    objc_setAssociatedObject(self, ba_methodListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
+    
+    return objc_getAssociatedObject(self, ba_methodListKey);
+}
+
+
+#pragma mark - 获取本类所有 ‘成员变量‘ 的数组 <用来调试>
+/** 获取当前类的所有成员变量 */
+const char *ba_ivarListKey = "ba_ivarListKey";
++ (NSArray *)ba_ivarList
+{
+    
+    // 1. 查询根据key 保存的成员变量数组
+    NSArray *ivarList = objc_getAssociatedObject(self, ba_ivarListKey);
+    
+    // 2. 判断数组中是否有值, 如果有直接返回
+    if (ivarList != nil)
+    {
+        return ivarList;
+    }
+    
+    // 3. 如果数组中没有, 则根据当前类,获取当前类的所有 ‘成员变量‘
+    unsigned int count = 0;
+    Ivar *ivars = class_copyIvarList([self class], &count);
+    
+    // 4. 遍历 成员变量 数组, 获取成员变量的名
+    NSMutableArray *arrayM = [NSMutableArray array];
+    for (unsigned int i = 0; i < count; i++) {
+        Ivar ivar = ivars[i];
+        // - C语言的字符串都是 ‘char *‘ 类型的
+        const char *ivarName_C = ivar_getName(ivar);
+        
+        // - 将 C语言的字符串 转换成 OC字符串
+        NSString *ivarName_OC = [NSString stringWithUTF8String:ivarName_C];
+        // - 将本类 ‘成员变量名‘ 添加到数组
+        [arrayM addObject:ivarName_OC];
+    }
+    
+    // 5. 释放ivars
+    free(ivars);
+    
+    // 6. 根据key 动态获取保存在关联对象中的数组
+    objc_setAssociatedObject(self, ba_ivarListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
+    
+    return objc_getAssociatedObject(self, ba_ivarListKey);
+}
+
+#pragma mark - 获取本类所有 ‘协议‘ 的数组
+/** 用来获取动态保存在关联对象中的协议数组 |运行时的关联对象根据key动态取值| */
+const char *ba_protocolListKey = "ba_protocolListKey";
+
++ (NSArray *)ba_protocolList {
+    NSArray *protocolList = objc_getAssociatedObject(self, ba_protocolListKey);
+    if (protocolList != nil)
+    {
+        return protocolList;
+    }
+    
+    unsigned int count = 0;
+    Protocol * __unsafe_unretained *protocolLists = class_copyProtocolList([self class], &count);
+    
+    NSMutableArray *arrayM = [NSMutableArray array];
+    for (unsigned int i = 0; i < count; i++) {
+        // 获取 协议名
+        Protocol *protocol = protocolLists[i];
+        const char *protocolName_C = protocol_getName(protocol);
+        NSString *protocolName_OC = [NSString stringWithUTF8String:protocolName_C];
+        
+        // 将 协议名 添加到数组
+        [arrayM addObject:protocolName_OC];
+    }
+    
+    // 释放数组
+    free(protocolLists);
+    // 将保存 协议的数组动态添加到 关联对象
+    objc_setAssociatedObject(self, ba_protocolListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
+    
+    return objc_getAssociatedObject(self, ba_protocolListKey);
+}
+
+
+@end

+ 19 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCache.h

@@ -0,0 +1,19 @@
+//
+//  WKWebView+PAWebCache.h
+//  Pkit
+//
+//  Created by llyouss on 2017/12/28.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import <WebKit/WebKit.h>
+
+@interface WKWebView (PAWebCache)
+
+/** 清除webView缓存 */
+- (void)clearWebCacheFinish:(void(^)(BOOL finish,NSError *error))block;
+
+/** 清理缓存的方法,这个方法会清除缓存类型为HTML类型的文件*/
+- (void)clearHTMLCache;
+
+@end

+ 95 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCache.m

@@ -0,0 +1,95 @@
+//
+//  WKWebView+PAWebCache.m
+//  Pkit
+//
+//  Created by llyouss on 2017/12/28.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import "WKWebView+PAWebCache.h"
+@implementation WKWebView (PAWebCache)
+
+#pragma mark - private method
+//拿到当前北京时间
+- (NSDate *)beijingTime {
+    NSDate *date = [NSDate date];
+    NSTimeInterval inter = [[NSTimeZone systemTimeZone] secondsFromGMT];
+    return  [date dateByAddingTimeInterval:inter];
+}
+
+#pragma mark - 清除webView缓存
+- (void)clearWebCacheFinish:(void (^)(BOOL, NSError *))block
+{
+    if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
+            NSSet *websiteDataTypes = [NSSet setWithArray:
+                                       @[WKWebsiteDataTypeDiskCache,
+                                         WKWebsiteDataTypeOfflineWebApplicationCache,
+                                         WKWebsiteDataTypeMemoryCache,
+                                         WKWebsiteDataTypeLocalStorage,
+                                         //WKWebsiteDataTypeCookies,
+                                         WKWebsiteDataTypeSessionStorage,
+                                         WKWebsiteDataTypeIndexedDBDatabases,
+                                         WKWebsiteDataTypeWebSQLDatabases
+                                         ]];
+            //// All kinds of data
+            //NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
+            //// Date from
+            NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
+            //// Execute
+            [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
+                block ? block(YES,nil): NULL;
+            }];
+    } else {
+        NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
+        NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
+        NSError *errors;
+        [[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
+ 
+        block ? block(YES,errors): NULL;
+    }
+}
+
+/** 清理缓存的方法,这个方法会清除缓存类型为HTML类型的文件*/
+- (void)clearHTMLCache
+{
+    /* 取得Library文件夹的位置*/
+    NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
+    /* 取得bundle id,用作文件拼接用*/
+    NSString *bundleId  =  [[[NSBundle mainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
+    /*
+     * 拼接缓存地址,具体目录为App/Library/Caches/你的APPBundleID/fsCachedData
+     */
+    NSString *webKitFolderInCachesfs = [NSString stringWithFormat:@"%@/Caches/%@/fsCachedData",libraryDir,bundleId];
+    
+    NSError *error;
+    /* 取得目录下所有的文件,取得文件数组*/
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    //    NSArray *fileList = [[NSArray alloc] init];
+    //fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组
+    NSArray *fileList = [fileManager contentsOfDirectoryAtPath:webKitFolderInCachesfs error:&error];
+    /* 遍历文件组成的数组*/
+    for(NSString * fileName in fileList){
+        /* 定位每个文件的位置*/
+        NSString * path = [[NSBundle bundleWithPath:webKitFolderInCachesfs] pathForResource:fileName ofType:@""];
+        /* 将文件转换为NSData类型的数据*/
+        NSData * fileData = [NSData dataWithContentsOfFile:path];
+        /* 如果FileData的长度大于2,说明FileData不为空*/
+        if(fileData.length >2){
+            /* 创建两个用于显示文件类型的变量*/
+            int char1 =0;
+            int char2 =0;
+            
+            [fileData getBytes:&char1 range:NSMakeRange(0,1)];
+            [fileData getBytes:&char2 range:NSMakeRange(1,1)];
+            /* 拼接两个变量*/
+            NSString *numStr = [NSString stringWithFormat:@"%i%i",char1,char2];
+            /* 如果该文件前四个字符是6033,说明是Html文件,删除掉本地的缓存*/
+            if([numStr isEqualToString:@"6033"]){
+                [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@",webKitFolderInCachesfs,fileName]error:&error];
+                continue;
+            }
+        }
+    }
+}
+
+@end

+ 37 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCookie.h

@@ -0,0 +1,37 @@
+//
+//  WKWebView+PAWebCookie.h
+//  Pkit
+//
+//  Created by llyouss on 2017/12/28.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import <WebKit/WebKit.h>
+
+@interface WKWebView (PAWebCookie)
+
+/** ios11 同步cookies */
+- (void)syncCookiesToWKHTTPCookieStore:(WKHTTPCookieStore *)cookieStroe API_AVAILABLE(macosx(10.13), ios(11.0));
+
+/** 插入cookies存储于磁盘 */
+- (void)insertCookie:(NSHTTPCookie *)cookie;
+
+/** 获取本地磁盘的cookies */
+- (NSMutableArray *)sharedHTTPCookieStorage;
+
+/** 删除所有的cookies */
+- (void)clearWKCookies;
+
+/** 删除某一个cookies */
+- (void)deleteWKCookie:(NSHTTPCookie *)cookie completionHandler:(nullable void (^)(void))completionHandler;
+- (void)deleteWKCookiesByHost:(NSURL *)host completionHandler:(nullable void (^)(void))completionHandler;
+
+/** js获取domain的cookie */
+- (NSString *)jsCookieStringWithDomain:(NSString *)domain;
+- (WKUserScript *)searchCookieForUserScriptWithDomain:(NSString *)domain;
+
+/** PHP 获取domain的cookie */
+- (NSString *)phpCookieStringWithDomain:(NSString *)domain;
+
+
+@end

+ 235 - 0
RainbowPlanet/RainbowPlanet/Tools/WKWebView/PAWebViewCache/WKWebView+PAWebCookie.m

@@ -0,0 +1,235 @@
+//
+//  WKWebView+PAWebCookie.m
+//  Pkit
+//
+//  Created by llyouss on 2017/12/28.
+//  Copyright © 2017年 llyouss. All rights reserved.
+//
+
+#import "WKWebView+PAWebCookie.h"
+
+static NSString* const PAWKCookiesKey = @"org.skyfox.PAWKShareInstanceCookies";
+
+@implementation WKWebView (PAWebCookie)
+
+- (void)syncCookiesToWKHTTPCookieStore:(WKHTTPCookieStore *)cookieStore API_AVAILABLE(macosx(10.13), ios(11.0))
+{
+    NSMutableArray *cookieArr = [self sharedHTTPCookieStorage];
+    if (cookieArr.count == 0)return;
+    for (NSHTTPCookie *cookie in cookieArr) {
+        [cookieStore setCookie:cookie completionHandler:nil];
+    }
+}
+
+- (void)insertCookie:(NSHTTPCookie *)cookie
+{
+    @autoreleasepool {
+        
+        if (@available(iOS 11.0, *)) {
+            WKHTTPCookieStore *cookieStore = self.configuration.websiteDataStore.httpCookieStore;
+            [cookieStore setCookie:cookie completionHandler:nil];
+        }
+        
+        NSHTTPCookieStorage * shareCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
+        [shareCookie setCookie:cookie];
+        
+        NSMutableArray *TempCookies = [NSMutableArray array];
+        NSMutableArray *localCookies =[NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: PAWKCookiesKey]];
+        for (int i = 0; i < localCookies.count; i++) {
+            NSHTTPCookie *TempCookie = [localCookies objectAtIndex:i];
+            if ([cookie.name isEqualToString:TempCookie.name] &&
+                [cookie.domain isEqualToString:TempCookie.domain]) {
+                [localCookies removeObject:TempCookie];
+                i--;
+                break;
+            }
+        }
+        [TempCookies addObjectsFromArray:localCookies];
+        [TempCookies addObject:cookie];
+        NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: TempCookies];
+        [[NSUserDefaults standardUserDefaults] setObject:cookiesData forKey:PAWKCookiesKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSMutableArray *)sharedHTTPCookieStorage
+{
+    @autoreleasepool {
+        NSMutableArray *cookiesArr = [NSMutableArray array];
+        /** 获取NSHTTPCookieStorage cookies  WKHTTPCookieStore 的cookie 已经同步*/
+        NSHTTPCookieStorage * shareCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
+        for (NSHTTPCookie *cookie in shareCookie.cookies){
+            [cookiesArr addObject:cookie];
+        }
+        
+        /** 获取自定义存储的cookies */
+        NSMutableArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: PAWKCookiesKey]];
+        
+        //删除过期的cookies
+        for (int i = 0; i < cookies.count; i++) {
+            NSHTTPCookie *cookie = [cookies objectAtIndex:i];
+            if (!cookie.expiresDate) {
+                [cookiesArr addObject:cookie]; //当cookie布设置国旗时间时,视cookie的有效期为长期有效。
+                continue;
+            }
+            if ([cookie.expiresDate compare:self.currentTime]) {
+                [cookiesArr addObject:cookie];
+            }else
+            {
+                [cookies removeObject:cookie]; //清除过期的cookie。
+                i--;
+            }
+        }
+        
+        //存储最新有效的cookies
+        NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: cookies];
+        [[NSUserDefaults standardUserDefaults] setObject:cookiesData forKey:PAWKCookiesKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+        
+        return cookiesArr;
+    }
+}
+
+- (void)clearWKCookies
+{
+    if (@available(iOS 11.0, *)) {
+        NSSet *websiteDataTypes = [NSSet setWithObject:WKWebsiteDataTypeCookies];
+        NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
+        [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
+        }];
+    }
+    
+    //删除NSHTTPCookieStorage中的cookies
+    NSHTTPCookieStorage *NSCookiesStore = [NSHTTPCookieStorage sharedHTTPCookieStorage];
+    [NSCookiesStore removeCookiesSinceDate:[NSDate dateWithTimeIntervalSince1970:0]];
+    
+    NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: @[]];
+    [[NSUserDefaults standardUserDefaults] setObject:cookiesData forKey:PAWKCookiesKey];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (void)deleteWKCookie:(NSHTTPCookie *)cookie completionHandler:(nullable void (^)(void))completionHandler;
+{
+    if (@available(iOS 11.0, *)) {
+        
+        //删除WKHTTPCookieStore中的cookies
+        WKHTTPCookieStore *cookieStore = self.configuration.websiteDataStore.httpCookieStore;
+        [cookieStore deleteCookie:cookie completionHandler:nil];
+    }
+    
+    //删除NSHTTPCookieStorage中的cookie
+    NSHTTPCookieStorage *NSCookiesStore = [NSHTTPCookieStorage sharedHTTPCookieStorage];
+    [NSCookiesStore deleteCookie:cookie];
+
+    //删除磁盘中的cookie
+    NSMutableArray *localCookies =[NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: PAWKCookiesKey]];
+    for (int i = 0; i < localCookies.count; i++) {
+        NSHTTPCookie *TempCookie = [localCookies objectAtIndex:i];
+        if ([cookie.domain isEqualToString:TempCookie.domain] &&
+            [cookie.domain isEqualToString:TempCookie.domain] ) {
+            [localCookies removeObject:TempCookie];
+            i--;
+            break;
+        }
+    }
+    
+    NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: localCookies];
+    [[NSUserDefaults standardUserDefaults] setObject:cookiesData forKey:PAWKCookiesKey];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    completionHandler ? completionHandler() : NULL;
+}
+
+- (void)deleteWKCookiesByHost:(NSURL *)host completionHandler:(nullable void (^)(void))completionHandler{
+    
+    if (@available(iOS 11.0, *)) {
+        //删除WKHTTPCookieStore中的cookies
+        WKHTTPCookieStore *cookieStore = self.configuration.websiteDataStore.httpCookieStore;
+        [cookieStore getAllCookies:^(NSArray<NSHTTPCookie *> * cookies) {
+            
+            NSArray *WKCookies = cookies;
+            for (NSHTTPCookie *cookie in WKCookies) {
+                
+                NSURL *domainURL = [NSURL URLWithString:cookie.domain];
+                if ([domainURL.host isEqualToString:host.host]) {
+                    [cookieStore deleteCookie:cookie completionHandler:nil];
+                }
+            }
+        }];
+    }
+    
+    //删除NSHTTPCookieStorage中的cookies
+    NSHTTPCookieStorage *NSCookiesStore = [NSHTTPCookieStorage sharedHTTPCookieStorage];
+    NSArray *NSCookies = NSCookiesStore.cookies;
+    for (NSHTTPCookie *cookie in NSCookies) {
+        
+        NSURL *domainURL = [NSURL URLWithString:cookie.domain];
+        if ([domainURL.host isEqualToString:host.host]) {
+            [NSCookiesStore deleteCookie:cookie];
+        }
+    }
+    
+    //删除磁盘中的cookies
+    NSMutableArray *localCookies =[NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: PAWKCookiesKey]];
+    for (int i = 0; i < localCookies.count; i++) {
+        
+        NSHTTPCookie *TempCookie = [localCookies objectAtIndex:i];
+        NSURL *domainURL = [NSURL URLWithString:TempCookie.domain];
+        if ([host.host isEqualToString:domainURL.host]) {
+            [localCookies removeObject:TempCookie];
+            i--;
+            break;
+        }
+    }
+    
+    NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: localCookies];
+    [[NSUserDefaults standardUserDefaults] setObject:cookiesData forKey:PAWKCookiesKey];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    completionHandler ? completionHandler() : NULL;
+    
+}
+
+/** js获取domain的cookie */
+- (NSString *)jsCookieStringWithDomain:(NSString *)domain 
+{
+    @autoreleasepool {
+        NSMutableString *cookieSting = [NSMutableString string];
+        NSArray *cookieArr = [self sharedHTTPCookieStorage];
+        for (NSHTTPCookie *cookie in cookieArr) {
+            if ([cookie.domain containsString:domain]) {
+                [cookieSting appendString:[NSString stringWithFormat:@"document.cookie = '%@=%@';",cookie.name,cookie.value]];
+            }
+        }
+        return cookieSting;
+    }
+}
+
+- (WKUserScript *)searchCookieForUserScriptWithDomain:(NSString *)domain
+{
+    NSString *cookie = [self jsCookieStringWithDomain:domain];
+    WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookie injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
+    return cookieScript;
+}
+
+/** PHP 获取domain的cookie */
+- (NSString *)phpCookieStringWithDomain:(NSString *)domain
+{
+    @autoreleasepool {
+        NSMutableString *cookieSting =[NSMutableString string];
+        NSArray *cookieArr = [self sharedHTTPCookieStorage];
+        for (NSHTTPCookie *cookie in cookieArr) {
+            if ([cookie.domain containsString:domain]) {
+                [cookieSting appendString:[NSString stringWithFormat:@"%@ = %@;",cookie.name,cookie.value]];
+            }
+        }
+        if (cookieSting.length > 1)[cookieSting deleteCharactersInRange:NSMakeRange(cookieSting.length - 1, 1)];
+        
+        return (NSString *)cookieSting;
+    }
+}
+
+- (NSDate *)currentTime
+{
+    return [NSDate dateWithTimeIntervalSinceNow:0];
+}
+
+@end

+ 0 - 93
RainbowPlanet/RainbowPlanet/Tools/WKWebView/WKWebViewConfig.swift

@@ -1,93 +0,0 @@
-//
-//  WKWebViewConfig.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2018/7/13.
-//  Copyright © 2018年 南鑫林. All rights reserved.
-//
-
-import Foundation
-import WebKit
-
-struct WKWebViewConfig {
-    
-    /// WKScriptMessageHandler
-    /// 添加一个名称,就可以在JS通过这个名称发送消息:valueName自定义名字
-    /// window.webkit.messageHandlers.valueName.postMessage({body: 'xxx'})
-    public var scriptMessageHandlerArray: [String] = [String]()
-    
-    /// 默认最小字体字体
-    public var minFontSize: CGFloat = 0
-    
-    /// 显示滚动条
-    public var isShowScrollIndicator: Bool = true
-    
-    /// 开启手势交互
-    public var isAllowsBackForwardGestures: Bool = true
-    
-    /// 是否允许加载javaScript
-    public var isjavaScriptEnabled: Bool = true
-    
-    /// 是否允许JS自动打开窗口的,必须通过用户交互才能打开
-    public var isAutomaticallyJavaScript: Bool = true
-    
-    /// 是否影藏进度条
-    public var isProgressHidden:Bool = false
-    
-    /// 进度条高度
-    public var progressHeight:CGFloat = 3
-    
-    /// 默认颜色
-    public var progressTrackTintColor:UIColor = UIColor.clear
-    
-    /// 加载颜色
-    public var progressTintColor:UIColor = kThemeColor
-    
-}
-
-protocol WKWebViewDelegate:class {
-    
-    /// 服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
-    
-    /// 页面开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)
-    
-    /// 页面加载完成
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
-    
-    /// 跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)
-    
-    /// 内容加载失败
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error)
-    
-    /// 执行JS注入方法
-    func webViewUserContentController(_ scriptMessageHandlerArray:[String], didReceive message: WKScriptMessage)
-    
-    /// JS执行回调方法
-    func webViewEvaluateJavaScript(_ result:Any?,error:Error?)
-}
-
-extension WKWebViewDelegate {
-    /// 服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void){}
-    
-    /// 页面开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!){}
-    
-    /// 页面加载完成
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){}
-    
-    /// 跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error){}
-    
-    /// 内容加载失败
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error){}
-    
-    /// 执行JS注入方法
-    func webViewUserContentController(_ scriptMessageHandlerArray:[String], didReceive message: WKScriptMessage){}
-    
-    /// JS执行回调方法
-    func webViewEvaluateJavaScript(_ result:Any?,error:Error?){}
-}

+ 0 - 22
RainbowPlanet/RainbowPlanet/Tools/WKWebView/WKWebViewEnum.swift

@@ -1,22 +0,0 @@
-//
-//  WKWebViewEnum.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/6/20.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import Foundation
-
-//网页加载类型
-enum WKWebLoadType{
-    
-    /// 加载普通URL
-    case URLString(url:String)
-    
-    /// 加载本地HTML(传名字就可以了)
-    case HTMLName(name:String)
-    
-    /// 加载POST请求(url:请求URL,parameters:请求参数)
-    case POST(url:String,parameters: [String:Any])
-}

+ 0 - 366
RainbowPlanet/RainbowPlanet/Tools/WKWebView/WebView.swift

@@ -1,366 +0,0 @@
-//
-//  WebView.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2018/7/13.
-//  Copyright © 2018年 南鑫林. All rights reserved.
-//
-
-import UIKit
-import WebKit
-
-class WebView: UIView {
-    
-    /// 事件
-    fileprivate var target: AnyObject?
-    
-    /// 创建webveiew
-    var webView = WKWebView()
-    
-    /// 进度条
-    var progressView = UIProgressView()
-    
-    /// 创建一个webiview的配置项
-    fileprivate let configuretion = WKWebViewConfiguration()
-    
-    //执行JS 需要实现代理方法
-    fileprivate var POSTJavaScript = String()
-    
-    //是否是第一次加载
-    fileprivate var needLoadJSPOST:Bool?
-    
-    /// WebView配置项
-    var webConfig : WKWebViewConfig?
-    
-    //保存请求链接
-    fileprivate var snapShotsArray:Array<Any>?
-    
-    //设置代理
-    weak var delegate : WKWebViewDelegate?
-    
-    override public init(frame: CGRect) {
-        super.init(frame: frame)
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-    }
-    
-    open override func layoutSubviews() {
-        super.layoutSubviews()
-        webView.frame = CGRect(x: 0, y: 0, width: self.width, height: self.height)
-    }
-    
-    fileprivate func setupUI(webConfig:WKWebViewConfig)  {
-        // Webview的偏好设置
-        configuretion.preferences = WKPreferences()
-        configuretion.preferences.minimumFontSize = webConfig.minFontSize
-        configuretion.preferences.javaScriptEnabled = webConfig.isjavaScriptEnabled
-        configuretion.preferences.javaScriptCanOpenWindowsAutomatically = webConfig.isAutomaticallyJavaScript
-        configuretion.userContentController = WKUserContentController()
-        _ = webConfig.scriptMessageHandlerArray.map{configuretion.userContentController.add(self as WKScriptMessageHandler, name: $0)}
-        
-        webView = WKWebView(frame:frame,configuration: configuretion)
-        
-        //开启手势交互
-        webView.allowsBackForwardNavigationGestures = webConfig.isAllowsBackForwardGestures
-        
-        //滚动条
-        webView.scrollView.showsVerticalScrollIndicator = webConfig.isShowScrollIndicator
-        webView.scrollView.showsHorizontalScrollIndicator = webConfig.isShowScrollIndicator
-        
-        // 监听支持KVO的属性
-        webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
-        webView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
-
-        //内容自适应
-        webView.sizeToFit()
-        self.addSubview(webView)
-        
-        progressView = UIProgressView(progressViewStyle: .default)
-        progressView.frame = CGRect(x: CGFloat(0.0), y:0, width: CGFloat(webView.width), height: CGFloat(webConfig.progressHeight))
-        progressView.trackTintColor = webConfig.progressTrackTintColor
-        progressView.progressTintColor = webConfig.progressTintColor
-        webView.addSubview(progressView)
-        progressView.isHidden = webConfig.isProgressHidden
-        
-        webView.navigationDelegate = self as WKNavigationDelegate
-        webView.uiDelegate = self as WKUIDelegate
-    }
-    
-    /// 加载webView
-    func webloadType(_ target:AnyObject,_ loadType:WKWebLoadType) {
-        self.target = target
-        setupUI(webConfig:webConfig ?? WKWebViewConfig())
-        
-        switch loadType {
-            case .URLString(let urltring):
-                let urlstr = URL(string: urltring)
-                let request = URLRequest(url: urlstr!)
-                webView.load(request)
-            
-            case .HTMLName(let string):
-                loadHost(string: string)
-            
-            case .POST(let string, parameters: let postString):
-                needLoadJSPOST = true
-                // 给每一个key,value前后加上一个“
-                let dictMap = postString.map({"\"\($0.key)\":\"\($0.value)\""})
-                POSTJavaScript = "post('\(string)\',{\(dictMap.joined(separator: ","))})"
-                loadHost(string: "WKJSPOST")
-        }
-    }
-    
-    fileprivate func loadHost(string:String) {
-        let path = Bundle.main.path(forResource: string, ofType: "html")
-        // 获得html内容
-        do {
-            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
-            // 加载js
-            webView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
-        } catch { }
-    }
-    
-    /// 执行JavaScript代码
-    /// 例如 run_JavaScript(script:"document.getElementById('someElement').innerText")
-    ///
-    /// Parameter titleStr: title字符串
-    public func run_JavaScript(javaScript:String?) {
-        if let javaScript = javaScript {
-            webView.evaluateJavaScript(javaScript) { result,error in
-                NXLLog(error ?? "" as! Error)
-                self.delegate?.webViewEvaluateJavaScript(result, error: error)
-            }
-        }
-    }
-    
-    /// 刷新
-    public func reload() {
-        webView.reload()
-    }
-    
-    /// 后退
-    public func goBack() {
-        webView.goBack()
-    }
-    
-    /// 前进
-    public func goForward() {
-        webView.goForward()
-    }
-    
-    /// 遗传webView
-    public func removeWebView(){
-        webView.removeObserver(self, forKeyPath: "estimatedProgress")
-        webView.removeObserver(self, forKeyPath: "title")
-        if let scriptMessage = webConfig?.scriptMessageHandlerArray {
-            _ = scriptMessage.map{webView.configuration.userContentController .removeScriptMessageHandler(forName: $0)}
-        }
-        webView.navigationDelegate = nil
-        webView.uiDelegate = nil
-        self.removeFromSuperview()
-    }
-    
-    //请求链接处理
-    fileprivate func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
-        // 连接是否为空
-        guard let urlStr = snapShotsArray?.last else { return }
-        // 转换成URL
-        let url = URL(string: urlStr as! String)
-        // 转换成NSURLRequest
-        let lastRequest = NSURLRequest(url: url!)
-        // 如果url是很奇怪的就不push
-        if request.url?.absoluteString == "about:blank"{ return }
-        // 如果url一样就不进行push
-        if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
-        // snapshotView
-        let currentSnapShotView = webView.snapshotView(afterScreenUpdates: true);
-        //向数组添加字典
-        snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
-    }
-    
-    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
-        if keyPath == "estimatedProgress"{
-            // 设置进度条透明度
-            progressView.alpha = CGFloat(1.0 - webView.estimatedProgress)
-            // 给进度条添加进度和动画
-            progressView.setProgress(Float(webView.estimatedProgress), animated: true)
-            // 结束进度
-            if Float(webView.estimatedProgress) >= 1.0{
-                progressView.alpha = 0.0
-                progressView .setProgress(0.0, animated: false)
-            }
-            NXLLog(webView.estimatedProgress)
-        } else if keyPath == "title" {
-            let vc = webView.findViewController() as? BaseViewController
-            _ = vc?.navigationBar.title = webView.title
-        }else {
-            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
-
-        }
-    }
-}
-
-// MARK: - WKScriptMessageHandler
-extension WebView: WKScriptMessageHandler{
-    
-    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
-        if let scriptMessage = webConfig?.scriptMessageHandlerArray {
-            self.delegate?.webViewUserContentController(scriptMessage, didReceive: message)
-        }
-    }
-}
-
-// MARK: - WKNavigationDelegate
-extension WebView: WKNavigationDelegate{
-    
-    //服务器开始请求的时候调用
-    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-        self.delegate?.webView(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
-        
-        let navigationURL = navigationAction.request.url?.absoluteString
-        if let requestURL = navigationURL?.removingPercentEncoding {
-            //拨打电话
-            //兼容安卓的服务器写法:<a class = "mobile" href = "tel://电话号码"></a>
-            //或者:<a class = "mobile" href = "tel:电话号码"></a>
-            if requestURL.hasPrefix("tel://") {
-                //取消WKWebView 打电话请求
-                decisionHandler(.cancel);
-                //用openURL 这个API打电话
-                if let mobileURL:URL = URL(string: requestURL) {
-                    if #available(iOS 10, *) {
-                        UIApplication.shared.open(mobileURL, options: [:], completionHandler: nil)
-                    } else {
-                        UIApplication.shared.openURL(mobileURL)
-                    }
-                }
-            }
-            
-        }
-        switch navigationAction.navigationType {
-        case WKNavigationType.linkActivated:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.formSubmitted:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        case WKNavigationType.backForward:
-            break
-        case WKNavigationType.reload:
-            break
-        case WKNavigationType.formResubmitted:
-            break
-        case WKNavigationType.other:
-            pushCurrentSnapshotView(navigationAction.request as NSURLRequest)
-            break
-        @unknown default:
-            break
-        }
-        decisionHandler(.allow)
-    }
-    
-    //开始加载
-    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-        self.delegate?.webView(webView, didStartProvisionalNavigation: navigation)
-    }
-    
-    //这个是网页加载完成,导航的变化
-    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-        self.delegate?.webView(webView, didFinish: navigation)
-        // 判断是否需要加载(仅在第一次加载)
-        if needLoadJSPOST == true {
-            // 调用使用JS发送POST请求的方法
-            run_JavaScript(javaScript: POSTJavaScript)
-            // 将Flag置为NO(后面就不需要加载了)
-            needLoadJSPOST = false
-        }
-    }
-    
-    //跳转失败的时候调用
-    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
-        self.delegate?.webView(webView, didFail: navigation, withError: error)
-        NXLLog(error)
-    }
-    // 内容加载失败时候调用
-    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
-        self.delegate?.webView(webView, didFailProvisionalNavigation: navigation, withError: error)
-        progressView.isHidden = true
-        NXLLog(error)
-    }
-    
-    // 打开新窗口委托
-    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
-        if navigationAction.targetFrame?.isMainFrame == nil {
-            webView.load(navigationAction.request)
-        }
-        return nil
-    }
-}
-
-// MARK: - WKUIDelegate 不实现该代理方法 网页内调用弹窗时会抛出异常,导致程序崩溃
-extension WebView: WKUIDelegate{
-    
-    // 获取js 里面的提示
-    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
-        
-        let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
-            completionHandler()
-        }))
-        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
-            completionHandler()
-        }))
-        target?.present(alert, animated: true, completion: nil)
-    }
-    
-    // js 信息的交流
-    func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
-        
-        let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
-            completionHandler(true)
-        }))
-        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
-            completionHandler(false)
-        }))
-        target?.present(alert, animated: true, completion: nil)
-    }
-    
-    // 交互。可输入的文本。
-    func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
-        
-        let alert = UIAlertController(title: prompt, message: defaultText, preferredStyle: .alert)
-        
-        alert.addTextField { (textField: UITextField) -> Void in
-            textField.textColor = UIColor.red
-        }
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
-            completionHandler(alert.textFields![0].text!)
-        }))
-        target?.present(alert, animated: true, completion: nil)
-    }
-}
-
-func removeWKWebViewCookies() {
-    
-    //iOS9.0以上使用的方法
-    if #available(iOS 9.0, *) {
-        let dataStore = WKWebsiteDataStore.default()
-        dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), completionHandler: { (records) in
-            for record in records{
-                //清除本站的cookie
-//                if record.displayName.contains("sina.com"){//这个判断注释掉的话是清理所有的cookie
-                    WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {
-                        //清除成功
-                        NXLLog("清除成功\(record)")
-                    })
-//                }
-            }
-        })
-    } else {
-        //ios8.0以上使用的方法
-        let libraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
-        let cookiesPath = libraryPath! + "/Cookies"
-        try!FileManager.default.removeItem(atPath: cookiesPath)
-    }
-}

+ 2 - 2
RainbowPlanet/RainbowPlanet/ViewModel/UserMemberTotalBeanViewModel/UserMemberTotalBeanViewModel.swift

@@ -26,7 +26,7 @@ class UserMemberTotalBeanViewModel: NSObject {
     
     
     func userMemberGetTotalBeanApi() {
-        if UserModel.shared().getModel()?.token != nil {
+        if UserModel.shared().getModel()?.token != nil && UserModel.shared().getModel()?.token != "" {
             SwiftMoyaNetWorkServiceUser.shared().userMemberGetTotalBeanApi(completion: { (totalBeanModel) -> (Void) in
                 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "userMemberGetTotalBean"), object: totalBeanModel)
             })
@@ -36,7 +36,7 @@ class UserMemberTotalBeanViewModel: NSObject {
     func userMemberGetTotalBeanApiInterval() {
         application()
         Observable<Int>.interval(60, scheduler: MainScheduler.instance).subscribe(onNext: { [weak self] _ in
-            if UserModel.shared().getModel()?.token != nil && (UserModel.shared().getModel()?.isFollowSuggestTopic != nil || UserModel.shared().getModel()?.isFollowSuggestTopic != 0) && (self?.isBackstage)! {
+            if UserModel.shared().getModel()?.token != nil && UserModel.shared().getModel()?.token != "" && (UserModel.shared().getModel()?.isFollowSuggestTopic != nil || UserModel.shared().getModel()?.isFollowSuggestTopic != 0) && (self?.isBackstage)! {
                 SwiftMoyaNetWorkServiceUser.shared().userMemberGetTotalBeanApi(completion: { (totalBeanModel) -> (Void) in
                     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "userMemberGetTotalBean"), object: totalBeanModel)