O2JsApiUtil.swift 14 KB

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