티스토리 뷰

안녕하세요. 

요즘은 로그인 할때 비밀번호 외에도 여러가지 방법이 있죠? 

물론 저번의 패턴 잠금도 있지만 오늘은 많이 쓰이는 생체 인식을 알아보려고 합니다.

 

생채인식이란?

- 신체 부위를 이용해서 자신임을 증명하는 방법을 의미합니다. 

- 현재 지원해주는 종류는 지문(TouchID) / 얼굴 (FaceID) / 홍채 (OpticID) 이렇게 3가지 입니다.

- 각 휴대폰에서 지원해주는 종류(지문/얼굴/홍채)에 따라 사용이 가능합니다. 

- 홍채 (OpticID) iOS 17부터 지원해줍니다. (나머지는 iOS 11부터)

 

필요 권한 

- 당연히 Apple 에서 제공해주는 기능인 만큼 권한을 받아야 합니다

- NSFaceIDUsageDescriptionInfo.plist 에 넣어줍니다. 

이런 식으로 넣어주세요.

기본 준비 

- 생각보다 간단하게도 아래 한줄을 추가하시면 간단히 사용이 가능합니다. 

- 이름 보면 아시겠지만 단순 신체인증 뿐 아니라 다른 인증에도 관여하는 친구입니다.

import LocalAuthentication // 생체 인식
// 줄여서 LA

- 그리고 편한 사용을 위해 따로 클래스랑 변수 하나를 선언해 줄께요.

import LocalAuthentication

// 생체 인증에 관한 처리 정리
class BioUtil{
    static let context = LAContext()
    //인증 정책과 엑세스를 제어해주는 도구
}

- 이제 이 안에다가 함수를 채워가겠습니다.

 

내 기기에서 지원해주는 종류 확인

- 정말 종류만 확인하는 방법입니다.

- 참고로 시뮬레이터에 돌리시면 LABiometryType.none이 발생합니다.

// 타입 확인
static func getBioType(){
    let type = self.context.biometryType
    switch type{
    case LABiometryType.none:
        print("Nothing") // 없음
        break
    case LABiometryType.faceID: // ios 11
        print("Face") // 얼굴인식
        break
    case LABiometryType.touchID: //ios 11
        print("Finger") //지문인식
        break
    case LABiometryType.opticID: //ios 17 부터 지원
        print("Optic") // 홍채
        break
    default:
        print("I don't know")
        break
    }
}

 

인증 사용 가능 여부 확인

- 옵션에 따라 해당 인증을 진행할 수 있는지를 알려줍니다. 

- 필요에 따라 왜 인증이 안되는지 오류코드로 알 수 있습니다.

- 만약 나는 오류 코드는 알 필요없다 하시는 분은 nil 넣으시면 됩니다. 

- deviceOwnerAuthenticationWithBiometrics : 생체인증을 사용한 인증

- deviceOwnerAuthentication : 생체인증이 안되면 비밀번호같은 다른 인증도 가능 

static func canBioAuth()->Bool{
	// error 를 알 필요 없는 경우
	return self.context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil)
	// deviceOwnerAuthenticationWithBiometrics : 생체 인증을 사용한 인증
	// deviceOwnerAuthentication : 인증 그 자체 생체인증 안되면 딴걸로
	// 기본 리턴 값은 Bool
}
static func canBioAuth()->Bool{
    var newError : NSError? = nil
    let result = self.context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &newError)
    let errorArray = [LAError.appCancel,LAError.authenticationFailed,LAError.biometryLockout,LAError.biometryNotAvailable,LAError.biometryNotEnrolled,LAError.invalidContext,LAError.notInteractive,LAError.passcodeNotSet,LAError.systemCancel,LAError.userCancel,LAError.userFallback]
    if !result{
        for error in errorArray{
            if(LAError(_nsError: newError!).code == error){
                print(error) // 어떤 오류인지 알고 싶은 경우
            }
        }
    }
    return result
}

- 시뮬레이터에서 돌려보면 아래처럼 보이게 됩니다. 

오류 종류가 잘 보이죠?

- 참고로 각 오류 코드가 의미하는 것은 아래 링크를 참고해주세요. 

https://developer.apple.com/documentation/localauthentication/laerror-swift.struct/code

 

LAError.Code | Apple Developer Documentation

Errors issued by the LocalAuthentication framework.

developer.apple.com

 

인증 진행하기 

- 정작 인증을 실행하는 방법을 안 적었네요.

- 생각보다 간단한데 아래처럼 작성하고 (저는 생체인증만 쓸거니까 deviceOwnerAuthenticationWithBiometrics 로 할께요.)

static func startBioAuth(completion: @escaping (Bool)->Void){
    self.context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "인증을 진행하는 이유", reply: {suc,err in
        if(err != nil){
            print(err as Any) //오류 뱉기
        }
        completion(suc)
    })
}

- 사용할 곳에 아래처럼 넣어주시면 작동합니다. 

BioUtil.startBioAuth(){suc in
    print(suc)
}

- 시뮬레이터에 넣으면 False 떨어집니다 (오류코드가 뜨긴 하지만 앱이 꺼지거나 하지는 않아요)

 

실제로 해보면 처음에는 권한 창이 뜨고

권한 창이 보이시나요?

얼굴 인식이 진행되게 됩니다

(근데 이거 빨라서 캡쳐가 힘들어요;;;)

너무 빨라서 캡쳐 실패;;

아무튼 잘 작동하는 것 같네요. 

 

저처럼 궁금한 분들에게 도움이 되길 바라며

그럼 오늘도 파이팅입니다.

댓글