forked from yankodimitrov/SwiftPasscodeLock
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPasscodeLock.swift
More file actions
99 lines (67 loc) · 2.86 KB
/
Copy pathPasscodeLock.swift
File metadata and controls
99 lines (67 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//
// PasscodeLock.swift
// PasscodeLock
//
// Created by Yanko Dimitrov on 8/28/15.
// Copyright © 2015 Yanko Dimitrov. All rights reserved.
//
import Foundation
import LocalAuthentication
public class PasscodeLock: PasscodeLockType {
public weak var delegate: PasscodeLockTypeDelegate?
public let configuration: PasscodeLockConfigurationType
public var repository: PasscodeRepositoryType {
return configuration.repository
}
public var state: PasscodeLockStateType {
return lockState
}
public var isTouchIDAllowed: Bool {
return isTouchIDEnabled() && configuration.isTouchIDAllowed && lockState.isTouchIDAllowed
}
private var lockState: PasscodeLockStateType
private lazy var passcode = [String]()
public init(state: PasscodeLockStateType, configuration: PasscodeLockConfigurationType) {
precondition(configuration.passcodeLength > 0, "Passcode length sould be greather than zero.")
self.lockState = state
self.configuration = configuration
}
public func addSign(sign: String) {
passcode.append(sign)
delegate?.passcodeLock(self, addedSignAtIndex: passcode.count - 1)
if passcode.count >= configuration.passcodeLength {
lockState.acceptPasscode(passcode, fromLock: self)
passcode.removeAll(keepCapacity: true)
}
}
public func removeSign() {
guard passcode.count > 0 else { return }
passcode.removeLast()
delegate?.passcodeLock(self, removedSignAtIndex: passcode.count)
}
public func changeStateTo(state: PasscodeLockStateType) {
lockState = state
delegate?.passcodeLockDidChangeState(self)
}
public func authenticateWithBiometrics() {
guard isTouchIDAllowed else { return }
let context = LAContext()
let reason = localizedStringFor("PasscodeLockTouchIDReason", comment: "TouchID authentication reason")
context.localizedFallbackTitle = localizedStringFor("PasscodeLockTouchIDButton", comment: "TouchID authentication fallback button")
context.evaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reason) {
success, error in
self.handleTouchIDResult(success)
}
}
private func handleTouchIDResult(success: Bool) {
dispatch_async(dispatch_get_main_queue()) {
if success {
self.delegate?.passcodeLockDidSucceed(self)
}
}
}
private func isTouchIDEnabled() -> Bool {
let context = LAContext()
return context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil)
}
}