Search code examples
iosiphone-xface-idlocalauthentication

Biometry Type when user denied biometry usage


In our app, the user has to register to the device biometry in order to use it for authentication. The registration text and legal notes are according to the relevant biometry (register to touch ID or register to face ID) As far as I found, the biometry type is obtainable via the LAContext, but if the user denies usage of biometry, then the context returns biometryType=.none

Any ideas other that asking for the screen size and comparing to iphone X (bad bad code)?

    static fileprivate var biometryType: DSLocalAuthenticationBiometryType {
        let context = LAContext()

        var error: NSError?
        let _ = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)

        if #available(iOS 11.0, *) {

            return context.biometryType == .typeFaceID ? .typeFaceID : .none
        }
        else {
            return .none
        }
    }

Thanks


Solution

  • I've got the same identical issue, and I've just found out that if you evaluate against the key LAPolicyDeviceOwnerAuthentication instead of LAPolicyDeviceOwnerAuthenticationWithBiometrics, even after the user declined the permission, the evaluation succeeds and you get the correct biometryType. Your code would be like

    static fileprivate var biometryType: DSLocalAuthenticationBiometryType {
        let context = LAContext()
    
        var error: NSError?
        let _ = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)
    
        if #available(iOS 11.0, *) {
    
            return context.biometryType == .typeFaceID ? .typeFaceID : .none
        }
        else {
            return .none
        }
    }
    

    NOTE: on devices without touch id and face id, it still returning YES, so you would not know whether the device really has a biometric hw or not with iOS lower than 11 (which do not expose the property biometriyType)

    Update

    For devices with iOS version 10 or lower, you can use the LAPolicyDeviceOwnerAuthenticationWithBiometrics as usual, it will behave correctly (returning true whether the device supports the touch Id), so it's just a matter of differentiating the running OS version :)

    Let me know if it works :)

    Best