iOS 8 SDK向開(kāi)發(fā)者公開(kāi)了Touch ID指紋識(shí)別功能,允許App對(duì)用戶身份進(jìn)行本地驗(yàn)證。使用TouchID非常簡(jiǎn)單,只需要2步即可:
1. 檢查T(mén)ouch ID是否可用。
2. 獲得指紋驗(yàn)證結(jié)果。
下面以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明如何使用Touch ID。
創(chuàng)建一個(gè)新的項(xiàng)目,向界面設(shè)計(jì)器中添加一個(gè)按鈕。使用Touch ID需要引入LocalAuthentication框架:
[plain]view plaincopy
importLocalAuthentication
在按鈕的Touch Up Inside事件中我們首先檢查T(mén)ouch ID功能是否可用:
[plain]view plaincopy
@IBActionfuncuseTouchIonClicked(sender:AnyObject)
{
//步驟1:檢查T(mén)ouchID是否可用
let authenticationContext=LAContext()
var ?error:NSError?
?let ?isTouchIdAvailable = authenticationContext.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics,error:&error)
if isTouchIdAvailable {
NSLog("恭喜,TouchID可以使用!")
//步驟2:獲取指紋驗(yàn)證結(jié)果
authenticationContext.evaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics,localizedReason:"需要驗(yàn)證您的指紋來(lái)確認(rèn)您的身份信息",reply:{ (success,error)->Void in
if success
{
NSLog("恭喜,您通過(guò)了TouchID指紋驗(yàn)證!")
}
else
{
NSLog("抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!\n\(error)")
}})} else {
NSLog("抱歉,TouchID不可以使用!\n\(error)")
}}
上面的代碼首先創(chuàng)建了一個(gè)LAContext實(shí)例,用于執(zhí)行認(rèn)證策略(Authentication
Policies)。然后在該對(duì)象上調(diào)用canEvaluatePolicy方法執(zhí)行某個(gè)指定的認(rèn)證策略,其方法簽名為:
[plain]view plaincopy
funccanEvaluatePolicy(policy:LAPolicy,error:NSErrorPointer)->Bool
LAPolicy枚舉目前只有一個(gè)枚舉值.DeviceOwnerAuthenticationWithBiometrics,即使用指紋生物識(shí)別方式來(lái)認(rèn)證設(shè)備機(jī)主。
[plain]view plaincopy
enumLAPolicy:Int {
caseDeviceOwnerAuthenticationWithBiometrics
}
注意到canEvaluatePolicy方法返回的是Bool值,表示指定的認(rèn)證策略是否允許執(zhí)行。當(dāng)方法返回false時(shí),可以通過(guò)error對(duì)象來(lái)獲取詳細(xì)的失敗原因。失敗的情況可能是設(shè)備本身不支持,例如舊版本的iPhone與iPad;運(yùn)行在模擬器上;或者用戶未開(kāi)啟TouchID功能等。
例如,在iPhone 5上運(yùn)行結(jié)果為:
[plain]view plaincopy
抱歉,TouchID不可以使用!
Optional(ErrorDomain=com.apple.LocalAuthenticationCode=-6"Biometryisnotavailableonthisdevice."UserInfo=0x15ec5a00{NSLocalizedDescription=Biometryisnotavailableonthisdevice.})
在模擬器上的運(yùn)行結(jié)果為:
[plain]view plaincopy
抱歉,TouchID不可以使用!
Optional(ErrorDomain=com.apple.LocalAuthenticationCode=-1000"Simulatorisnotsupported."UserInfo=0x7ffe604b0790{NSLocalizedDescription=Simulatorisnotsupported.})
當(dāng)允許使用Touch ID后,可以接著調(diào)用evaluatePolicy方法執(zhí)行指定的認(rèn)證策略,方法簽名為:
[plain]view plaincopy
funcevaluatePolicy(policy:LAPolicy,localizedReason:String!,reply:((Bool,NSError!)->Void)!)
調(diào)用該方法將彈出系統(tǒng)調(diào)用TouchID的對(duì)話框,其中的localizedReason參數(shù)用于在對(duì)話框中提示用戶詳細(xì)的理由和原因(應(yīng)言簡(jiǎn)意賅,但不可為空或者空串)。
reply參數(shù)是一個(gè)Block,其中的Bool類(lèi)型參數(shù)success表示指紋驗(yàn)證是否通過(guò),當(dāng)失敗時(shí)error參數(shù)包含了具體的失敗信息。這里有很多種失敗的情況(我自己只測(cè)試出了以下5種情況,如有遺漏還請(qǐng)告知):
1. 連續(xù)三次指紋識(shí)別錯(cuò)誤的運(yùn)行結(jié)果:
[plain]view plaincopy
抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!
ErrorDomain=com.apple.LocalAuthenticationCode=-1"Aplicationretrylimitexceeded."UserInfo=0x1740797c0{NSLocalizedDescription=Aplicationretrylimitexceeded.}
2. Touch ID功能被鎖定,下一次需要輸入系統(tǒng)密碼時(shí)的運(yùn)行結(jié)果:
[plain]view plaincopy
抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!
ErrorDomain=com.apple.LocalAuthenticationCode=-1"Biometryislockedout."UserInfo=0x17407dc00{NSLocalizedDescription=Biometryislockedout.}
3. 用戶在Touch ID對(duì)話框中點(diǎn)擊了取消按鈕:
[plain]view plaincopy
抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!
ErrorDomain=com.apple.LocalAuthenticationCode=-2"Canceledbyuser."UserInfo=0x17006c780{NSLocalizedDescription=Canceledbyuser.}
4.在Touch ID對(duì)話框顯示過(guò)程中,背系統(tǒng)取消,例如按下電源鍵:
[plain]view plaincopy
抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!
ErrorDomain=com.apple.LocalAuthenticationCode=-4"UIcanceledbysystem."UserInfo=0x170065900{NSLocalizedDescription=UIcanceledbysystem.}
5. 用戶在Touch ID對(duì)話框中點(diǎn)擊輸入密碼按鈕:
[plain]view plaincopy
抱歉,您未能通過(guò)TouchID指紋驗(yàn)證!
ErrorDomain=com.apple.LocalAuthenticationCode=-3"Fallbackauthenticationmechanismselected."UserInfo=0x17407e040{NSLocalizedDescription=Fallbackauthenticationmechanismselected.}
通過(guò)這個(gè)簡(jiǎn)單的例子,相信您已經(jīng)了解如何在您的App中添加指紋識(shí)別功能了。