1. 程式人生 > >iOS 8使用Touch ID進行身份認證

iOS 8使用Touch ID進行身份認證

   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.

  如果canEvaluatePolicy返回YES,表示裝置支援指紋識別,那麼便可以呼叫evaluatePolicy:函式進行指紋識別了.呼叫evaluatePolicy函式後會彈出一個alert,如下圖:


  該alert可定製的只有兩處:   1.”To access your photos”提示文字是由localizedReason引數指定的,用來向用戶說明使用Touch ID的目的.   2.”Enter Password”可由LAContext的localizedFallbackTitle屬性設定(LAContext目前只有這一個屬性)
,如果不設定的話,預設是”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. 詳情參見