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. let context = LAContext()
  152. var error2:NSError?
  153. guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error2) else {
  154. return
  155. }
  156. if context.biometryType == .faceID{
  157. return
  158. }
  159. let error:AutoreleasingUnsafeMutablePointer<NSError?>? = nil
  160. let temp = self.userDefaults.object(forKey: "fingerprint") as? String
  161. var isSwitchOn = true
  162. if let _temp = temp{
  163. isSwitchOn = temp != "OFF"
  164. }else{
  165. // 지문입력 받음
  166. }
  167. let lockScreenDao = LockScreenDAO.sharedInstance
  168. print("lockScreenDao.pwInputType >>>>>>>>>>>>> \(lockScreenDao.pwInputType)")
  169. // 지문입력은 락을 풀때만 사용해야 한다.
  170. var isUnlockStatus = false
  171. if lockScreenDao.pwInputType == LockScreenDAO.PASSWORD_INPUT_TYPE(rawValue: 2){
  172. isUnlockStatus = true
  173. }
  174. if isUnlockStatus, isSwitchOn, context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: error){
  175. context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "지문을 입력해주세요") { (success, error) in
  176. if error != nil{
  177. print("Touch 지원하지 않음")
  178. return
  179. }
  180. guard success == true else{
  181. print("@@@@실패")
  182. return
  183. }
  184. print("@@@@성공") // 지문 인증 성공했을때
  185. let now = Date()
  186. let dateFormatString = "yyyy-MM-dd hh:mm:ss"
  187. let date = now.fromString(format: dateFormatString)
  188. print(date)
  189. // String으로 저장
  190. self.userDefaults.set(date, forKey: "fingerprintAuthTime")
  191. self.dismissSelf()
  192. }
  193. }
  194. }
  195. override func viewDidAppear(_ animated: Bool) {
  196. print("viewDidAppear")
  197. }
  198. override func viewDidLoad() {
  199. super.viewDidLoad()
  200. Notification.registerNotification(name: UIApplication.didEnterBackgroundNotification, queue: .main, block: appWillEnterBackground)
  201. let lockScreenDao = LockScreenDAO.sharedInstance
  202. //업데이트로 인한 초기화 (v4 비밀번호 4자리 -> 6자리 변경이슈)
  203. if isOlderVersionPassword(){
  204. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  205. }
  206. print("lockScreenDao.pwInputType >>>>>>>>>>>>> \(lockScreenDao.pwInputType)")
  207. self.btnCancel.isHidden = lockScreenDao.pwInputType != LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_FIRST_INPUT &&
  208. lockScreenDao.pwInputType != LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_CONFIRM_INPUT
  209. switch Constants.kScreenHeight {
  210. case ...568:
  211. self.topMargin.constant = 40
  212. case ...480:
  213. self.topMargin.constant = 30
  214. default:
  215. break
  216. }
  217. self.password1.layer.cornerRadius = 10.0
  218. self.password1.layer.masksToBounds = true
  219. self.password2.layer.cornerRadius = 10.0
  220. self.password2.layer.masksToBounds = true
  221. self.password3.layer.cornerRadius = 10.0
  222. self.password3.layer.masksToBounds = true
  223. self.password4.layer.cornerRadius = 10.0
  224. self.password4.layer.masksToBounds = true
  225. self.password5.layer.cornerRadius = 10.0
  226. self.password5.layer.masksToBounds = true
  227. self.password6.layer.cornerRadius = 10.0
  228. self.password6.layer.masksToBounds = true
  229. lockScreenDao.loadOptionValues()
  230. if let pwInputType = lockScreenDao.pwInputType{
  231. switch pwInputType {
  232. case .FIRST_INPUT:
  233. break
  234. case .CONFIRM_INPUT:
  235. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  236. lockScreenDao.saveOptionValuesWithoutPassword()
  237. case .UNLOCK_INPUT:
  238. break
  239. case .UNLOCK_FAIL_RE_INPUT:
  240. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  241. lockScreenDao.saveOptionValuesWithoutPassword()
  242. case .CHANGE_FIRST_INPUT:
  243. break
  244. case .CHANGE_CONFIRM_INPUT:
  245. break
  246. }
  247. }
  248. self.textRewrite()
  249. self.chargingPasswordViews()
  250. }
  251. override func didReceiveMemoryWarning() {
  252. super.didReceiveMemoryWarning()
  253. // Dispose of any resources that can be recreated.
  254. }
  255. func savePasswordOnArray(number:Int){
  256. let lockScreenDao = LockScreenDAO.sharedInstance
  257. print("arrPassword count: \(arrPassword.count)")
  258. print("lockScreenDao.pwInputType : \(lockScreenDao.pwInputType)")
  259. switch arrPassword.count {
  260. case ..<6:
  261. arrPassword.append(number)
  262. //뷰 초기화
  263. self.chargingPasswordViews()
  264. self.printPassword()
  265. self.printPreviousPassword()
  266. Thread.sleep(forTimeInterval: 0.1)
  267. if arrPassword.count == 6{
  268. fallthrough
  269. }
  270. case 6:
  271. if let pwInputType = lockScreenDao.pwInputType{
  272. switch pwInputType {
  273. case .FIRST_INPUT:
  274. let pw = self.arrPassword.reduce("", {"\($0)\($1)"})
  275. guard self.isValidNumber(pw: pw) else{
  276. arrPassword = [Int]()
  277. self.textRewrite()
  278. self.mainTitle.text = "암호입력"
  279. self.subTitle.text = "연속된 암호를 사용할 수 없습니다. 다시 입력해 주세요"
  280. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  281. //뷰 초기화
  282. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  283. self?.chargingPasswordViews()
  284. }
  285. return
  286. }
  287. //처음 암호를 입력했을 때, 확인모드로 변경.
  288. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CONFIRM_INPUT
  289. self.textRewrite()
  290. //암호 입력 새로 받음
  291. arrPreviousPassword = arrPassword.map({$0})
  292. arrPassword = [Int]()
  293. //뷰 초기화
  294. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  295. self?.chargingPasswordViews()
  296. }
  297. case .CONFIRM_INPUT:
  298. // 암호가 일치하는지 판단
  299. if self.comparePasswords(){
  300. // 패스워드 저장 후 모달창 닫음.
  301. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  302. lockScreenDao.saveOptionValues(arrPassword: arrPassword)
  303. //뷰 초기화
  304. self.chargingPasswordViews()
  305. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  306. self?.dismissSelf()
  307. }
  308. }else{
  309. // 처음부터 다시 입력 받음
  310. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.FIRST_INPUT
  311. self.mainTitle.text = "암호입력"
  312. self.subTitle.text = "암호가 틀렸습니다. 다시 입력해 주세요"
  313. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  314. self.printPassword()
  315. self.printPreviousPassword()
  316. arrPreviousPassword = [Int]()
  317. arrPassword = [Int]()
  318. //뷰 초기화
  319. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  320. self?.chargingPasswordViews()
  321. }
  322. }
  323. case .UNLOCK_INPUT:
  324. print("UNLOCK_INPUT 1")
  325. // 암호가 일치하는지 판단
  326. if self.comparePasswordWithStorage(){
  327. //모달창 닫음.
  328. print("UNLOCK_INPUT 2")
  329. // 패스워드 저장 후 모달창 닫음.
  330. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  331. lockScreenDao.saveOptionValuesWithoutPassword()
  332. print("UNLOCK_INPUT 3")
  333. //뷰 초기화
  334. self.chargingPasswordViews()
  335. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  336. self?.dismissSelf()
  337. }
  338. }else{
  339. //초기화 하고 다시 입력 받음
  340. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_FAIL_RE_INPUT
  341. arrPassword = [Int]()
  342. self.mainTitle.text = "암호입력"
  343. self.subTitle.text = "암호가 틀렸습니다. 다시 입력해 주세요"
  344. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  345. self.printPassword()
  346. self.printPreviousPassword()
  347. //뷰 초기화
  348. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  349. self?.chargingPasswordViews()
  350. }
  351. }
  352. case .UNLOCK_FAIL_RE_INPUT:
  353. if self.comparePasswordWithStorage(){
  354. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  355. lockScreenDao.saveOptionValuesWithoutPassword()
  356. //모달창 닫음.
  357. //뷰 초기화
  358. self.chargingPasswordViews()
  359. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  360. self?.dismissSelf()
  361. }
  362. }else{
  363. //초기화 하고 다시 입력 받음
  364. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  365. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_FAIL_RE_INPUT
  366. arrPassword = [Int]()
  367. //뷰 초기화
  368. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  369. self?.chargingPasswordViews()
  370. }
  371. }
  372. case .CHANGE_FIRST_INPUT:
  373. //처음 암호를 입력했을 때, 변경확인모드로 변경.
  374. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_CONFIRM_INPUT
  375. self.textRewrite()
  376. //암호 입력 새로 받음
  377. arrPreviousPassword = [Int]()
  378. arrPassword = [Int]()
  379. //뷰 초기화
  380. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  381. self?.chargingPasswordViews()
  382. }
  383. case .CHANGE_CONFIRM_INPUT:
  384. // 암호가 일치하는지 판단
  385. if self.comparePasswords(){
  386. // 패스워드 저장 후 모달창 닫음.
  387. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  388. lockScreenDao.saveOptionValues(arrPassword: arrPassword)
  389. //뷰 초기화
  390. self.chargingPasswordViews()
  391. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  392. self?.dismissSelf()
  393. }
  394. }else{
  395. // 처음부터 다시 입력 받음
  396. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.CHANGE_FIRST_INPUT
  397. self.mainTitle.text = "새로운 암호입력"
  398. self.subTitle.text = "암호가 틀렸습니다. 새로운 암호를 입력해 주세요"
  399. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
  400. self.printPassword()
  401. self.printPreviousPassword()
  402. arrPreviousPassword = [Int]()
  403. arrPassword = [Int]()
  404. //뷰 초기화
  405. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
  406. self?.chargingPasswordViews()
  407. }
  408. }
  409. }
  410. }
  411. default:
  412. break
  413. }
  414. }
  415. func comparePasswords() -> Bool {
  416. print("comparePasswords start")
  417. let pw1 = arrPreviousPassword.reduce("", {"\($0)\($1)"})
  418. let pw2 = arrPassword.reduce("", {"\($0)\($1)"})
  419. print("comparePasswords end")
  420. return pw1 == pw2
  421. }
  422. func comparePasswordWithStorage() -> Bool{
  423. var isEncEqual = false
  424. let lockScreenDao = LockScreenDAO.sharedInstance
  425. //암호화 라이브러리 RNCrypter는 랜덤 salt를 쓰므로 복호화를 통하여 암호 비교
  426. let pw1 = arrPassword.reduce("", {"\($0)\($1)"})
  427. let pw2 = [0, 1, 2, 3, 4, 5].map({lockScreenDao.encryptedPasswordWithKey(key: "\($0)")})
  428. .compactMap({$0})
  429. .map({$0.decryptWithKey(key: Constants.PACS_APP_ENC_KEY)})
  430. .compactMap({$0})
  431. .reduce("", {"\($0)\($1)"})
  432. print("\(pw1),\(pw2)")
  433. isEncEqual = pw1 == pw2
  434. print("암호화된 키가 일치하는가?> \(isEncEqual ? "참" : "거짓")")
  435. return isEncEqual
  436. }
  437. func isValidNumber(pw:String) -> Bool {
  438. print(pw)
  439. 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}"
  440. let pwTest = NSPredicate(format:"SELF MATCHES %@", pwRegEx)
  441. return pwTest.evaluate(with: pw)
  442. }
  443. func dismissSelf(){
  444. Notification.removeNotification(observer: self)
  445. self.dismiss(animated: false, completion: nil)
  446. }
  447. func printPassword(){
  448. for i in 0..<arrPassword.count{
  449. print("[arrPassword \(i)] = \(arrPassword[i])")
  450. }
  451. print("===========================\n")
  452. }
  453. func printPreviousPassword(){
  454. for i in 0..<arrPreviousPassword.count{
  455. print("[arrPreviousPassword \(i)] = \(arrPreviousPassword[i])")
  456. }
  457. print("===========================\n")
  458. }
  459. // MARK: - <Numberpad Functions>
  460. @IBAction func clickNum1(sender:Any?){
  461. self.savePasswordOnArray(number: 1)
  462. }
  463. @IBAction func clickNum2(sender:Any?){
  464. self.savePasswordOnArray(number: 2)
  465. }
  466. @IBAction func clickNum3(sender:Any?){
  467. self.savePasswordOnArray(number: 3)
  468. }
  469. @IBAction func clickNum4(sender:Any?){
  470. self.savePasswordOnArray(number: 4)
  471. }
  472. @IBAction func clickNum5(sender:Any?){
  473. self.savePasswordOnArray(number: 5)
  474. }
  475. @IBAction func clickNum6(sender:Any?){
  476. self.savePasswordOnArray(number: 6)
  477. }
  478. @IBAction func clickNum7(sender:Any?){
  479. self.savePasswordOnArray(number: 7)
  480. }
  481. @IBAction func clickNum8(sender:Any?){
  482. self.savePasswordOnArray(number: 8)
  483. }
  484. @IBAction func clickNum9(sender:Any?){
  485. self.savePasswordOnArray(number: 9)
  486. }
  487. @IBAction func clickNum0(sender:Any?){
  488. self.savePasswordOnArray(number: 0)
  489. }
  490. @IBAction func clickNumBackspace(sender:Any?){
  491. let count = arrPassword.count
  492. if count > 0{
  493. arrPassword.removeLast()
  494. }
  495. self.chargingPasswordViews()
  496. self.printPassword()
  497. }
  498. @IBAction func clickNumCancel(sender:Any?){
  499. print("취소")
  500. let lockScreenDao = LockScreenDAO.sharedInstance
  501. lockScreenDao.pwInputType = LockScreenDAO.PASSWORD_INPUT_TYPE.UNLOCK_INPUT
  502. //뷰 초기화
  503. self.chargingPasswordViews()
  504. self.dismissSelf()
  505. }
  506. func isOlderVersionPassword() -> Bool{
  507. let lockScreenDao = LockScreenDAO.sharedInstance
  508. let pw = [0, 1, 2, 3, 4, 5].map({lockScreenDao.encryptedPasswordWithKey(key: "\($0)")})
  509. .compactMap({$0})
  510. .map({$0.decryptWithKey(key: Constants.PACS_APP_ENC_KEY)})
  511. .compactMap({$0})
  512. .reduce("", {"\($0)\($1)"})
  513. return pw.count == 4
  514. }
  515. }