Its bit early to ask but I'm planning to add feature specially for FaceID, so before that I need to validate either device support FaceID or not? Need suggestion and help. Thanks in advance.
Its bit early to ask but I'm planning to add feature specially for FaceID, so before that I need to validate either device support FaceID or not? Need suggestion and help. Thanks in advance.
I found that you have to call canEvaluatePolicy before you will properly get the biometry type. If you don't you'll always get 0 for the raw value.
So something like this in Swift 3, tested and working in Xcode 9.0 & beta 9.0.1.
class func canAuthenticateByFaceID () -> Bool {
//if iOS 11 doesn't exist then FaceID doesn't either
if #available(iOS 11.0, *) {
let context = LAContext.init()
var error: NSError?
if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
//As of 11.2 typeFaceID is now just faceID
if (context.biometryType == LABiometryType.typeFaceID) {
return true
}
}
}
return false
}
You could of course write that just to see if it's either biometric and return the type along with the bool but this should be more than enough for most to work off of.
Thanks Ashley Mills, I created a function to detect FaceID in Device.
- (BOOL)canAuthenticateByFaceID {
LAContext *context = [[LAContext alloc] init];
if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
if (context.biometryType == LABiometryTypeFaceID && @available(iOS 11.0, *)) {
return YES;
} else {
return NO;
}
}
}
Hope this will help other. Happy coding!!
Finally I wrote my own Library for detecting FaceID here you find
Swift 4 compatible version
var isFaceIDSupported: Bool {
if #available(iOS 11.0, *) {
let localAuthenticationContext = LAContext()
if localAuthenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
return localAuthenticationContext.biometryType == .faceID
}
}
return false
}
+(BOOL)supportFaceID
{
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
// call this method only to get the biometryType and we don't care about the result!
[myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError];
NSLog(@"%@",authError.localizedDescription);
if (@available(iOS 11.0, *)) {
return myContext.biometryType == LABiometryTypeFaceID;
} else {
// Device is running on older iOS version and OFC doesn't have FaceID
return NO;
}
}