wake-up-neo.com

Bestimmen Sie, ob ein iOS-Gerät TouchID unterstützt, ohne einen Passcode festzulegen

Ich entwickle derzeit eine iOS-App, mit der sich Benutzer mit TouchID bei der App anmelden können. Zunächst müssen sie jedoch ein Kennwort in der App einrichten. Das Problem ist, dass ich feststellen muss, ob das iOS-Gerät TouchID unterstützt, um die Setup-Kennwortoption zum Aktivieren der TouchID-Anmeldung anzuzeigen.

Mithilfe von LAContext und canEvaluatePolicy (wie in den Antworten hier Wenn das Gerät Touch ID unterstützt ) kann ich feststellen, ob das aktuelle Gerät Touch ID unterstützt ob der Benutzer auf seinem iOS-Gerät einen Passcode eingerichtet hat . Hier ist ein Ausschnitt aus meinem Code (ich verwende Xamarin, es ist also in C #):

static bool DeviceSupportsTouchID () 
{
    if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
    {
        var context = new LAContext();
        NSError authError;
        bool touchIDSetOnDevice = context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out authError);

        return (touchIDSetOnDevice || (LAStatus) Convert.ToInt16(authError.Code) != LAStatus.TouchIDNotAvailable);
    }

    return false;
}

Wenn der Benutzer den Gerätepasscode nicht eingerichtet hat, gibt authError nur den Fehler "PasscodeNotSet" zurück, unabhängig davon, ob das Gerät TouchID tatsächlich unterstützt oder nicht.

Wenn das Gerät des Benutzers TouchID unterstützt, möchte ich die TouchID-Option in meiner App immer anzeigen, unabhängig davon, ob der Benutzer einen Passcode auf seinem Gerät eingerichtet hat (ich werde den Benutzer lediglich warnen, zuerst einen Passcode auf seinem Gerät einzurichten). Umgekehrt möchte ich die TouchID-Option in meiner App natürlich nicht anzeigen, wenn das Gerät des Benutzers TouchID nicht unterstützt.

Meine Frage ist also, gibt es eine gute Möglichkeit, konsequent festzustellen, ob ein iOS-Gerät TouchID unterstützt, unabhängig davon, ob der Benutzer einen Passcode auf seinem Gerät eingerichtet hat?

Die einzige Abhilfe, die ich mir vorstellen kann, besteht darin, die Architektur des Geräts zu bestimmen (die in Feststellen, ob das iOS-Gerät 32- oder 64-Bit ist beantwortet wird), da TouchID nur auf Geräten mit 64-Bit unterstützt wird die Architektur. Ich suche jedoch, ob es einen schöneren Weg gibt, dies zu tun.

Vielen Dank im Voraus! :)

20
ABVincita

Zum Abschluss der folgenden Diskussion kann vorerst nicht festgestellt werden, ob ein Gerät TouchID tatsächlich unterstützt oder nicht, wenn der Benutzer keinen Passcode auf seinem Gerät eingerichtet hat.

Ich habe diesen TouchID-Fehler im Apple Bug Reporter gemeldet. Diejenigen, die das Problem verfolgen möchten, können es hier auf Open Radar sehen: http://www.openradar.me/20342024

Danke @rckoenes für die Eingabe :)

EDIT

Es stellt sich heraus, dass jemand bereits ein ähnliches Problem gemeldet hat (# 18364575). Hier ist Apples Antwort auf das Problem:

"Das Engineering hat festgestellt, dass sich dieses Problem auf der Grundlage der folgenden Informationen wie beabsichtigt verhält:

Wenn kein Passcode festgelegt ist, können Sie die Anwesenheit der Touch ID nicht erkennen. Wenn der Passcode festgelegt ist, gibt canEvaluatePolicy schließlich LAErrorTouchIDNotAvailable oder LAErrorTouchIdNotEnrolled zurück und Sie können die Präsenz/den Status der Touch ID erkennen.

Wenn Benutzer den Passcode auf dem Telefon mit Touch ID deaktiviert haben, wussten sie, dass sie die Touch ID nicht verwenden können. Daher müssen die Apps die Präsenz von Touch ID nicht erkennen oder die auf Touch ID basierenden Funktionen fördern. "

Also ..... die endgültige Antwort von Apple lautet Nein. :(

Hinweis: Eine ähnliche StackOverflow-Frage von der Person, die dies gemeldet hat -> iOS8, ob das Gerät über eine Touch-ID verfügt (Ich frage mich, warum ich diese Frage trotz meiner umfangreichen Suche zuvor nicht gefunden habe ...)

17
ABVincita

So erkennen Sie, ob TouchID verfügbar ist:

BOOL hasTouchID = NO;
// if the LAContext class is available
if ([LAContext class]) {
    LAContext *context = [LAContext new];
    NSError *error = nil;
    hasTouchId = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
}

Es tut uns leid, dass es in Objective-C ist. Möglicherweise müssen Sie es in C # übersetzen.

Sie sollten die Systemversion nicht überprüfen und nur prüfen, ob die Klasse oder die Methoden verfügbar sind.

10
rckoenes

Ich weiß, das ist eine Frage aus dem letzten Jahr, aber diese Lösung macht nicht das, was Sie brauchen? (SWIFT-Code)

if #available(iOS 8.0, *) {
    var error: NSError?
    let hasTouchID = LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error)

    //Show the touch id option if the device has touch id hardware feature (even if the passcode is not set or touch id is not enrolled)
    if(hasTouchID || (error?.code != LAError.TouchIDNotAvailable.rawValue)) {
        touchIDContentView.hidden = false
    } 
}

Wenn der Benutzer dann die Taste drückt, um sich mit der Touch-ID anzumelden:

