15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Face IDとTouch IDの対応は意外と簡単!

Posted at

##はじめに
FaceIDについて調べたのでメモです。

##Info.plistにNSFaceIDUsageDescriptionを追加
NSFaceIDUsageDescriptionで許可を求めるようにします。

Info.plist
	<key>NSFaceIDUsageDescription</key>
	<string>Face IDで認証します。</string>

Source Code
スクリーンショット 2017-12-02 17.21.15.png

Property List
スクリーンショット 2017-12-02 17.20.52.png

####注意
許可を求めないと下記のようなアラートが出てきます。
Face IDに対応していないと言われます。(Face ID認証はされます)
IMG_0855 2.PNG

NSFaceIDUsageDescription を追加すると下記のようなアラートに変わります。
IMG_0856 3.PNG

##コード
下記のようなコードでiPhone XならFace ID、Touch IDデバイスならToutch IDで認証します。
認証するためのアラートやアニメーションは勝手に出てきます。

Swift
        let context = LAContext()
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
            let localizedReason = "指紋認証を行なってください。"
            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: localizedReason, reply: { success, error in
                if let error = error {
                    switch LAError(_nsError: error as NSError) {
                    case LAError.userCancel:
                        // キャンセル
                        reply(.cancel)
                    case LAError.userFallback:
                        // パスコードを入力
                        reply(.userFallback)
                    case LAError.authenticationFailed:
                        reply(.error(.authenticationFailed))
                    case LAError.passcodeNotSet:
                        reply(.error(.passcodeNotSet))
                    case LAError.systemCancel:
                        reply(.error(.systemCancel))
                    default:
                        reply(.error(.unknownError))
                    }
                } else if success {
                    reply(.success)
                } else {
                    reply(.error(.unknownError))
                }
            })
        } else {
            reply(.error(.notSupport))
        }

##Face IDかTouch IDかを判断
認証するためのボタンをFace IDとTouch IDで分けたい場合は、どちらで認証されるのかを知る必要があります。
その場合、biometryTypeを使います。
iOS11から使用できるメソッドなのでif #available(iOS 11.0, *) {とする必要があり、context.canEvaluatePolicyがtrueでiOS10の場合はTouch IDだと判断できます。

Swift
        let context = LAContext()
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
            if #available(iOS 11.0, *) {
                switch context.biometryType {
                case .typeTouchID:
                    return .touchId
                case .typeFaceID:
                    return .faceId
                case .none:
                    return .none
                }
            } else {
                return .touchId
            }
        } else {
            return .none
        }

##GitHub
LocalAuthenticationManagerというクラスで処理を書いています。
https://github.com/hideyukitone/LocalAuthenticationSample

##最後に
意外と簡単でした。
少ない工数で最新の技術を取り入れているように見えるのでオススメです!

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?