-
-
Save ezefranca/79a346007a7beca4fa45d27be10cdf52 to your computer and use it in GitHub Desktop.
Local Authentication using Biometric
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import LocalAuthentication | |
class ViewController: UIViewController { | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
// Do any additional setup after loading the view, typically from a nib. | |
authenticationWithTouchID() | |
} | |
override func didReceiveMemoryWarning() { | |
super.didReceiveMemoryWarning() | |
// Dispose of any resources that can be recreated. | |
} | |
} | |
extension ViewController { | |
func authenticationWithTouchID() { | |
let localAuthenticationContext = LAContext() | |
localAuthenticationContext.localizedFallbackTitle = "Use Passcode" | |
var authError: NSError? | |
let reasonString = "To access the secure data" | |
if localAuthenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) { | |
localAuthenticationContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString) { success, evaluateError in | |
if success { | |
//TODO: User authenticated successfully, take appropriate action | |
} else { | |
//TODO: User did not authenticate successfully, look at error and take appropriate action | |
guard let error = evaluateError else { | |
return | |
} | |
print(self.evaluateAuthenticationPolicyMessageForLA(errorCode: error._code)) | |
//TODO: If you have choosen the 'Fallback authentication mechanism selected' (LAError.userFallback). Handle gracefully | |
} | |
} | |
} else { | |
guard let error = authError else { | |
return | |
} | |
//TODO: Show appropriate alert if biometry/TouchID/FaceID is lockout or not enrolled | |
print(self.evaluateAuthenticationPolicyMessageForLA(errorCode: error.code)) | |
} | |
} | |
func evaluatePolicyFailErrorMessageForLA(errorCode: Int) -> String { | |
var message = "" | |
if #available(iOS 11.0, macOS 10.13, *) { | |
switch errorCode { | |
case LAError.biometryNotAvailable.rawValue: | |
message = "Authentication could not start because the device does not support biometric authentication." | |
case LAError.biometryLockout.rawValue: | |
message = "Authentication could not continue because the user has been locked out of biometric authentication, due to failing authentication too many times." | |
case LAError.biometryNotEnrolled.rawValue: | |
message = "Authentication could not start because the user has not enrolled in biometric authentication." | |
default: | |
message = "Did not find error code on LAError object" | |
} | |
} else { | |
switch errorCode { | |
case LAError.touchIDLockout.rawValue: | |
message = "Too many failed attempts." | |
case LAError.touchIDNotAvailable.rawValue: | |
message = "TouchID is not available on the device" | |
case LAError.touchIDNotEnrolled.rawValue: | |
message = "TouchID is not enrolled on the device" | |
default: | |
message = "Did not find error code on LAError object" | |
} | |
} | |
return message; | |
} | |
func evaluateAuthenticationPolicyMessageForLA(errorCode: Int) -> String { | |
var message = "" | |
switch errorCode { | |
case LAError.authenticationFailed.rawValue: | |
message = "The user failed to provide valid credentials" | |
case LAError.appCancel.rawValue: | |
message = "Authentication was cancelled by application" | |
case LAError.invalidContext.rawValue: | |
message = "The context is invalid" | |
case LAError.notInteractive.rawValue: | |
message = "Not interactive" | |
case LAError.passcodeNotSet.rawValue: | |
message = "Passcode is not set on the device" | |
case LAError.systemCancel.rawValue: | |
message = "Authentication was cancelled by the system" | |
case LAError.userCancel.rawValue: | |
message = "The user did cancel" | |
case LAError.userFallback.rawValue: | |
message = "The user chose to use the fallback" | |
default: | |
message = evaluatePolicyFailErrorMessageForLA(errorCode: errorCode) | |
} | |
return message | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment