Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 생체인증 페이스 아이디, 터치 아이디(Face ID, Touch ID) 본문

iOS 응용 (swift)

[iOS - swift] 생체인증 페이스 아이디, 터치 아이디(Face ID, Touch ID)

jake-kim 2021. 10. 30. 03:42

Face ID 권한 요청

  • 처음 Face ID 권한 요청을 위해 최초 한번 뜨는 alert
    • touchID는 손가락을 댈때 인증이 시작하지만, FaceID는 폰과 얼굴을 마주보고 있어서 바로 인증이 진행되므로  필요
  • key: Privacy - Face ID Usage Description
  • value: 사용자에게 표출되는 안내 문구

  • Face ID 인증 alert

  • value값 문구 정의 주의
    • Face ID 인증을 사용할 땐 문구에 접근하는 이유를 명확히 할 것 (Touch ID는 필요 x)

구현 방법

  • LocalAuthentication 임포트
import LocalAuthentication
  • LAContext() 인스턴스 생성
    • 앱과 Secure Enclave를 연결해주는 인스턴스

  • App과 Secure Enclave

  • 인증 결과 관련 델리게이트 
public protocol AuthenticateStateDelegate: AnyObject {
    /// loggedIn상태인지 loggedOut 상태인지 표출
    func didUpdateState(_ state: BiometricsAuth.AuthenticationState)
}
  • 모듈 구현
public class BiometricsAuth {

    public enum AuthenticationState {
        case loggedIn
        case LoggedOut
    }

    public weak var delegate: AuthenticateStateDelegate?
    private var context = LAContext()

    init() {
        configure()
    }

    private func configure() {
        /// 생체 인증이 실패한 경우, Username/Password를 입력하여 인증할 수 있는 버튼에 표출되는 문구
        context.localizedCancelTitle = "Enter Username/Password"
    }

    public func execute() {

        var error: NSError?
        if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
            let reason = "Log in to your account"
            context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { [weak self] isSuccess, error in
                // 내부적으로 Face ID가 실패한 경우 자동으로 암호 입력
                // 성공하면 아래 DispatchQueue 실행
                if isSuccess {
                    DispatchQueue.main.async { [weak self] in
                        self?.delegate?.didUpdateState(.loggedIn)
                    }
                } else {
                    print(error?.localizedDescription ?? "Failed to authenticate")
                }
            }
        } else {
            print(error?.localizedDescription ?? "Can't evaluate policy")
        }
    }
}

사용

  • 최초 인증 시도 - alert 표출

  • face id 인증 작동

  • 실패한 경우

  • 여러번 실패한 경우 - 암호 입력 버튼 생성, 또 Face ID로 실패한 경우 바로 암호 입력창으로 이동

* 전체 소스 코드: https://github.com/JK0369/ExFaceIDTouchID

 

* 참고

Integrating Face ID/ Touch ID: https://medium.com/swift2go/integrating-face-id-touch-id-in-ios-78da7080f742

apple document: 

https://developer.apple.com/documentation/localauthentication/logging_a_user_into_your_app_with_face_id_or_touch_id

Comments