Xamarin 指紋辨識iOS(Touch ID)
主題: |
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/