21

私は現在、ユーザーが TouchID を使用してアプリにログインできるようにする iOS アプリを開発していますが、最初にアプリ内でパスワードを設定する必要があります。問題は、TouchID ログインを有効にするセットアップ パスワード オプションを表示するには、iOS デバイスが TouchID をサポートしているかどうかを検出する必要があることです。

LAContext と canEvaluatePolicy を使用して (ここのIf Device Supports Touch IDの回答のように)、ユーザーが iOS デバイスでパスコードを設定している場合、現在のデバイスが TouchID をサポートしているかどうかを判断できます。これが私のコードスニペットです(私はXamarinを使用しているので、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;
}

ユーザーがデバイスのパスコードを設定していない場合、デバイスが実際に TouchID をサポートしているかどうかに関係なく、authError は「PasscodeNotSet 」エラーを返します。

ユーザーのデバイスが TouchID をサポートしている場合、ユーザーがデバイスでパスコードを設定しているかどうかに関係なく、常にアプリに TouchID オプションを表示したいと考えています (最初にデバイスでパスコードを設定するようにユーザーに警告します)。逆に、ユーザーのデバイスが TouchID をサポートしていない場合、アプリに TouchID オプションを表示したくないことは明らかです。

私の質問は、ユーザーがデバイスにパスコードを設定しているかどうかに関係なく、iOS デバイスが TouchID をサポートしているかどうかを一貫して判断する良い方法はありますか?

TouchID は 64 ビット アーキテクチャのデバイスでのみサポートされているため、考えられる唯一の回避策は、デバイスのアーキテクチャを特定することです ( iOS デバイスが 32 ビットか 64 ビットかを判断するで回答されています)。しかし、これを行うためのより良い方法があるかどうかを探しています。

4

8 に答える 8

14

TouchID が利用可能かどうかを検出する正しい方法:

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];
}

Objective-C で申し訳ありませんが、C# に翻訳する必要があるかもしれません。

システムのバージョンを確認するのはやめて、クラスまたはメソッドが使用可能かどうかだけを確認する必要があります。

于 2015-03-26T13:40:44.017 に答える
7

これは昨年の質問であることは承知していますが、この解決策では必要なものが得られませんか? (スウィフトコード)

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
    } 
}

次に、ユーザーがボタンを押してタッチ ID でログインすると、次のようになります。

@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
        }
    }
}

それが役に立てば幸い!

于 2016-06-21T20:11:52.547 に答える
0

iOS 11 以降biometryType: LABiometryTypeでは、LAContext. Apple のドキュメントからの詳細:

/// 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
}
于 2018-09-12T10:17:46.257 に答える