Xamarin에서 PCL 만 사용하여 지문 인증하고 싶습니다.

소개



안녕하세요. ㅎㅎ 입니다.
연구에서 Xamarin (Xamarin.Forms)을 이용한 앱을 개발하게 되어, 별로 경험이 없는 C#과 격투의 매일을 보내고 있습니다.

그 앱에 지문 인증을 이용한 로그인 기능을 구현하고 싶어졌습니다만, 「Xamarin Forms 지문」으로 Google 검색해도 이러한 일본어의 기사가 일절 히트하지 않고, 맨 위에 나온다 Stack Overflow 기사 에는 「Dependency Service 를 사용해」라고 있는 것만으로, 어떻게든 PCL 로 완결하도록(듯이) 쓸 수 있을까……라고 생각하고 있었습니다.
그렇다고 해도 지문 인증 기능은 OS의 기능에 강하게 의존하는 곳이므로, 중반 포기 기분으로 찾고 있다고, 있었습니다.

Fingerprint plugin for Xamarin

이것을 사용했는데, 조금 PCL 에 기술하는 것만으로 실장할 수 있었으므로 감동의 너무, 그리고 일본어 기사가 없기 때문에 참고가 되면(자) 생각해, 이 기사를 쓰기로 했습니다.

주) 다만 지문 인증 기능이 있는 Android 단말이 손에 들지 않고, 동작 확인할 수 없기 때문에, 「적어도 iOS 단말은 커버할 수 있다」정도로 읽어 주실 수 있으면 기쁩니다. 미안해…

샘플



거의 본가의 사경이 되어 버리고 있습니다만, 일부 수정하고 싶은 곳이 있었으므로 샘플을 썼습니다.

albno273/XamarinFormsFingerprintSample - Xamarin.Forms에서 PCL만으로 지문 인증하는 샘플

사용하는 방법



이 부근에서 30줄 미만 이 전부입니다.

FingerprintSamplePage.xaml.cs (발췌)
private CancellationTokenSource _cancel;

private async void OnAuthenticate(object sender, EventArgs e)
{
    _cancel = swAutoCancel.IsToggled ? new CancellationTokenSource(TimeSpan.FromSeconds(10)) : new CancellationTokenSource();
    lblStatus.Text = "";

    if (await Plugin.Fingerprint.CrossFingerprint.Current.IsAvailableAsync())
    {
        var result = await Plugin.Fingerprint.CrossFingerprint.Current.AuthenticateAsync("指を置いてね!", _cancel.Token);
        await SetResultAsync(result);
    }
    else
    {
        await DisplayAlert("注意", "指紋認証機能は使用できません!", "OK");
    }
}

private async Task SetResultAsync(FingerprintAuthenticationResult result)
{
    if (result.Authenticated)
    {
        await Navigation.PushAsync(new FingerprintAuthenticatedPage());
    }
    else
    {
        lblStatus.Text = $"{result.Status}: {result.ErrorMessage}";
    }
}

지문 인증을 하려면


AuthenticateAsync("指を置いてね!", _cancel.Token) 부분.
첫 번째 인수에 지정된 문자열이 대화 상자에 표시됩니다.
대화 상자를 자동으로 닫으려면 두 번째 인수에 Token을 지정합니다.
두 번째 인수를 지정하지 않으면 취소 버튼을 누르지 않으면 대화 상자가 닫히지 않습니다.
샘플에서는 CancellationTokenSource(TimeSpan.FromSeconds(10)) 로서, 10초 반응이 없으면 다이얼로그가 자동으로 닫게 되어 있습니다.

인증이 성공했는지 실패했는지 알고 싶습니다.


FingerprintAuthenticationResult.Authenticated 의 true/false 로 판별.
인증이 성공했을 때 true 가,
취소 버튼을 눌렀을 때, 인증에 실패한 후에 「패스워드 입력」버튼을 눌렀을 때, 규정 횟수 인증에 실패했을 때에 false 가 돌아옵니다.

원래이 단말기에서 지문 인증 기능을 사용할 수 있는지 알고 싶습니다.


IsAvailableAsync() 의 true/false 로 판별.
이 체크가 본가의 샘플에 없었던 것이 스스로 사경한 이유입니다.
아마 지문 인증 기능이 없는 단말에서 AuthenticateAsync() 를 부르면 예외를 토해지므로, 이것의 결과로 처리를 나누는 편이 정중한 것이 아닐까 생각했습니다.

실제 화면



버튼을 누르면.
인증에 성공하면 다음 화면으로 천이합니다 (아무것도 없기 때문에 할애).


인증 실패 시.


취소 버튼을 누르면.FingerprintAuthenticationResult.StatusCanceled 입니다.


"비밀번호 입력"버튼을 누르면.FingerprintAuthenticationResult.StatusFallbackRequested 입니다.
이 값을 받았을 때에 패스워드 입력 다이얼로그를 내면 완벽하네요.


Token에 의해 취소된 곳.FingerprintAuthenticationResult.StatusCanceled 하지만 ErrorMessage 가 바뀌므로 수동 취소의 경우와 거동을 바꿀 수 있습니다.


지문 인증 기능을 사용할 수 없는 경우.


Android에서도 같은 방식으로 움직입니다.


요약


  • TouchID는이 플러그인을 사용하면 PCL에 대한 설명에서만 사용할 수 있습니다.
  • Nexus Imprint 또는 SAMSUNG Galaxy에서도 작동해야합니다.

    결론



    스스로 만든 플러그인도 아닌데 오랫동안 설명해 버릴 수 있을까 하는 생각도 합니다만, 누군가의 참고가 되면 다행입니다.
    Xamarin (라고 할까.
  • 좋은 웹페이지 즐겨찾기