O2JsApiUtil.swift 14 KB

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