Xamarin iOS 指紋辨識 Touch ID

Xamarin 指紋辨識iOS(Touch ID)

張阿鬼 2016/10/05 18:28:30
1136







主題

Xamarin 指紋辨識 iOS

文章簡介

介紹Xamarin iOS中如何應用指紋辨識之API

作者

張朝銘

版本/產出日期

V1.0/2016.10.05




1. 前言

本文件用來提供Xamrin iOS開發人員在開發指紋辨識應用時之初步了解

開發工具使用Visual Studio 2013/Xamarin Studio

本文件適用於Xamarin iOS 8.0以上開發





2. 目的

讓iOS行動裝置使用指紋辨識之功能(Touch ID)



3. 本文

Touch ID是蘋果在iOS 8所提供的生物辨識技術,該技術在API中將透過名為Local Authentication之驗證框架進行指紋辨識,本文章將初步探討API之使用。

驗證前檢查

LAContext為該API所提供之主要物件,透過該物件可進行裝置支援之判斷以及開啟指紋辨識之功能。首先我們會使用該物件提供的方法CanEvaluatePolicy()進行以下之判斷:

裝置是否有支援指紋辨識

裝置是否有設定指紋辨識

該方法要求之參數如下程式碼所示:

public virtual bool CanEvaluatePolicy(LAPolicy policy, out NSError error);

policy:為列舉值,表示要用哪種方式驗證,指定使用生物辨識方式

error:若該方法回傳錯誤時,將透過此物件告知錯誤之類型。


因此當該方法回傳為flase時,表示裝置無法使用指紋辨識功能,此時就可透過error所提供之錯誤代碼取得該錯誤類型,如下程式碼片段所示:

var laContext = new LAContext();

NSError error = new NSError();

if (laContext.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error))

{


}

else

{

Console.WriteLine(error.LocalizedDescription);//錯誤訊息

var laError=((LAStatus)(int)error.Code);


switch (laError)

{

case LAStatus.TouchIDNotEnrolled:

lbl.Text = "未設定指紋辨識";

break;

case LAStatus.PasscodeNotSet:

lbl.Text = "未設定密碼";

break;

default://TouchIDNotAvailable

Console.WriteLine("無法使用指紋辨識");

break;

}

}

Error提供的錯誤代碼可轉換成列舉LAStatus來判定錯誤之類型,此處之判斷如下:

TouchIDNotEnrolled:裝置並未設定任何一組指紋可辨識

PasscodeNotSet:裝置未在Settings中設定過密碼

TouchIDNotAvailable(default):裝置不支援Touch ID


進行驗證

若驗證前檢查通過,則可繼續進行驗證之流程,使用LAContext提供之EvaluatePolicy()方法叫用系統提供的驗證畫面,EvaluatePolicy所需之參數如下:

public virtual void EvaluatePolicy(LAPolicy policy, string localizedReason, LAContextReplyHandler reply);

policy:為列舉值,表示要用哪種方式驗證,指定使用生物辨識方式

localizedReason:在要求指紋辨識之視窗所出現的文字說明

reply:驗證結果之委派物件


reply參數中將提供布林告知驗證之結果是否通過,及其他所有錯誤之情形,如下方之程式碼片段所示:

string reason = "請輸入指紋進行驗證";

laContext.EvaluatePolicy(

LAPolicy.DeviceOwnerAuthenticationWithBiometrics,

reason,

new LAContextReplyHandler((isSuccess, err) =>

{

this.InvokeOnMainThread(() =>

{

if (isSuccess)

{

lbl.Text = "指紋辨識通過";

}

else

{

Console.WriteLine(err.LocalizedDescription);

var laError = ((LAStatus)(int)err.Code);

switch (laError)

{

case LAStatus.SystemCancel:

lbl.Text = "系統取消";

break;

case LAStatus.UserCancel:

lbl.Text = "使用者取消";

break;

case LAStatus.UserFallback:

lbl.Text = "使用者要求輸入密碼(自行定義)";

break;

default:

lbl.Text = "指紋辨識失敗";

break;


}

}

});

}));


reply所返回之結果並非在UI執行中,因此需使用InvokeOnMainThread()交由UI執行處理。若驗證通過則isSuccess將為True,此外其他情形皆由ErrorCode判斷如下:

SystemCancel:由系統取消辨識,例如在辨識時按下了Home

UserCancel:使用者按下取消

UserFallback:使用者要求使用自行定義之驗證方式

AuthenticationFailed:指紋驗證不通過


模擬器測試

我們可利用Xcode所提供的模擬器模擬指紋輸入的情形,該模擬器提供未設定指紋、指紋辨識通過以及指紋辨識失敗三種情況。

開啟模擬器後選擇Hardware→Touch ID 即可模擬三種情形。


系統提供之指紋辨識畫面


當模擬輸入不通過後,會持續跳出要求驗證畫面,在此可選擇輸入密碼後引導至自定義之驗證方式


4. 範例連結與參考來源

範例連結

https://github.com/stevenchang0529/XamariniOSTouchIDTest


Xamarin官方網站

https://developer.xamarin.com/guides/ios/platform_features/introduction_to_touchid/



張阿鬼