앱 내 Touch ID를 사용한 사용자 인증

10986 단어 iOSSwiftTouchIDswift3

소개


  • 모바일 장치의 경우 인증이 중요합니다 (모바일이 아닐지라도)
  • iOS 기기에는 Touch ID라는 지문 인증 기능이 내장되어 있습니다.
  • Touch ID는 놀랍도록 쉽게 앱에서 사용할 수 있습니다.

    검증 환경


  • Xcode 8.3.3
  • Swift 3.1
  • iOS 10.3

  • 사용하는 기능



    LocalAuthentication 프레임워크



    LAContext 클래스


  • 이 클래스를 이용해 인증을 실시합니다.
  • Touch ID 탑재 된 장치의 경우 Touch ID (또는 Passcode)를, 탑재되지 않은 장치의 경우 Passcode를 사용하여 인증합니다.



    방법
    설명


    canEvaluatePolicy(_: error:) -> Bool
    Touch ID가 탑재되어 있어 유효한 상태, 또는 Passcode 가 설정되어 있는 상태 (Touch ID 가 없어도)이면 true 를 돌려준다.

    evaluatePolicy(_: localizedReason: reply:)
    Touch ID 또는 Passcode를 사용하여 인증을 수행합니다. 인증 결과에 대한 처리는 제 3 인수의 콜백으로서 지정된다.


    LAPolicy 열거형


  • 상기의 메소드에 건네주는 상수가 정의되고 있습니다.
  • iOS 9 이상이면 후자의 deviceOwnerAuthentication을 사용합니다.



    상수
    설명


    deviceOwnerAuthenticationWithBiometrics
    iOS 8에서 이용. iOS 9 이상에서 이 상수를 이용하면 폴백 버튼(지문이 인증되지 않은 경우 Passcode 입력을 촉구하는 버튼)을 눌러도 입력 화면이 나오지 않습니까? 1

    deviceOwnerAuthentication
    iOS 9 이상에서 사용.


    구현 예



    ViewController.swift
    import UIKit
    import LocalAuthentication
    
    class ViewController: UIViewController {
        @IBOutlet weak var authResultLabel: UILabel!
    
        @IBAction func authenticate(_ sender: UIButton) {
            let myContext = LAContext()
            self.configure(context: myContext)
            let reason = "Only device owner can use this feature."
    
            var authError: NSError? = nil
    
            // Touch ID が有効または Passcode がセットされている状態であることを確認
            if myContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
                // 認証を実行
                myContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, evaluateError) in
                    if success {
                        print("Success")
    
                        DispatchQueue.main.async {
                            self.authResultLabel.text = "Success"
                        }
                    } else {
                        let error = evaluateError! as NSError
                        let errorMessage = "\(error.code): \(error.localizedDescription)"
    
                        print(errorMessage)
    
                        DispatchQueue.main.async {
                            self.authResultLabel.text = errorMessage
                        }
                    }
                }
            } else {
                // Touch ID と Passcode のいずれも有効ではない場合
    
                let errorMessage = "\(authError!.code): \(authError!.localizedDescription)"
                print(errorMessage)
    
                DispatchQueue.main.async {
                    self.authResultLabel.text = errorMessage
                }
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        /// ボタンの文字列をカスタマイズ
        private func configure(context: LAContext) {
            context.localizedCancelTitle = "キャンセル"
            context.localizedFallbackTitle = "パスコードを入力"
        }
    }
    

    실행 결과



    초기 상태(Authenticate 버튼을 누르면 지문 인증 실행)





    지문 인증





    지문 인증 실패(패스 코드 입력을 촉구하는 버튼 표시)





    패스코드 입력





    성공시





    취소 시





    패스코드가 설정되지 않은 경우





    샘플 프로젝트


  • 이번에 만든 샘플은 GitHub에서 다운로드할 수 있습니다.
  • aokiplayer / LocalAuthSample : iOS app sample of authorization using Touch ID.


  • 참고 사이트



  • App-Level Passcode | Cocoanetics
  • iOS 9 이상에서는 deviceOwnerAuthentication을 사용한다는 설명이 있습니다


  • LAContext - LocalAuthentication | Apple Developer Documentation
  • 공식 문서 (정보가 오래되었습니까?)






  • Apple 공식 문서에서 이 동작에 대한 설명을 찾을 수 없습니다. 아시는 분이 계시면, 지적 받을 수 있으면 기쁩니다. 또한 iOS 8이 장착된 기기가 없었기 때문에 iOS 8에서 확인할 수 없습니다.

    좋은 웹페이지 즐겨찾기