BaseJSWebBaseViewController.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //
  2. // BaseJSWebBaseViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/6/20.
  6. // Copyright © 2019 RainbowPlanet. All rights reserved.
  7. //
  8. import UIKit
  9. import WebKit
  10. import WebViewJavascriptBridge
  11. class BaseJSWebBaseViewController: BaseViewController {
  12. deinit {
  13. removeWebView()
  14. }
  15. //加载普通URL
  16. var URLString : String?
  17. //加载本地URL
  18. var HTMLName : String?
  19. //保存请求链接
  20. var snapShotsArray:Array<Any>?
  21. override func viewDidLoad() {
  22. super.viewDidLoad()
  23. setupViews()
  24. }
  25. override func setupViews() {
  26. view.addSubview(wkWebView)
  27. view.addSubview(progressView)
  28. WebViewJavascriptBridge.enableLogging()
  29. }
  30. override func setupData() {
  31. //// 加载普通URL
  32. if (URLString != nil) {
  33. NXLLog(URLString!)
  34. webloadType(.URLString(url: URLString!))
  35. }
  36. // 加载本地URL
  37. if (HTMLName != nil ) {
  38. webloadType(.HTMLName(name: HTMLName!))
  39. }
  40. navigationBar.onClickLeftButton = {
  41. self.wkWebView.stopLoading()
  42. if self.wkWebView.canGoBack {
  43. self.goBack()
  44. }else {
  45. self.navigationController?.popViewController(animated: true)
  46. }
  47. }
  48. }
  49. lazy var bridge: WebViewJavascriptBridge = {
  50. let bridge = WebViewJavascriptBridge(forWebView: self.wkWebView)
  51. bridge?.setWebViewDelegate(self)
  52. return bridge!
  53. }()
  54. lazy var wkWebView: WKWebView = {
  55. /// 创建webveiew
  56. let wkWebView = WKWebView(frame: CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight-kNavBarTotalHeight))
  57. // 监听支持KVO的属性
  58. wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
  59. wkWebView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
  60. return wkWebView
  61. }()
  62. /// 进度条
  63. lazy var progressView: UIProgressView = {
  64. let progressView = UIProgressView(progressViewStyle: .default)
  65. progressView.frame = CGRect(x: CGFloat(0.0), y:kNavBarTotalHeight, width: CGFloat(wkWebView.width), height: 3)
  66. progressView.trackTintColor = UIColor.clear
  67. progressView.progressTintColor = kThemeColor
  68. return progressView
  69. }()
  70. /// 加载webView
  71. func webloadType(_ loadType:WKWebLoadType) {
  72. switch loadType {
  73. case .URLString(let urltring):
  74. let urlstr = URL(string: urltring)
  75. let request = URLRequest(url: urlstr!)
  76. wkWebView.load(request)
  77. case .HTMLName(let string):
  78. loadHost(string: string)
  79. default:
  80. break
  81. }
  82. }
  83. /// 加载本得html
  84. ///
  85. /// - Parameter string: <#string description#>
  86. func loadHost(string:String) {
  87. let path = Bundle.main.path(forResource: string, ofType: "html")
  88. // 获得html内容
  89. do {
  90. let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
  91. // 加载js
  92. wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
  93. } catch { }
  94. }
  95. /// 刷新
  96. public func reload() {
  97. wkWebView.reload()
  98. }
  99. /// 后退
  100. public func goBack() {
  101. wkWebView.goBack()
  102. }
  103. /// 前进
  104. public func goForward() {
  105. wkWebView.goForward()
  106. }
  107. /// 遗传webView
  108. public func removeWebView(){
  109. wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
  110. wkWebView.navigationDelegate = nil
  111. wkWebView.uiDelegate = nil
  112. self.view.removeFromSuperview()
  113. }
  114. //请求链接处理
  115. func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
  116. // 连接是否为空
  117. guard let urlStr = snapShotsArray?.last else { return }
  118. // 转换成URL
  119. let url = URL(string: urlStr as! String)
  120. // 转换成NSURLRequest
  121. let lastRequest = NSURLRequest(url: url!)
  122. // 如果url是很奇怪的就不push
  123. if request.url?.absoluteString == "about:blank"{ return }
  124. // 如果url一样就不进行push
  125. if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
  126. // snapshotView
  127. let currentSnapShotView = wkWebView.snapshotView(afterScreenUpdates: true);
  128. //向数组添加字典
  129. snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
  130. }
  131. open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  132. if keyPath == "estimatedProgress"{
  133. // 设置进度条透明度
  134. progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
  135. // 给进度条添加进度和动画
  136. progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
  137. // 结束进度
  138. if Float(wkWebView.estimatedProgress) >= 1.0{
  139. progressView.alpha = 0.0
  140. progressView .setProgress(0.0, animated: false)
  141. }
  142. NXLLog(wkWebView.estimatedProgress)
  143. }else if keyPath == "title" {
  144. let vc = wkWebView.findViewController() as? BaseViewController
  145. _ = vc?.navigationBar.title = wkWebView.title
  146. }else {
  147. super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
  148. }
  149. }
  150. }