Xamarin iOSのFaceID(TouchID)での認証を実装する方法

今回はアプリ内でFaceID(TouchID)での認証を実装する方法についてです。

Xamarin.Formsでの実装方法を例に紹介していきます。

1.info.plistに

<key>NSFaceIDUsageDescription</key>
<string>Authenticate with FaceID</string>

を追加

2.Xamarin.Formsの場合、ネイティブの処理を呼び出すための共通プロジェクト内にインターフェースを定義

using System;
using System.Threading.Tasks;

namespace TestPrj {
    public interface IAuth {
        Task<bool> BioAuth();
    }
}

3.iOSプロジェクト内にに認証処理を書く

using System;
using System.Threading.Tasks;
using Foundation;
using LocalAuthentication;
using TestPrj.iOS;
using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(Auth))]
namespace TestPrj.iOS {
    public class Auth : IAuth {
        public Auth(){}

        public Task<bool> BioAuth() {
            var cmp = new TaskCompletionSource<bool>();
            var context = new LAContext();
            NSError AuthError;
            var localizedReason = new NSString("Auth");

            // 生体認証可能かチェック
            if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError)) {
                var replyHandler = new LAContextReplyHandler((success, error) => {
                    Device.BeginInvokeOnMainThread(() => {
                        cmp.SetResult(success);
                    });

                });
                context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason, replyHandler);
            } else if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, out AuthError)) {
                // PIN認証
                var replyHandler = new LAContextReplyHandler((success, error) => {
                    Device.BeginInvokeOnMainThread(() => {
                        cmp.SetResult(success);
                    });

                });
                context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, localizedReason, replyHandler);
            } else {
                //認証機能なし
                var title = "認証不可";
                var msg = "認証できません。";
                Xamarin.Forms.Device.BeginInvokeOnMainThread(async () => {
                    await App.Current.MainPage.DisplayAlert(title, msg, "OK");
                    cmp.SetResult(false);
                });
            }
            return cmp.Task;
        }
    }
}

4.共通プロジェクトで処理を呼び出す

var result = await DependencyService.Get<IAuth>().BioAuth();

以上です。

タイトルとURLをコピーしました