Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active June 25, 2018 01:25
Show Gist options
  • Save KentarouKanno/6d6cd379d6351b6c946584612b08d75d to your computer and use it in GitHub Desktop.
Save KentarouKanno/6d6cd379d6351b6c946584612b08d75d to your computer and use it in GitHub Desktop.
LocalAuthentication

LocalAuthentication(swift4.2)

LocalAuthentication iOSで生体認証(Face ID, Touch ID)のまとめ

  • Info.plist(Face ID使用時)
<key>NSFaceIDUsageDescription</key>
<string>FaceID使います。</string>
LAPolicy 

//認証失敗時にパスワード入力の選択が出るが、選択してもダイアログが閉じるだけ。
* deviceOwnerAuthenticationWithBiometrics

// 認証失敗時にパスワード入力の選択が出る、選択するとパスワード入力画面が出る。
* deviceOwnerAuthentication

★ Touch ID、Face ID用コード

import UIKit
import LocalAuthentication

class ViewController: UIViewController {
    
    @IBAction func tappedAuthbutton(_ sender: UIButton) {
        
        let context = LAContext();
        var error :NSError?
        
        // Touch ID が利用できるデバイスか確認する
        if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
            
            // 利用できる場合は指紋認証を要求する
            context.evaluatePolicy(
                LAPolicy.deviceOwnerAuthenticationWithBiometrics,
                localizedReason:"指紋認証メッセージ") { success, error in
                    
                    // 認証成功
                    if #available(iOS 11.0, *) /* iOS11以降 */ {
                        if (success) {
                            switch context.biometryType {
                            case .faceID:
                                // Face IDが利用出来る
                                print("Available FaceID")
                            case .touchID:
                                // Touch IDが利用できる
                                print("Available TouchID")
                            case .none:
                                // Face ID, Touch IDの利用が出来ない (この場合、この条件には入ってこないはず)
                                break
                            }
                        } else {
                            print("許可しないを選択")
                        }
                        
                    } else {
                        // Fallback on earlier versions
                        if (success) {
                            // 指紋認証成功
                            print("Success")
                        } else {
                            // 指紋認証失敗
                            print("Failed")
                        }
                    }
                    
                    if let error = error {
                        print("An Error Occurred: \(String(describing: error))")
                    }
            }
        } else {
            // 許可しないで、利用できない場合
            print("An Error Occurred: \(String(describing: error))")
        }
    }
}

★ Touch ID,Face ID & パスコード入力

import UIKit
import LocalAuthentication

class ViewController: UIViewController {
    
    @IBAction func tappedAuthbutton(_ sender: UIButton) {
        
        let context = LAContext();
        var error :NSError?
        
        // Touch ID が利用できるデバイスか確認する
        if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &error) {
            
            // 利用できる場合は指紋認証を要求する
            context.evaluatePolicy(
                LAPolicy.deviceOwnerAuthentication,
                localizedReason:"指紋認証メッセージ") { success, error in
                    
                    // 認証成功
                    if #available(iOS 11.0, *) /* iOS11以降 */ {
                        if (success) {
                            switch context.biometryType {
                            case .faceID:
                                // Face IDが利用出来る
                                print("Available FaceID")
                            case .touchID:
                                // Touch IDが利用できる
                                print("Available TouchID")
                            case .none:
                                // Face ID, Touch IDの利用が出来ない (この場合、この条件には入ってこないはず)
                                break
                            }
                        } else {
                            print("許可しないを選択")
                        }
                        
                    } else {
                        // Fallback on earlier versions
                        if (success) {
                            // 指紋認証成功
                            print("Success")
                        } else {
                            // 指紋認証失敗
                            print("Failed")
                        }
                    }
                    
                    if let error = error {
                        print("An Error Occurred: \(String(describing: error))")
                    }
            }
        } else {
            // 許可しないで、利用できない場合
            print("An Error Occurred: \(String(describing: error))")
        }
    }
}
LAError.Code種別 Error Code 説明
authenticationFailed -1 ユーザーが生体認証を利用するにあたり必要な情報を獲得できなかった為、認証に失敗
appCancel -9 アプリ側でキャンセルが掛かった
invalidContext -10 何かしらのエラー
notInteractive -1004 インタラクティブではない?
passcodeNotSet -5 端末にパスコードがセットされていない
systemCancel -4 システムで認証がキャンセルされた
touchIDLockout -8 Face ID/Touch IDがロックアウトされた
touchIDNotAvailable -6 端末でFace ID/Touch IDを使用できない為、認証できなかった
touchIDNotEnrolled -7 指紋認証に失敗
userCancel -2 認証ダイアログでユーザがキャンセルボタンを押した
userFallback -3 ユーザが認証ダイアログでFallbackしたが、認証ポリシーにFallbackが使用できなかった。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment