web-dev-qa-db-ja.com

iOS-Face ID生体認証統合

アプリにFace ID(ローカル認証)認証を統合/実装しましたが、Face IDプロンプトアラートウィンドウインターフェイスを除いて、すべて正常に動作します。

薄い灰色の背景とタイトル「顔ID」の丸みを帯びた正方形が表示されます。

タイトルの真上の空白領域に何を設定する必要がありますか?顔IDアイコン用のスペースですか?はいの場合、どのように設定できますか? LAContextとLAPolicyのすべてを試しました。

このスナップショットを見てください:

enter image description here

これが私のコードです:

    let laContext = LAContext()
    var error: NSError?
    let biometricsPolicy = LAPolicy.deviceOwnerAuthenticationWithBiometrics

    if (laContext.canEvaluatePolicy(biometricsPolicy, error: &error)) {

        if let laError = error {
            print("laError - \(laError)")
            return
        }

        var localizedReason = "Unlock device"
        if #available(iOS 11.0, *) {
            switch laContext.biometryType {
            case .faceID: localizedReason = "Unlock using Face ID"; print("FaceId support")
            case .touchID: localizedReason = "Unlock using Touch ID"; print("TouchId support")
            case .none: print("No Biometric support")
            }
        } else {
            // Fallback on earlier versions
        }


        laContext.evaluatePolicy(biometricsPolicy, localizedReason: localizedReason, reply: { (isSuccess, error) in

            DispatchQueue.main.async(execute: {

                if let laError = error {
                    print("laError - \(laError)")
                } else {
                    if isSuccess {
                        print("sucess")
                    } else {
                        print("failure")
                    }
                }

            })
        })
    }
9
Krunal

これはシミュレータでのみ発生します。実際のデバイスでは、キャンバスは顔アイコンのアニメーションで占められています。

どちらも同じAPIを共有しているため、localizedReasonはTouch ID専用です。

更新1:追加された画面記録:

彼らはすべて同じコードを実行しました:

func beginFaceID() {

    guard #available(iOS 8.0, *) else {
        return print("Not supported")
    }

    let context = LAContext()
    var error: NSError?

    guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
        return print(error)
    }

    let reason = "Face ID authentication"
    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { isAuthorized, error in
        guard isAuthorized == true else {
            return print(error)
        }

        print("success")
    }

}

以下は、すべてのエラーコードを含むTouchIDとFaceIDの両方の作業コードです(Swift 4)

https://stackoverflow.com/a/52093551/10150796

16
DazChong

生体認証を使用するプロジェクトでは、アプリのInfo.plistファイルに NSFaceIDUsageDescription キーを含めます。このキーがないと、システムはアプリがFace IDを使用することを許可しません

let authContext = LAContext()
        authContext.localizedFallbackTitle = "Use Passcode"
        authContext.localizedCancelTitle = "Cancel"

var authError: NSError?

if authContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
   evaluatePolicy(policy, context: authContext)
} else {
     guard let error = authError else { return }
     print("Error: \(error.code)")
     checkError(error)
}

private func evaluatePolicy(_ policy: LAPolicy, context: LAContext) {
        context.evaluatePolicy(policy, localizedReason: reason) { (success, error) in
            if success {
                print("Success")

            } else {
                guard let error = error else { return }
                self.checkError(error as NSError)
            }
        }
}

private func checkError(_ error: NSError) {
    guard let error = error as? LAError else { return }

    switch error.code {
    case .authenticationFailed:
        print("authenticationFailed")
        requestAuth(policy: .deviceOwnerAuthentication)
    case .userFallback:
        print("userFallback")
        requestAuth(policy: .deviceOwnerAuthentication)
    case .userCancel:
        print("userCancel")
    case .systemCancel:
        print("systemCancel")
    case .passcodeNotSet:
        print("passcodeNotSet")
    case .appCancel:
        print("appCancel")
    case .invalidContext:
        print("invalidContext")
    case .notInteractive:
        print("notInteractive")
    default:
        checkBioMetricError(error)
    }
}

private func checkBioMetricError(_ error: LAError) {
    if #available(iOS 11.0, *) {

        switch error.code {
        case .biometryNotAvailable,
             .biometryNotEnrolled,
             .biometryLockout:
            requestAuth(policy: .deviceOwnerAuthentication)

        default: break
        }
    } else {
        switch error.code {

        case .touchIDNotAvailable,
             .touchIDNotEnrolled,
             .touchIDLockout:
            requestAuth(policy: .deviceOwnerAuthentication)

        default: break
        }
    }
}
1
Lal Krishna