O2JsApiUtil.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //
  2. // O2JsApiUtil.swift
  3. // O2Platform
  4. //
  5. // Created by FancyLou on 2019/5/7.
  6. // Copyright © 2019 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import WebKit
  10. import CocoaLumberjack
  11. class O2JsApiUtil: O2WKScriptMessageHandlerImplement {
  12. let viewController: BaseWebViewUIViewController
  13. init(viewController: BaseWebViewUIViewController) {
  14. self.viewController = viewController
  15. }
  16. func userController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  17. if message.body is NSString {
  18. let json = message.body as! NSString
  19. DDLogDebug("message json:\(json)")
  20. if let jsonData = String(json).data(using: .utf8) {
  21. let dicArr = try! JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as! [String:AnyObject]
  22. if let type = dicArr["type"] as? String {
  23. switch type {
  24. case "date.datePicker":
  25. datePicker(json: String(json))
  26. case "date.timePicker":
  27. timePicker(json: String(json))
  28. case "date.dateTimePicker":
  29. dateTimePicker(json: String(json))
  30. case "calendar.chooseOneDay":
  31. calendarPickDay(json: String(json))
  32. case "calendar.chooseDateTime":
  33. calendarPickerDateTime(json: String(json))
  34. case "calendar.chooseInterval":
  35. calendarPickerDateInterval(json: String(json))
  36. case "device.getPhoneInfo":
  37. getPhoneInfo(json: String(json))
  38. case "device.scan":
  39. scan(json: String(json))
  40. case "navigation.setTitle":
  41. navigationSetTitle(json: String(json))
  42. case "navigation.close":
  43. navigationClose(json: String(json))
  44. case "navigation.goBack":
  45. navigationGoBack(json: String(json))
  46. default:
  47. DDLogError("notification类型不正确, type: \(type)")
  48. }
  49. }else {
  50. DDLogError("util类型不存在 json解析异常。。。。。")
  51. }
  52. }else {
  53. DDLogError("消息json解析异常。。。")
  54. }
  55. }else {
  56. DDLogError("message 消息 body 类型不正确。。。")
  57. }
  58. }
  59. private func datePicker(json: String) {
  60. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  61. let title = alert.data?.value ?? ""
  62. DDLogDebug("value:\(title)")
  63. let defaultDate: Date!
  64. if title.isBlank {
  65. defaultDate = Date()
  66. }else {
  67. defaultDate = title.toDate(formatter: "yyyy-MM-dd")
  68. }
  69. let picker = QDatePicker{ (date: String) in
  70. print(date)
  71. if alert.callback != nil {
  72. let callJs = "\(alert.callback!)('{\"value\":\"\(date)\"}')"
  73. self.evaluateJs(callBackJs: callJs)
  74. }
  75. }
  76. picker.themeColor = O2ThemeManager.color(for: "Base.base_color")!
  77. picker.datePickerStyle = .YMD
  78. picker.pickerStyle = .datePicker
  79. picker.showDatePicker(defaultDate: defaultDate)
  80. }else {
  81. DDLogError("datePicker, 解析json失败")
  82. }
  83. }
  84. private func timePicker(json: String) {
  85. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  86. let title = alert.data?.value ?? ""
  87. let defaultDate: Date!
  88. if title.isBlank {
  89. defaultDate = Date()
  90. }else {
  91. let ymd = Date().formatterDate(formatter: "yyyy-MM-dd")
  92. defaultDate = (ymd+" "+title).toDate(formatter: "yyyy-MM-dd HH:mm")
  93. }
  94. let picker = QDatePicker{ (date: String) in
  95. print(date)
  96. if alert.callback != nil {
  97. let callJs = "\(alert.callback!)('{\"value\":\"\(date)\"}')"
  98. self.evaluateJs(callBackJs: callJs)
  99. }
  100. }
  101. picker.themeColor = O2ThemeManager.color(for: "Base.base_color")!
  102. picker.datePickerStyle = .HM
  103. picker.pickerStyle = .datePicker
  104. picker.showDatePicker(defaultDate: defaultDate)
  105. }else {
  106. DDLogError("datePicker, 解析json失败")
  107. }
  108. }
  109. private func dateTimePicker(json: String) {
  110. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  111. let title = alert.data?.value ?? ""
  112. let defaultDate: Date!
  113. if title.isBlank {
  114. defaultDate = Date()
  115. }else {
  116. defaultDate = title.toDate(formatter: "yyyy-MM-dd HH:mm")
  117. }
  118. let picker = QDatePicker{ (date: String) in
  119. print(date)
  120. if alert.callback != nil {
  121. let callJs = "\(alert.callback!)('{\"value\":\"\(date)\"}')"
  122. self.evaluateJs(callBackJs: callJs)
  123. }
  124. }
  125. picker.themeColor = O2ThemeManager.color(for: "Base.base_color")!
  126. picker.datePickerStyle = .YMDHM
  127. picker.pickerStyle = .datePicker
  128. picker.showDatePicker(defaultDate: defaultDate)
  129. }else {
  130. DDLogError("datePicker, 解析json失败")
  131. }
  132. }
  133. private func calendarPickDay(json: String) {
  134. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  135. let title = alert.data?.value ?? ""
  136. DDLogDebug("value:\(title)")
  137. let defaultDate: Date!
  138. if title.isBlank {
  139. defaultDate = Date()
  140. }else {
  141. defaultDate = title.toDate(formatter: "yyyy-MM-dd")
  142. }
  143. let calendarPicker = QCalendarPicker{ (date: String) in
  144. if alert.callback != nil {
  145. let callJs = "\(alert.callback!)('{\"value\":\"\(date)\"}')"
  146. self.evaluateJs(callBackJs: callJs)
  147. }
  148. }
  149. calendarPicker.calendarPickerStyle = .datePicker
  150. calendarPicker.showPickerWithDefault(defaultDate: defaultDate)
  151. }else {
  152. DDLogError("datePicker, 解析json失败")
  153. }
  154. }
  155. private func calendarPickerDateTime(json: String) {
  156. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  157. let title = alert.data?.value ?? ""
  158. DDLogDebug("value:\(title)")
  159. let defaultDate: Date!
  160. if title.isBlank {
  161. defaultDate = Date()
  162. }else {
  163. defaultDate = title.toDate(formatter: "yyyy-MM-dd HH:mm")
  164. }
  165. let calendarPicker = QCalendarPicker{ (date: String) in
  166. if alert.callback != nil {
  167. let callJs = "\(alert.callback!)('{\"value\":\"\(date)\"}')"
  168. self.evaluateJs(callBackJs: callJs)
  169. }
  170. }
  171. calendarPicker.calendarPickerStyle = .dateTimePicker
  172. calendarPicker.showPickerWithDefault(defaultDate: defaultDate)
  173. }else {
  174. DDLogError("datePicker, 解析json失败")
  175. }
  176. }
  177. private func calendarPickerDateInterval(json: String) {
  178. if let alert = O2WebViewBaseMessage<O2UtilPicker>.deserialize(from: json) {
  179. let start = alert.data?.startDate ?? ""
  180. let end = alert.data?.endDate ?? ""
  181. DDLogDebug("start:\(start) , end:\(end)")
  182. let startDate: Date!
  183. if start.isBlank {
  184. startDate = Date()
  185. }else {
  186. startDate = start.toDate(formatter: "yyyy-MM-dd")
  187. }
  188. let endDate: Date!
  189. if end.isBlank {
  190. endDate = Date()
  191. }else {
  192. endDate = end.toDate(formatter: "yyyy-MM-dd")
  193. }
  194. let calendarPicker = QCalendarPicker{ (date: String) in
  195. if alert.callback != nil {
  196. let result = date.split(" ")
  197. let callJs = "\(alert.callback!)('{\"startDate\":\"\(result[0])\", \"endDate\":\"\(result[1])\"}')"
  198. self.evaluateJs(callBackJs: callJs)
  199. }
  200. }
  201. calendarPicker.calendarPickerStyle = .dateIntervalPicker
  202. calendarPicker.showPickerWithDefault(defaultDate: startDate, endDate: endDate)
  203. }else {
  204. DDLogError("calendarPickerDateInterval, 解析json失败")
  205. }
  206. }
  207. //获取手机信息
  208. private func getPhoneInfo(json: String) {
  209. if let alert = O2WebViewBaseMessage<O2UtilNavigation>.deserialize(from: json) {
  210. if alert.callback != nil {
  211. DeviceUtil.shared.getDeviceInfoForJsApi { (info) in
  212. let backData = info.toJSONString(prettyPrint: false) ?? ""
  213. let callJs = "\(alert.callback!)('\(backData)')"
  214. self.evaluateJs(callBackJs: callJs)
  215. }
  216. }
  217. }else {
  218. DDLogError("getPhoneInfo, 解析json失败")
  219. }
  220. }
  221. //扫二维码返回结果
  222. private func scan(json: String) {
  223. if let alert = O2WebViewBaseMessage<O2UtilNavigation>.deserialize(from: json) {
  224. if alert.callback != nil {
  225. //扫一扫 。。。返回结果
  226. ScanHelper.openScan(vc: self.viewController, callbackResult: { (result) in
  227. let callJs = "\(alert.callback!)('{\"text\": \"\(result)\"}')"
  228. self.evaluateJs(callBackJs: callJs)
  229. })
  230. }
  231. }else {
  232. DDLogError("getPhoneInfo, 解析json失败")
  233. }
  234. }
  235. //设置t标题
  236. private func navigationSetTitle(json: String) {
  237. if let alert = O2WebViewBaseMessage<O2UtilNavigation>.deserialize(from: json) {
  238. let title = alert.data?.title ?? ""
  239. if title != "" {
  240. self.viewController.title = title
  241. }
  242. if alert.callback != nil {
  243. let callJs = "\(alert.callback!)('{}')"
  244. self.evaluateJs(callBackJs: callJs)
  245. }
  246. }else {
  247. DDLogError("navigationSetTitle, 解析json失败")
  248. }
  249. }
  250. //关闭窗口
  251. private func navigationClose(json: String) {
  252. if let alert = O2WebViewBaseMessage<O2UtilNavigation>.deserialize(from: json) {
  253. self.closeSelf()
  254. if alert.callback != nil {
  255. let callJs = "\(alert.callback!)('{}')"
  256. self.evaluateJs(callBackJs: callJs)
  257. }
  258. }else {
  259. DDLogError("navigationClose, 解析json失败")
  260. }
  261. }
  262. //返回上级 html history
  263. private func navigationGoBack(json: String) {
  264. if let alert = O2WebViewBaseMessage<O2UtilNavigation>.deserialize(from: json) {
  265. if self.viewController.webView.canGoBack {
  266. self.viewController.webView.goBack()
  267. }else {
  268. self.closeSelf()
  269. }
  270. if alert.callback != nil {
  271. let callJs = "\(alert.callback!)('{}')"
  272. self.evaluateJs(callBackJs: callJs)
  273. }
  274. }else {
  275. DDLogError("navigationGoBack, 解析json失败")
  276. }
  277. }
  278. private func closeSelf() {
  279. guard let vcs = self.viewController.navigationController?.viewControllers else {
  280. self.viewController.navigationController?.dismiss(animated: false, completion: nil)
  281. return
  282. }
  283. if vcs.count > 0 {
  284. if vcs[vcs.count - 1] == self.viewController {
  285. self.viewController.navigationController?.popViewController(animated: false)
  286. }
  287. }else {
  288. self.viewController.navigationController?.dismiss(animated: false, completion: nil)
  289. }
  290. }
  291. private func evaluateJs(callBackJs: String) {
  292. DDLogDebug("执行回调js:"+callBackJs)
  293. self.viewController.webView.evaluateJavaScript(callBackJs, completionHandler: { (result, err) in
  294. DDLogDebug("回调js执行完成!")
  295. })
  296. }
  297. }