ScreenLockViewController.swift 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. //
  2. // ScreenLockViewControllerSwift.swift
  3. // MCPlus
  4. //
  5. // Created by seo ha on 14/02/2019.
  6. // Copyright © 2019 KangSH. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. import LocalAuthentication
  11. import AudioToolbox
  12. class ScreenLockViewController: UIViewController {
  13. @IBOutlet weak var topContainer:UIView!
  14. @IBOutlet weak var mainTitle:UILabel!
  15. @IBOutlet weak var subTitle:UILabel!
  16. @IBOutlet weak var password1:UIView!
  17. @IBOutlet weak var password2:UIView!
  18. @IBOutlet weak var password3:UIView!
  19. @IBOutlet weak var password4:UIView!
  20. @IBOutlet weak var password5:UIView!
  21. @IBOutlet weak var password6:UIView!
  22. @IBOutlet weak var warningText:UILabel!
  23. @IBOutlet weak var topMargin:NSLayoutConstraint!
  24. @IBOutlet weak var btnCancel:UIButton!
  25. let userDefaults = UserDefaults.standard
  26. var arrPreviousPassword = [Int]()
  27. var arrPassword = [Int]()
  28. deinit {
  29. Notification.removeNotification(observer: self)
  30. }
  31. func chargingPasswordViews(){
  32. print("chargingPasswordViews count: \(arrPassword.count)");
  33. switch arrPassword.count {
  34. case 0:
  35. self.password1.backgroundColor = UIColor.white
  36. self.password2.backgroundColor = UIColor.white
  37. self.password3.backgroundColor = UIColor.white
  38. self.password4.backgroundColor = UIColor.white
  39. self.password5.backgroundColor = UIColor.white
  40. self.password6.backgroundColor = UIColor.white
  41. break;
  42. case 1:
  43. self.password1.backgroundColor = UIColor.black
  44. self.password2.backgroundColor = UIColor.white
  45. self.password3.backgroundColor = UIColor.white
  46. self.password4.backgroundColor = UIColor.white
  47. self.password5.backgroundColor = UIColor.white
  48. self.password6.backgroundColor = UIColor.white
  49. break;
  50. case 2:
  51. self.password1.backgroundColor = UIColor.black
  52. self.password2.backgroundColor = UIColor.black
  53. self.password3.backgroundColor = UIColor.white
  54. self.password4.backgroundColor = UIColor.white
  55. self.password5.backgroundColor = UIColor.white
  56. self.password6.backgroundColor = UIColor.white
  57. break;
  58. case 3:
  59. self.password1.backgroundColor = UIColor.black
  60. self.password2.backgroundColor = UIColor.black
  61. self.password3.backgroundColor = UIColor.black
  62. self.password4.backgroundColor = UIColor.white
  63. self.password5.backgroundColor = UIColor.white
  64. self.password6.backgroundColor = UIColor.white
  65. break;
  66. case 4:
  67. self.password1.backgroundColor = UIColor.black
  68. self.password2.backgroundColor = UIColor.black
  69. self.password3.backgroundColor = UIColor.black
  70. self.password4.backgroundColor = UIColor.black
  71. self.password5.backgroundColor = UIColor.white
  72. self.password6.backgroundColor = UIColor.white
  73. break;
  74. case 5:
  75. self.password1.backgroundColor = UIColor.black
  76. self.password2.backgroundColor = UIColor.black
  77. self.password3.backgroundColor = UIColor.black
  78. self.password4.backgroundColor = UIColor.black
  79. self.password5.backgroundColor = UIColor.black
  80. self.password6.backgroundColor = UIColor.white
  81. break;
  82. case 6:
  83. self.password1.backgroundColor = UIColor.black
  84. self.password2.backgroundColor = UIColor.black
  85. self.password3.backgroundColor = UIColor.black
  86. self.password4.backgroundColor = UIColor.black
  87. self.password5.backgroundColor = UIColor.black
  88. self.password6.backgroundColor = UIColor.black
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. func textRewrite(){
  95. let lockScreenDao = LockScreenDAO.sharedInstance
  96. if let pwInputType = lockScreenDao.pwInputType{
  97. switch pwInputType {
  98. case .FIRST_INPUT:
  99. self.mainTitle.text = "암호입력"
  100. self.subTitle.text = "암호를 입력해 주세요"
  101. case .CONFIRM_INPUT:
  102. self.mainTitle.text = "암호 재입력"
  103. self.subTitle.text = "확인을 위해 한 번 더 입력해 주세요"
  104. case .UNLOCK_INPUT:
  105. self.mainTitle.text = "암호입력"
  106. self.subTitle.text = "암호를 입력해 주세요"
  107. case .UNLOCK_FAIL_RE_INPUT:
  108. self.mainTitle.text = "암호입력"
  109. self.subTitle.text = "암호가 틀렸습니다. 다시 입력해 주세요"
  110. case .CHANGE_FIRST_INPUT:
  111. self.mainTitle.text = "새로운 암호입력"
  112. self.subTitle.text = "새로운 암호를 입력해 주세요"
  113. case .CHANGE_CONFIRM_INPUT:
  114. self.mainTitle.text = "새로운 암호 재입력"
  115. self.subTitle.text = "확인을 위해 한 번 더 입력해 주세요"
  116. }
  117. }
  118. }
  119. }
  120. extension ScreenLockViewController{
  121. func appWillEnterBackground(notification:Notification){
  122. print("will enter background notification")
  123. let lockScreenDao = LockScreenDAO.sharedInstance
  124. arrPreviousPassword = [Int]()
  125. arrPassword = [Int]()
  126. if let pwInputType = lockScreenDao.pwInputType{
  127. switch pwInputType {
  128. case .FIRST_INPUT:
  129. break
  130. case .CONFIRM_INPUT:
  131. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  132. lockScreenDao.saveOptionValuesWithoutPassword()
  133. case .UNLOCK_INPUT:
  134. break
  135. case .UNLOCK_FAIL_RE_INPUT:
  136. fallthrough
  137. case .CHANGE_FIRST_INPUT:
  138. fallthrough
  139. case .CHANGE_CONFIRM_INPUT:
  140. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  141. lockScreenDao.saveOptionValuesWithoutPassword()
  142. break
  143. }
  144. }
  145. self.textRewrite()
  146. self.chargingPasswordViews()
  147. }
  148. override func viewWillAppear(_ animated: Bool) {
  149. // guard #available(iOS 11.0, *) else{ return }
  150. //
  151. // //지문인식
  152. // let context = LAContext()
  153. // var error2:NSError?
  154. // guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error2) else {
  155. // return
  156. // }
  157. //
  158. // if context.biometryType == .faceID{
  159. // return
  160. // }
  161. //
  162. // let error:AutoreleasingUnsafeMutablePointer<NSError?>? = nil
  163. //
  164. // let temp = self.userDefaults.object(forKey: "fingerprint") as? String
  165. // var isSwitchOn = true
  166. //
  167. // if let _temp = temp{
  168. // isSwitchOn = temp != "OFF"
  169. // }else{
  170. // // 지문입력 받음
  171. // }
  172. //
  173. // let lockScreenDao = LockScreenDAO.sharedInstance
  174. // print("lockScreenDao.pwInputType >>>>>>>>>>>>> \(lockScreenDao.pwInputType)")
  175. //
  176. // // 지문입력은 락을 풀때만 사용해야 한다.
  177. // var isUnlockStatus = false
  178. //
  179. // if lockScreenDao.pwInputType == LockScreenDAO.PASSWORD_INPUT_TYPE(rawValue: 2){
  180. // isUnlockStatus = true
  181. // }
  182. //
  183. // if isUnlockStatus, isSwitchOn, context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: error){
  184. // context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "지문을 입력해주세요") { (success, error) in
  185. // if error != nil{
  186. // print("Touch 지원하지 않음")
  187. // return
  188. // }
  189. //
  190. // guard success == true else{
  191. // print("@@@@실패")
  192. // return
  193. // }
  194. //
  195. // print("@@@@성공") // 지문 인증 성공했을때
  196. // let now = Date()
  197. // let dateFormatString = "yyyy-MM-dd hh:mm:ss"
  198. // let date = now.fromString(format: dateFormatString)
  199. // print(date)
  200. //
  201. // // String으로 저장
  202. // self.userDefaults.set(date, forKey: "fingerprintAuthTime")
  203. // self.dismissSelf()
  204. //
  205. // }
  206. // }
  207. }
  208. override func viewDidAppear(_ animated: Bool) {
  209. print("viewDidAppear")
  210. }
  211. override func viewDidLoad() {
  212. super.viewDidLoad()
  213. Notification.registerNotification(name: UIApplication.didEnterBackgroundNotification, queue: .main, block: appWillEnterBackground)
  214. let lockScreenDao = LockScreenDAO.sharedInstance
  215. //업데이트로 인한 초기화 (v4 비밀번호 4자리 -> 6자리 변경이슈)
  216. if isOlderVersionPassword(){
  217. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  218. }
  219. print("lockScreenDao.pwInputType >>>>>>>>>>>>> \(lockScreenDao.pwInputType)")
  220. self.btnCancel.isHidden = lockScreenDao.pwInputType != LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_FIRST_INPUT &&
  221. lockScreenDao.pwInputType != LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_CONFIRM_INPUT
  222. switch Constants.kScreenHeight {
  223. case ...568:
  224. self.topMargin.constant = 40
  225. case ...480:
  226. self.topMargin.constant = 30
  227. default:
  228. break
  229. }
  230. self.password1.layer.cornerRadius = 10.0
  231. self.password1.layer.masksToBounds = true
  232. self.password2.layer.cornerRadius = 10.0
  233. self.password2.layer.masksToBounds = true
  234. self.password3.layer.cornerRadius = 10.0
  235. self.password3.layer.masksToBounds = true
  236. self.password4.layer.cornerRadius = 10.0
  237. self.password4.layer.masksToBounds = true
  238. self.password5.layer.cornerRadius = 10.0
  239. self.password5.layer.masksToBounds = true
  240. self.password6.layer.cornerRadius = 10.0
  241. self.password6.layer.masksToBounds = true
  242. lockScreenDao.loadOptionValues()
  243. if let pwInputType = lockScreenDao.pwInputType{
  244. switch pwInputType {
  245. case .FIRST_INPUT:
  246. break
  247. case .CONFIRM_INPUT:
  248. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  249. lockScreenDao.saveOptionValuesWithoutPassword()
  250. case .UNLOCK_INPUT:
  251. break
  252. case .UNLOCK_FAIL_RE_INPUT:
  253. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  254. lockScreenDao.saveOptionValuesWithoutPassword()
  255. case .CHANGE_FIRST_INPUT:
  256. break
  257. case .CHANGE_CONFIRM_INPUT:
  258. break
  259. }
  260. }
  261. self.textRewrite()
  262. self.chargingPasswordViews()
  263. }
  264. override func didReceiveMemoryWarning() {
  265. super.didReceiveMemoryWarning()
  266. // Dispose of any resources that can be recreated.
  267. }
  268. func savePasswordOnArray(number:Int){
  269. let lockScreenDao = LockScreenDAO.sharedInstance
  270. print("arrPassword count: \(arrPassword.count)")
  271. print("lockScreenDao.pwInputType : \(lockScreenDao.pwInputType)")
  272. switch arrPassword.count {
  273. case ..<6:
  274. arrPassword.append(number)
  275. //뷰 초기화
  276. self.chargingPasswordViews()
  277. self.printPassword()
  278. self.printPreviousPassword()
  279. Thread.sleep(forTimeInterval: 0.1)
  280. if arrPassword.count == 6{
  281. fallthrough
  282. }
  283. case 6:
  284. if let pwInputType = lockScreenDao.pwInputType{
  285. switch pwInputType {
  286. case .FIRST_INPUT:
  287. let pw = self.arrPassword.reduce("", {"\($0)\($1)"})
  288. guard self.isValidNumber(pw: pw) else{
  289. arrPassword = [Int]()
  290. self.textRewrite()
  291. self.mainTitle.text = "암호입력"
  292. self.subTitle.text = "연속된 암호를 사용할 수 없습니다. 다시 입력해 주세요"
  293. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  294. //뷰 초기화
  295. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  296. self?.chargingPasswordViews()
  297. }
  298. return
  299. }
  300. //처음 암호를 입력했을 때, 확인모드로 변경.
  301. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CONFIRM_INPUT
  302. self.textRewrite()
  303. //암호 입력 새로 받음
  304. arrPreviousPassword = arrPassword.map({$0})
  305. arrPassword = [Int]()
  306. //뷰 초기화
  307. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  308. self?.chargingPasswordViews()
  309. }
  310. case .CONFIRM_INPUT:
  311. // 암호가 일치하는지 판단
  312. if self.comparePasswords(){
  313. // 패스워드 저장 후 모달창 닫음.
  314. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  315. lockScreenDao.saveOptionValues(arrPassword: arrPassword)
  316. //뷰 초기화
  317. self.chargingPasswordViews()
  318. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  319. self?.dismissSelf()
  320. }
  321. }else{
  322. // 처음부터 다시 입력 받음
  323. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  324. self.mainTitle.text = "암호입력"
  325. self.subTitle.text = "암호가 틀렸습니다. 다시 입력해 주세요"
  326. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  327. self.printPassword()
  328. self.printPreviousPassword()
  329. arrPreviousPassword = [Int]()
  330. arrPassword = [Int]()
  331. //뷰 초기화
  332. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  333. self?.chargingPasswordViews()
  334. }
  335. }
  336. case .UNLOCK_INPUT:
  337. print("UNLOCK_INPUT 1")
  338. // 암호가 일치하는지 판단
  339. if self.comparePasswordWithStorage(){
  340. //모달창 닫음.
  341. print("UNLOCK_INPUT 2")
  342. // 패스워드 저장 후 모달창 닫음.
  343. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  344. lockScreenDao.saveOptionValuesWithoutPassword()
  345. print("UNLOCK_INPUT 3")
  346. //뷰 초기화
  347. self.chargingPasswordViews()
  348. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  349. self?.dismissSelf()
  350. }
  351. }else{
  352. //초기화 하고 다시 입력 받음
  353. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_FAIL_RE_INPUT
  354. arrPassword = [Int]()
  355. self.mainTitle.text = "암호입력"
  356. self.subTitle.text = "암호가 틀렸습니다. 다시 입력해 주세요"
  357. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  358. self.printPassword()
  359. self.printPreviousPassword()
  360. //뷰 초기화
  361. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  362. self?.chargingPasswordViews()
  363. }
  364. }
  365. case .UNLOCK_FAIL_RE_INPUT:
  366. if self.comparePasswordWithStorage(){
  367. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  368. lockScreenDao.saveOptionValuesWithoutPassword()
  369. //모달창 닫음.
  370. //뷰 초기화
  371. self.chargingPasswordViews()
  372. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  373. self?.dismissSelf()
  374. }
  375. }else{
  376. //초기화 하고 다시 입력 받음
  377. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  378. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_FAIL_RE_INPUT
  379. arrPassword = [Int]()
  380. //뷰 초기화
  381. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  382. self?.chargingPasswordViews()
  383. }
  384. }
  385. case .CHANGE_FIRST_INPUT:
  386. //처음 암호를 입력했을 때, 변경확인모드로 변경.
  387. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_CONFIRM_INPUT
  388. self.textRewrite()
  389. //암호 입력 새로 받음
  390. arrPreviousPassword = [Int]()
  391. arrPassword = [Int]()
  392. //뷰 초기화
  393. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  394. self?.chargingPasswordViews()
  395. }
  396. case .CHANGE_CONFIRM_INPUT:
  397. // 암호가 일치하는지 판단
  398. if self.comparePasswords(){
  399. // 패스워드 저장 후 모달창 닫음.
  400. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  401. lockScreenDao.saveOptionValues(arrPassword: arrPassword)
  402. //뷰 초기화
  403. self.chargingPasswordViews()
  404. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  405. self?.dismissSelf()
  406. }
  407. }else{
  408. // 처음부터 다시 입력 받음
  409. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_FIRST_INPUT
  410. self.mainTitle.text = "새로운 암호입력"
  411. self.subTitle.text = "암호가 틀렸습니다. 새로운 암호를 입력해 주세요"
  412. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  413. self.printPassword()
  414. self.printPreviousPassword()
  415. arrPreviousPassword = [Int]()
  416. arrPassword = [Int]()
  417. //뷰 초기화
  418. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  419. self?.chargingPasswordViews()
  420. }
  421. }
  422. }
  423. }
  424. default:
  425. break
  426. }
  427. }
  428. func comparePasswords() -> Bool {
  429. print("comparePasswords start")
  430. let pw1 = arrPreviousPassword.reduce("", {"\($0)\($1)"})
  431. let pw2 = arrPassword.reduce("", {"\($0)\($1)"})
  432. print("comparePasswords end")
  433. return pw1 == pw2
  434. }
  435. func comparePasswordWithStorage() -> Bool{
  436. var isEncEqual = false
  437. let lockScreenDao = LockScreenDAO.sharedInstance
  438. //암호화 라이브러리 RNCrypter는 랜덤 salt를 쓰므로 복호화를 통하여 암호 비교
  439. let pw1 = arrPassword.reduce("", {"\($0)\($1)"})
  440. let pw2 = [0, 1, 2, 3, 4, 5].map({lockScreenDao.encryptedPasswordWithKey(key: "\($0)")})
  441. .compactMap({$0})
  442. .map({$0.decryptWithKey(key: Constants.PACS_APP_ENC_KEY)})
  443. .compactMap({$0})
  444. .reduce("", {"\($0)\($1)"})
  445. print("\(pw1),\(pw2)")
  446. isEncEqual = pw1 == pw2
  447. print("암호화된 키가 일치하는가?> \(isEncEqual ? "참" : "거짓")")
  448. return isEncEqual
  449. }
  450. func isValidNumber(pw:String) -> Bool {
  451. print(pw)
  452. let pwRegEx = "^(?!.*?(?:0(?:12|98)|123|234|3(?:45|21)|4(?:56|32)|5(?:67|43)|6(?:78|54)|7(?:89|65)|876|987))(?!.*?(.)\\1{2})[0-9]{6}"
  453. let pwTest = NSPredicate(format:"SELF MATCHES %@", pwRegEx)
  454. return pwTest.evaluate(with: pw)
  455. }
  456. func dismissSelf(){
  457. Notification.removeNotification(observer: self)
  458. self.dismiss(animated: false, completion: nil)
  459. }
  460. func printPassword(){
  461. for i in 0..<arrPassword.count{
  462. print("[arrPassword \(i)] = \(arrPassword[i])")
  463. }
  464. print("===========================\n")
  465. }
  466. func printPreviousPassword(){
  467. for i in 0..<arrPreviousPassword.count{
  468. print("[arrPreviousPassword \(i)] = \(arrPreviousPassword[i])")
  469. }
  470. print("===========================\n")
  471. }
  472. // MARK: - <Numberpad Functions>
  473. @IBAction func clickNum1(sender:Any?){
  474. self.savePasswordOnArray(number: 1)
  475. }
  476. @IBAction func clickNum2(sender:Any?){
  477. self.savePasswordOnArray(number: 2)
  478. }
  479. @IBAction func clickNum3(sender:Any?){
  480. self.savePasswordOnArray(number: 3)
  481. }
  482. @IBAction func clickNum4(sender:Any?){
  483. self.savePasswordOnArray(number: 4)
  484. }
  485. @IBAction func clickNum5(sender:Any?){
  486. self.savePasswordOnArray(number: 5)
  487. }
  488. @IBAction func clickNum6(sender:Any?){
  489. self.savePasswordOnArray(number: 6)
  490. }
  491. @IBAction func clickNum7(sender:Any?){
  492. self.savePasswordOnArray(number: 7)
  493. }
  494. @IBAction func clickNum8(sender:Any?){
  495. self.savePasswordOnArray(number: 8)
  496. }
  497. @IBAction func clickNum9(sender:Any?){
  498. self.savePasswordOnArray(number: 9)
  499. }
  500. @IBAction func clickNum0(sender:Any?){
  501. self.savePasswordOnArray(number: 0)
  502. }
  503. @IBAction func clickNumBackspace(sender:Any?){
  504. let count = arrPassword.count
  505. if count > 0{
  506. arrPassword.removeLast()
  507. }
  508. self.chargingPasswordViews()
  509. self.printPassword()
  510. }
  511. @IBAction func clickNumCancel(sender:Any?){
  512. print("취소")
  513. let lockScreenDao = LockScreenDAO.sharedInstance
  514. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  515. //뷰 초기화
  516. self.chargingPasswordViews()
  517. self.dismissSelf()
  518. }
  519. func isOlderVersionPassword() -> Bool{
  520. let lockScreenDao = LockScreenDAO.sharedInstance
  521. let pw = [0, 1, 2, 3, 4, 5].map({lockScreenDao.encryptedPasswordWithKey(key: "\($0)")})
  522. .compactMap({$0})
  523. .map({$0.decryptWithKey(key: Constants.PACS_APP_ENC_KEY)})
  524. .compactMap({$0})
  525. .reduce("", {"\($0)\($1)"})
  526. return pw.count == 4
  527. }
  528. }