O2JsApiUtil.swift 13 KB

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