BaseWebViewUIViewController.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //
  2. // BaseWebViewUIViewController.swift
  3. // O2Platform
  4. //
  5. // Created by 刘振兴 on 2016/10/11.
  6. // Copyright © 2016年 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import WebKit
  10. import CocoaLumberjack
  11. protocol BaseWebViewUIViewControllerJSDelegate {
  12. func closeUIViewWindow()
  13. func actionBarLoaded(show: Bool)
  14. }
  15. protocol O2WKScriptMessageHandlerImplement {
  16. func userController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
  17. }
  18. open class BaseWebViewUIViewController: UIViewController {
  19. var webView:WKWebView!
  20. var delegate: BaseWebViewUIViewControllerJSDelegate?
  21. var o2WKScriptHandlers: [String : O2WKScriptMessageHandlerImplement] = [:]
  22. //继承的子类如果要添加MessageHandler必须在theWebView方法前使用
  23. func addScriptMessageHandler(key: String, handler: O2WKScriptMessageHandlerImplement) {
  24. o2WKScriptHandlers[key] = handler
  25. }
  26. open func theWebView(){
  27. let baseJsHandler = O2BaseJsMessageHandler(viewController: self)
  28. // bbs 回复
  29. addScriptMessageHandler(key: "ReplyAction", handler: baseJsHandler)
  30. // protal已经存在ActionBar
  31. addScriptMessageHandler(key: "actionBarLoaded", handler: baseJsHandler)
  32. // 打开工作 {"work":"", "workCompleted":"", "title":""}
  33. addScriptMessageHandler(key: "openO2Work", handler: baseJsHandler)
  34. // 4个分类 task taskCompleted read readCompleted
  35. addScriptMessageHandler(key: "openO2WorkSpace", handler: baseJsHandler)
  36. // 打开cms appId
  37. addScriptMessageHandler(key: "openO2CmsApplication", handler: baseJsHandler)
  38. // 打开cms docId docTitle
  39. addScriptMessageHandler(key: "openO2CmsDocument", handler: baseJsHandler)
  40. // 打开meeting
  41. addScriptMessageHandler(key: "openO2Meeting", handler: baseJsHandler)
  42. // 打开 calendar
  43. addScriptMessageHandler(key: "openO2Calendar", handler: baseJsHandler)
  44. // 打开扫一扫
  45. addScriptMessageHandler(key: "openScan", handler: baseJsHandler)
  46. addScriptMessageHandler(key: "openO2Alert", handler: baseJsHandler)
  47. // 打开钉钉
  48. addScriptMessageHandler(key: "openDingtalk", handler: baseJsHandler)
  49. // 关闭当前UIViewController
  50. addScriptMessageHandler(key:"closeNativeWindow", handler: baseJsHandler)
  51. // 上传图片到云盘,放入对应的业务区域
  52. addScriptMessageHandler(key: "uploadImage2FileStorage", handler: baseJsHandler)
  53. // 打印日志
  54. addScriptMessageHandler(key: "o2mLog", handler: baseJsHandler)
  55. //o2m.notification
  56. let o2Notification = O2JsApiNotification(viewController: self)
  57. addScriptMessageHandler(key: "o2mNotification", handler: o2Notification)
  58. //o2m.util
  59. let o2Util = O2JsApiUtil(viewController: self)
  60. addScriptMessageHandler(key: "o2mUtil", handler: o2Util)
  61. // o2m.biz
  62. let biz = O2JsApiBizUtil(viewController: self)
  63. addScriptMessageHandler(key: "o2mBiz", handler: biz)
  64. setupWebView()
  65. }
  66. public func setupWebView() {
  67. let userContentController = WKUserContentController()
  68. //cookie脚本
  69. if let cookies = HTTPCookieStorage.shared.cookies {
  70. let script = getJSCookiesString(cookies: cookies)
  71. let cookieScript = WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
  72. userContentController.addUserScript(cookieScript)
  73. }
  74. // console.log 打印到ios log debug用
  75. let consoleLog = "console.log = (function(oriLogFunc){return function(str){window.webkit.messageHandlers.o2mLog.postMessage(str);oriLogFunc.call(console,str);} })(console.log);"
  76. let logScript = WKUserScript(source: consoleLog, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
  77. userContentController.addUserScript(logScript)
  78. let webViewConfig = WKWebViewConfiguration()
  79. webViewConfig.userContentController = userContentController
  80. //加入js-app message handler
  81. for item in o2WKScriptHandlers {
  82. userContentController.add(self, name: item.key)
  83. }
  84. self.webView = WKWebView(frame: self.view.frame, configuration: webViewConfig)
  85. }
  86. ///Generates script to create given cookies
  87. public func getJSCookiesString(cookies: [HTTPCookie]) -> String {
  88. var result = ""
  89. let dateFormatter = DateFormatter()
  90. dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone?
  91. dateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz"
  92. for cookie in cookies {
  93. result += "document.cookie='\(cookie.name)=\(cookie.value); domain=\(cookie.domain); path=\(cookie.path); "
  94. if let date = cookie.expiresDate {
  95. result += "expires=\(dateFormatter.string(from: date)); "
  96. }
  97. if (cookie.isSecure) {
  98. result += "secure; "
  99. }
  100. result += "'; "
  101. }
  102. return result
  103. }
  104. }
  105. extension BaseWebViewUIViewController: WKScriptMessageHandler {
  106. public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  107. let name = message.name
  108. if let handler = o2WKScriptHandlers[name] {
  109. handler.userController(userContentController, didReceive: message)
  110. }else {
  111. let err = "没有找到对应的key,key:\(name)"
  112. self.showError(title: err)
  113. }
  114. }
  115. }