iOS 8使用Touch ID進行身份認證
阿新 • • 發佈:2019-01-26
iOS 8的SDK開放了Touch ID的介面.從WWDC的視訊中可以看到Touch ID應用在兩個方面:用於Key Chain加密和用於授權.iOS 8正式版釋出以後我們可以看到Evernote的iOS app已經集成了該功能.下面來看看如何實現使用Touch ID進行身份認證.
其實很簡單,用於身份認證的所有的介面都在LocalAuthentication framework中, 該framework實際上只有三個標頭檔案:
LAContext.h
LAError.h
LAPublicDefines.h
而實際用到的函式也只有兩個:
// 用來判斷裝置是否支援Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy
error:(NSError * __autoreleasing *)error;
// 真正驗證身份的函式
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString*)localizedReason
reply:(void(^)(BOOLsuccess,NSError*error))reply; 上述兩個函式都是LAContext的member function.目前LAPolicy只有一個值: LAPolicyDeviceOwnerAuthenticationWithBiometrics.
,如果不設定的話,預設是”Enter Password”.值得注意的是,如果該屬性設定為@“”(空字串),該按鈕會被隱藏,Evernote應該就是這麼做的.
其他的免談,當然更別提獲取使用者的指紋資料了.
理論上三種情況下會退出驗證(alert會被dismiss,reply回撥會被呼叫):
1.使用者指紋通過驗證
2.使用者點選”Enter Password”按鈕
3.使用者點選”Cancel”按鈕
還有一種情況:使用者輸入了錯誤的指紋.這種情況下,該alert不會被dismiss,其標題會由”Touch ID”改為”Try Again”,有彈簧狀的動畫效果過渡.好了,程式碼如下(不要忘了引入標頭檔案<LocalAuthentication/LocalAuthentication.h>):
LAContext *context = [LAContext new];
NSError *error;
context.localizedFallbackTitle = @""; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
NSLog(@"Touch ID is available.");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"Use Touch ID to log in.", nil) reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Authenticated using Touch ID.");
} else { if (error.code == kLAErrorUserFallback) { NSLog(@"User tapped Enter Password");
}elseif(error.code==kLAErrorUserCancel) {
NSLog(@"User tapped Cancel");
}else{
NSLog(@"Authenticated failed."); }
}];
} else {
NSLog(@"Touch ID is not available: %@", error);
} 在開發中遇到過一個問題, 不知道是不是bug, 就是啟動程式後立即使用Touch ID, 這樣會導致身份驗證通過了, 但是上述的alert並不會被dismiss. 詳情參見
reply:(void(^)(BOOLsuccess,NSError*error))reply; 上述兩個函式都是LAContext的member function.目前LAPolicy只有一個值:
如果canEvaluatePolicy返回YES,表示裝置支援指紋識別,那麼便可以呼叫evaluatePolicy:函式進行指紋識別了.呼叫evaluatePolicy函式後會彈出一個alert,如下圖:
NSError *error;
context.localizedFallbackTitle = @""; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
NSLog(@"Touch ID is available.");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"Use Touch ID to log in.", nil) reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Authenticated using Touch ID.");
} else { if (error.code == kLAErrorUserFallback) { NSLog(@"User tapped Enter Password");
}elseif(error.code==kLAErrorUserCancel) {
NSLog(@"User tapped Cancel");
}else{
NSLog(@"Authenticated failed."); }
}];
} else {
NSLog(@"Touch ID is not available: %@", error);
} 在開發中遇到過一個問題, 不知道是不是bug, 就是啟動程式後立即使用Touch ID, 這樣會導致身份驗證通過了, 但是上述的alert並不會被dismiss. 詳情參見