@IBAction func loginWithTouchId() {
    let context = LAContext()

    var error: NSError?
    let reasonString = "Log in with Touch ID"

    if (context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error)) {
        [context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { (success: Bool, evalPolicyError: NSError?) -> Void in
            //Has touch id. Treat the success boolean
        })]
    } else { 
        //Then, if the user has touch id but is not enrolled or the passcode is not set, show a alert message
        switch error!.code{

        case LAError.TouchIDNotEnrolled.rawValue:
            //Show alert message to inform that touch id is not enrolled
            break

        case LAError.PasscodeNotSet.rawValue:
            //Show alert message to inform that passcode is not set
            break

        default:
            // The LAError.TouchIDNotAvailable case.
            // Will not catch here, because if not available, the option will not visible
        }
    }
}

Ich hoffe es hilft!

7
pcsantana

Für Ziel C
Funktioniert auf allen Geräten ohne Überprüfung der Geräteversion.

- (void)canAuthenticatedByTouchID{
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = touchIDRequestReason;

if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
 }else{
    switch (authError.code) {
        case kLAErrorTouchIDNotAvailable:
            [labelNotSupportTouchID setHidden:NO];
            [switchBtn setHidden:YES];
            [labelEnableTouchid setHidden:YES];
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                [self showAlertMessage:@"EyeCheck Pro" message:@"Device does not support Touch ID Service."];
            });

            break;
    }
  }
}
4
Avinash Jadhav

Hier ist ein etwas langwieriger Weg, um herauszufinden, ob das Gerät einen physischen Berührungs-ID-Sensor hat. 

+ (BOOL)isTouchIDExist {
if(![LAContext class]) //Since this mandotory class is not there, that means there is no physical touch id.
    return false;

//Get the current device model name
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *model = malloc(size);
sysctlbyname("hw.machine", model, &size, NULL, 0);
NSString *deviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];

//Devices that does not support touch id
NSArray *deviceModelsWithoutTouchID = [[NSArray alloc]
                                       initWithObjects:
                                       @"iPhone1,1", //iPhone
                                       @"iPhone1,2", //iPhone 3G
                                       @"iPhone2,1", //iPhone 3GS
                                       @"iPhone3,1", //iPhone 4
                                       @"iPhone3,2",
                                       @"iPhone3,3",
                                       @"iPhone4,1", //iPhone 4S
                                       @"iPhone5,1", //iPhone 5
                                       @"iPhone5,2",
                                       @"iPhone5,3", //iPhone 5C
                                       @"iPhone5,4",
                                       @"iPod1,1", //iPod
                                       @"iPod2,1",
                                       @"iPod3,1",
                                       @"iPod4,1",
                                       @"iPod5,1",
                                       @"iPod7,1",
                                       @"iPad1,1", //iPad
                                       @"iPad2,1", //iPad 2
                                       @"iPad2,2",
                                       @"iPad2,3",
                                       @"iPad2,4",// iPad mini 1G
                                       @"iPad2,5",
                                       @"iPad2,5",
                                       @"iPad2,7",
                                       @"iPad3,1", //iPad 3
                                       @"iPad3,2",
                                       @"iPad3,3",
                                       @"iPad3,4", //iPad 4
                                       @"iPad3,5",
                                       @"iPad3,6",
                                       @"iPad4,1", //iPad Air
                                       @"iPad4,2",
                                       @"iPad4,3",
                                       @"iPad4,4", //iPad mini 2
                                       @"iPad4,5",
                                       @"iPad4,6",
                                       @"iPad4,7",
                                       nil];

return ![deviceModelsWithoutTouchID containsObject:deviceModel];

}

Referenz: https://www.theiphonewiki.com/wiki/Modelshttps://en.wikipedia.org/wiki/IOS

3
Siva

Im Folgenden wird beschrieben, wie Sie feststellen können, ob die Touch-ID oder die Gesichts-ID auf dem Gerät unterstützt wird

open class LocalAuth: NSObject {

    public static let shared = LocalAuth()

    private override init() {}

    var laContext = LAContext()

    func canAuthenticate() -> Bool {
        var error: NSError?
        let hasTouchId = laContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)
        return hasTouchId
    }

    func hasTouchId() -> Bool {
        if canAuthenticate() && laContext.biometryType == .touchID {
            return true
        }
        return false
    }

    func hasFaceId() -> Bool {
        if canAuthenticate() && laContext.biometryType == .faceID {
            return true
        }
        return false
    }

}

Im Folgenden wird die Verwendung des oben genannten freigegebenen Codes beschrieben

if LocalAuth.shared.hasTouchId() {
    print("Has Touch Id")
} else if LocalAuth.shared.hasFaceId() {
    print("Has Face Id")
} else {
    print("Device does not have Biometric Authentication Method")
}
1
Vaibhav Jhaveri

Für iOS 11+ können Sie biometryType: LABiometryType von LAContext verwenden. Mehr aus der Apple-Dokumentation:

/// Indicates the type of the biometry supported by the device.
///
/// @discussion  This property is set only when canEvaluatePolicy succeeds for a biometric policy.
///              The default value is LABiometryTypeNone.
@available(iOS 11.0, *)
open var biometryType: LABiometryType { get }

@available(iOS 11.0, *)
public enum LABiometryType : Int {

    /// The device does not support biometry.
    @available(iOS 11.2, *)
    case none

    /// The device does not support biometry.
    @available(iOS, introduced: 11.0, deprecated: 11.2, renamed: "LABiometryType.none")
    public static var LABiometryNone: LABiometryType { get }

    /// The device supports Touch ID.
    case touchID

    /// The device supports Face ID.
    case faceID
}
0
cocavo