BaseJSWebViewController.swift 5.0 KB

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