iOS 8 Touch ID

Local Authentication framework
ရေးသားသူ : saturngod

iOS 8 SDK မှာ touch ID ကို အသုံးပြုပြီးတော့ authorize လုပ်လို့ ရပါပြီ။ အခုနောက်ပိုင်း App တော်တော်များများမှာ login အစား Touch ID ကို အသုံးပြုပြီး login ဝင်ခွင့်ပေးထားပါတယ်။ iOS မှာ Touch ID က အသုံးပြုသူတွေ password ခဏ ခဏ ရိုက်ထည့်ရမယ့် အစား မြန်မြန်ဆန်ဆန် login ဝင်လို့ ရအောင် ဖန်တီးလို့ ရလာပါတယ်။

Touch ID အတွက် ကျွန်တော်တို့တွေ Local Authentication framework ကို အသုံးပြုဖို့ လိုပါတယ်။ Touch ID ကို အသုံးပြုဖို့ အတွက် iPhone 5s နဲ့ အထက် iPhone နဲ့ နောက်ပိုင်း ထွက်တဲ့ iPad mini , iPad Air 2 တို့ကို support လုပ်ပါတယ်။

LAContext

Local Authentication framework ဟာ LAContext class ဖြစ်ပါတယ်။ ကျွန်တာ်တို့တွေ Touch ID ကို ကျွန်တော်တို့ App ထဲမှာ အသုံးပြုမယ်ဆိုရင် LAContext class ကို အသုံးပြုရပါမယ်။

Code

အရင်ဆုံး ကျွန်တော်တို့တွေ LocalAuthentication framework ကို project မှာ ထည့်ဖို့ လိုပါတယ်။ ပြီးရင်တော့ ကျွန်တော်တို့ code မှာ အောက်ကလို ထည့်ပါမယ်။

#import <LocalAuthentication/LocalAuthentication.h>

ပြီးရင်တော့ ကျွန်တော်တို့တွေ LAContext class ကို အသုံးပြုပြီးတော့ TouchID ကို support လုပ်မလုပ် စစ်ပါမယ်။

LAContext *context = [[LAContext alloc] init];

NSError *error = nil;

if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        // Authenticate
} else {     
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Cannot authenticate using TouchID." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
}

TouchID support လုပ်မလုပ် စစ်ပြီးသွားရင် နောက်တဆင့် အနေနဲ့ TouchID ကို အသုံးပြုပြီးတော့ device owner ဟုတ်မဟုတ် စစ်ပါမယ်။

if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
            localizedReason:@"Login with TouchID"
                      reply:^(BOOL success, NSError *error) {

                        if(success) {
                          //success
                          NSLog(@"Authentication Success");
                        }
                        else {
                          NSString *failureReason;
                          //depending on error show what exactly has failed
                          switch (error.code) {
                            case LAErrorAuthenticationFailed:
                              failureReason = @"Touch ID authentication failed";
                              break;

                            case LAErrorUserCancel:
                              failureReason = @"Touch ID authentication cancelled";
                              break;

                            case LAErrorUserFallback:
                              failureReason =  @"UTouch ID authentication choose password selected";
                              break;

                            default:
                              failureReason = @"Touch ID has not been setup or system has cancelled";
                              break;
                          }

                          NSLog(@"Authentication failed: %@", failureReason);
                        }

                      }];

  } else {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"Your device cannot authenticate using TouchID."
                                                   delegate:nil
                                          cancelButtonTitle:@"Ok"
                                          otherButtonTitles:nil];
    [alert show];

  }

Error code တွေကတော့

typedef NS_ENUM(NSInteger, LAError)
{
    /// Authentication was not successful, because user failed to provide valid credentials.
    LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,

    /// Authentication was canceled by user (e.g. tapped Cancel button).
    LAErrorUserCancel           = kLAErrorUserCancel,

    /// Authentication was canceled, because the user tapped the fallback button (Enter Password).
    LAErrorUserFallback         = kLAErrorUserFallback,

    /// Authentication was canceled by system (e.g. another application went to foreground).
    LAErrorSystemCancel         = kLAErrorSystemCancel,

    /// Authentication could not start, because passcode is not set on the device.
    LAErrorPasscodeNotSet       = kLAErrorPasscodeNotSet,

    /// Authentication could not start, because Touch ID is not available on the device.
    LAErrorTouchIDNotAvailable  = kLAErrorTouchIDNotAvailable,

    /// Authentication could not start, because Touch ID has no enrolled fingers.
    LAErrorTouchIDNotEnrolled   = kLAErrorTouchIDNotEnrolled,
} NS_ENUM_AVAILABLE(10_10, 8_0);

အခု TouchID က success ဖြစ်သွားရင် login ဝင်လို့ရပါပြီ။ login ဝင်ဖို့ information တွေကတော့ keychain ထဲမှာ သိမ်းထားဖို့ လိုအပ်ပါတယ်။ တခြားနေရာမှာ login information ကို သိမ်းသည်ထက် keychain မှာ store လုပ်ထားတာ ပိုပြီး save ဖြစ်ပါတယ်။