스냅 사진, 자기 관리와 같은 개인정보 보호를 위해 생체인증을 사용해 앱 잠금을 구현하는 방법을 정리해보려고 한다. 이 과정은 LocalAuthentication 프레임워크를 기반으로 구현하였다.
생체인증을 사용하려면 Info.plist 파일에 아래의 키를 추가해야 한다.
키 값은 Face ID 사용을 허용하기 위한 설명 문구이고 처음으로 Face ID를 요청할 때 사용자에게 표시된다. 배포 시 리젝당하지 않게 인증 목적을 명확하게 써주어야한다.
LocalAuthenticationViewModel 클래스의 execute 메소드에서 인증 관리를 한다.
final class LocalAuthenticationViewModel {
static func execute(completion: @escaping (Bool, Error?) -> Void) {
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "인증이 필요합니다.") { (response, error) in
if let error = error {
self.handleAuthenticationError(error: error as NSError)
}
completion(response, error)
}
} else {
print("Local Authentication is not available")
}
}
}
SceneDelegate에서 UserDefaults에 저장된 appLockState 값을 통해 앱 잠금 기능이 켜져 있는지 확인한다. 잠금 기능은 앱 내에 설정 화면의 토글을 통해 ON/OFF가 가능하도록 하였으며 ON으로 설정하면 UserDefaults에 appLockState 값이 true로 저장된다.
let appLockState = UserDefaults.standard.bool(forKey: "appLockState")
if appLockState {
LocalAuthenticationViewModel.execute { (success, error) in
if success {
self.showMainScreen()
}
시뮬레이터에 Face ID Enrolled 후 테스트 가능