OOLoginViewController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. //
  2. // OOLoginViewController.swift
  3. // O2Platform
  4. //
  5. // Created by 刘振兴 on 2018/4/9.
  6. // Copyright © 2018年 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import ReactiveCocoa
  10. import ReactiveSwift
  11. import CocoaLumberjack
  12. import AVFoundation
  13. import O2OA_Auth_SDK
  14. class OOLoginViewController: OOBaseViewController {
  15. @IBOutlet weak var logoImageView: UIImageView!
  16. @IBOutlet weak var userNameTextField: OOUITextField!
  17. @IBOutlet weak var passwordTextField: OOUIDownButtonTextField!
  18. @IBOutlet weak var passwordField: OOUITextField!
  19. @IBOutlet weak var copyrightLabel: UILabel!
  20. @IBOutlet weak var submitButton: OOBaseUIButton!
  21. @IBOutlet weak var rebindBtn: UIButton!
  22. //修改成 其他登录方式按钮
  23. @IBOutlet weak var bioAuthLoginBtn: UIButton!
  24. //生物识别登录是否开启
  25. private var bioIsOpen: Bool = false
  26. private var bioTypeName: String = ""
  27. //初始化进入的时候是否直接跳转到生物识别认证登录界面
  28. private var notJumpBioAuth = false
  29. //登录方式
  30. private var loginType = 0 // 0默认的用户名验证码登录 1用户名密码登录
  31. var viewModel:OOLoginViewModel = {
  32. return OOLoginViewModel()
  33. }()
  34. override func viewDidLoad() {
  35. super.viewDidLoad()
  36. //监听截屏通知
  37. NotificationCenter.default.addObserver(self, selector: #selector(screenshots),
  38. name: UIApplication.userDidTakeScreenshotNotification,
  39. object: nil)
  40. NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
  41. //delegate
  42. passwordTextField.buttonDelegate = self
  43. setupUI()
  44. }
  45. deinit {
  46. NotificationCenter.default.removeObserver(self, name: UIApplication.userDidTakeScreenshotNotification, object: nil)
  47. }
  48. override func viewWillAppear(_ animated: Bool) {
  49. super.viewWillAppear(animated)
  50. let bioAuthUser = AppConfigSettings.shared.bioAuthUser
  51. //判断是否当前绑定的服务器的
  52. if !bioAuthUser.isBlank {
  53. let array = bioAuthUser.split("^^")
  54. if array.count == 2 {
  55. if array[0] == O2AuthSDK.shared.bindUnit()?.id {
  56. self.bioIsOpen = true
  57. }
  58. }
  59. }
  60. if !self.notJumpBioAuth && self.bioIsOpen {
  61. DDLogDebug("已开启生物识别认证")
  62. self.gotoBioAuthLogin()
  63. }
  64. }
  65. @IBAction func unwindFromBioAuthLogin(_ unwindSegue: UIStoryboardSegue) {
  66. if unwindSegue.identifier == "goBack2Login" {
  67. DDLogDebug("从生物识别认证页面返回的,所以不需要再跳转了。。。。。。")
  68. notJumpBioAuth = true
  69. }
  70. }
  71. @objc private func didEnterBackground() {
  72. DDLogDebug("进入后台.................")
  73. self.userNameTextField.text = ""
  74. self.passwordField.text = ""
  75. }
  76. //截屏提示
  77. @objc private func screenshots() {
  78. self.showSystemAlert(title: "提示", message: "为了保护用户名密码安全,请不要截图!") { (action) in
  79. DDLogDebug("确定提示。")
  80. }
  81. }
  82. private func setupUI(){
  83. logoImageView.image = OOCustomImageManager.default.loadImage(.login_avatar)
  84. let backImageView = UIImageView(image: #imageLiteral(resourceName: "pic_beijing"))
  85. backImageView.frame = self.view.frame
  86. //毛玻璃效果
  87. let blur = UIBlurEffect(style: .light)
  88. let effectView = UIVisualEffectView(effect: blur)
  89. effectView.frame = backImageView.frame
  90. backImageView.addSubview(effectView)
  91. // 皮肤
  92. let baseColor = O2ThemeManager.color(for: "Base.base_color")!
  93. self.passwordTextField.themeUpdate(buttonTitleColor: baseColor)
  94. self.passwordTextField.themeUpdate(leftImage: O2ThemeManager.image(for: "Icon.icon_verification_code_nor"), leftLightImage: O2ThemeManager.image(for: "Icon.icon_verification_code_sel"), lineColor: baseColor.alpha(0.4), lineLightColor: baseColor)
  95. self.passwordField.themeUpdate(leftImage: O2ThemeManager.image(for: "Icon.icon_verification_code_nor"), leftLightImage: O2ThemeManager.image(for: "Icon.icon_verification_code_sel"), lineColor: baseColor.alpha(0.4), lineLightColor: baseColor)
  96. self.userNameTextField.themeUpdate(leftImage: O2ThemeManager.image(for: "Icon.icon_user_nor"), leftLightImage: O2ThemeManager.image(for: "Icon.icon_user_sel"), lineColor: baseColor.alpha(0.4), lineLightColor: baseColor)
  97. self.passwordField.isSecureTextEntry = true
  98. self.passwordTextField.keyboardType = .numberPad
  99. self.userNameTextField.returnKeyType = .next
  100. self.userNameTextField.returnNextDelegate = self
  101. if O2IsConnect2Collect {
  102. self.rebindBtn.isHidden = false
  103. self.passwordTextField.isHidden = false //验证码
  104. self.passwordField.isHidden = true //密码
  105. self.bioAuthLoginBtn.isHidden = false
  106. }else {
  107. self.rebindBtn.isHidden = true
  108. self.passwordTextField.isHidden = true
  109. self.passwordField.isHidden = false
  110. self.bioAuthLoginBtn.isHidden = true
  111. }
  112. // self.passwordTextField.reactive.isEnabled <~ viewModel.passwordIsValid
  113. // self.passwordField.reactive.isEnabled <~ viewModel.pwdIsValid
  114. self.passwordTextField.downButton!.reactive.isEnabled <~ viewModel.passwordIsValid
  115. // self.submitButton.reactive.isEnabled <~ viewModel.submitButtionIsValid
  116. // self.submitButton.reactive.backgroundColor <~ viewModel.submitButtonCurrentColor
  117. // if O2IsConnect2Collect {
  118. // viewModel.loginControlIsValid(self.userNameTextField, self.passwordTextField, false)
  119. // }else {
  120. // viewModel.loginControlIsValid(self.userNameTextField, self.passwordField, true)
  121. // }
  122. let bioType = O2BioLocalAuth.shared.checkBiometryType()
  123. switch bioType {
  124. case O2BiometryType.FaceID:
  125. self.bioTypeName = "人脸识别登录"
  126. break
  127. case O2BiometryType.TouchID:
  128. self.bioTypeName = "指纹识别登录"
  129. break
  130. default:
  131. break
  132. }
  133. //版权信息
  134. self.view.insertSubview(backImageView, belowSubview: self.logoImageView)
  135. let year = Calendar.current.component(Calendar.Component.year, from: Date())
  136. copyrightLabel.text = "Copyright © 2015 - \(year) All Rights Reserved"
  137. }
  138. override func didReceiveMemoryWarning() {
  139. super.didReceiveMemoryWarning()
  140. // Dispose of any resources that can be recreated.
  141. }
  142. @IBAction func btnReBindNodeAction(_ sender: UIButton) {
  143. self.showDefaultConfirm(title: "重新绑定", message: "重新绑定到新的服务节点,原节点信息将被清空,确认吗?") { (action) in
  144. O2AuthSDK.shared.clearAllInformationBeforeReBind(callback: { (result, msg) in
  145. DDLogInfo("清空登录和绑定信息,result:\(result), msg:\(msg ?? "")")
  146. DBManager.shared.removeAll()
  147. DispatchQueue.main.async {
  148. self.forwardDestVC("login", nil)
  149. }
  150. })
  151. }
  152. }
  153. @IBAction func bioAuthLoginBtnAction(_ sender: UIButton) {
  154. //弹出选择登录方式
  155. var loginActions: [UIAlertAction] = []
  156. if self.loginType == 0 { //当前是验证码登录
  157. let passwordLogin = UIAlertAction(title: "密码登录", style: .default) { (action) in
  158. self.change2PasswordLogin()
  159. }
  160. loginActions.append(passwordLogin)
  161. }else {
  162. let phoneCodeLogin = UIAlertAction(title: "验证码登录", style: .default) { (action) in
  163. self.change2PhoneCodeLogin()
  164. }
  165. loginActions.append(phoneCodeLogin)
  166. }
  167. if self.bioIsOpen {
  168. let bioLogin = UIAlertAction(title: self.bioTypeName, style: .default) { (action) in
  169. self.gotoBioAuthLogin()
  170. }
  171. loginActions.append(bioLogin)
  172. }
  173. self.showSheetAction(title: "提示", message: "请选择下列登录方式", actions: loginActions)
  174. // self.gotoBioAuthLogin()
  175. }
  176. private func change2PasswordLogin() {
  177. self.passwordTextField.isHidden = true //验证码
  178. self.passwordField.isHidden = false //密码
  179. self.loginType = 1
  180. }
  181. private func change2PhoneCodeLogin() {
  182. self.passwordTextField.isHidden = false //验证码
  183. self.passwordField.isHidden = true //密码
  184. self.loginType = 0
  185. }
  186. @IBAction func btnLogin(_ sender: OOBaseUIButton) {
  187. self.view.endEditing(true)
  188. let credential = userNameTextField.text ?? ""
  189. var codeAnswer = ""
  190. if O2IsConnect2Collect {
  191. if self.loginType == 0 {
  192. codeAnswer = passwordTextField.text ?? ""
  193. }else {
  194. codeAnswer = passwordField.text ?? ""
  195. }
  196. }else {
  197. codeAnswer = passwordField.text ?? ""
  198. }
  199. if credential == "" || codeAnswer == "" {
  200. self.showError(title: "手机号码或密码不能为空!")
  201. return
  202. }
  203. self.showLoading(title: "登录中...")
  204. if O2IsConnect2Collect {
  205. if self.loginType == 0 {
  206. passwordTextField.stopTimerButton()
  207. O2AuthSDK.shared.login(mobile: credential, code: codeAnswer) { (result, msg) in
  208. if result {
  209. self.hideLoading()
  210. self.gotoMain()
  211. }else {
  212. self.showError(title: "登录失败,\(msg ?? "")")
  213. }
  214. }
  215. }else {
  216. O2AuthSDK.shared.loginWithPassword(username: credential, password: codeAnswer) { (result, msg) in
  217. if result {
  218. self.hideLoading()
  219. self.gotoMain()
  220. }else {
  221. self.showError(title: "登录失败,\(msg ?? "")")
  222. }
  223. }
  224. }
  225. }else {
  226. //todo内网版本登录
  227. O2AuthSDK.shared.loginWithPassword(username: credential, password: codeAnswer) { (result, msg) in
  228. if result {
  229. self.hideLoading()
  230. self.gotoMain()
  231. }else {
  232. self.showError(title: "登录失败,\(msg ?? "")")
  233. }
  234. }
  235. }
  236. }
  237. private func gotoMain() {
  238. //跳转到主页
  239. let destVC = O2MainController.genernateVC()
  240. destVC.selectedIndex = 2 // 首页选中 TODO 图标不亮。。。。。
  241. UIApplication.shared.keyWindow?.rootViewController = destVC
  242. UIApplication.shared.keyWindow?.makeKeyAndVisible()
  243. }
  244. private func gotoBioAuthLogin() {
  245. DispatchQueue.main.async {
  246. self.performSegue(withIdentifier: "showBioAuthLogin", sender: nil)
  247. }
  248. }
  249. }
  250. extension OOLoginViewController:OOUIDownButtonTextFieldDelegate {
  251. func viewButtonClicked(_ textField: OOUIDownButtonTextField, _ sender: OOTimerButton) {
  252. guard let credential = userNameTextField.text else {
  253. self.showError(title: "请输入手机号码!")
  254. sender.stopTiming()
  255. return
  256. }
  257. O2AuthSDK.shared.sendLoginSMS(mobile: credential) { (result, msg) in
  258. if !result {
  259. DDLogError((msg ?? ""))
  260. self.showError(title: "验证码发送失败!")
  261. }
  262. }
  263. }
  264. }
  265. extension OOLoginViewController: OOUITextFieldReturnNextDelegate {
  266. func next() {
  267. if self.userNameTextField.isFirstResponder {
  268. if self.passwordField.isHidden == false {
  269. self.passwordField.becomeFirstResponder()
  270. }
  271. if self.passwordTextField.isHidden == false {
  272. self.passwordTextField.becomeFirstResponder()
  273. }
  274. }
  275. }
  276. }