오래전 회사 형님이 윈도우용으로 보안카드 프로그램을 자작해서 사용하는 것을 보고 그 아이디어를 채용해서 윈도우용 프로그램을 만들어 사용했다.
그러다가 PDA폰 시절에는 PDA용을 만들어서 사용했다.
스마트 폰이 대중화 되면서 그런 기능을 하는 앱도 많고 나도 그중 하나를 잘 써왔다.
그러던중 iOS를 업그레이드 하고 나니 앱이 튕김 현상이 생기면서 더 이상 사용 하지 못하게 되었다.
OTP는 5000원을 지불해야 하고 유효 기간도 있고 해서 그냥 다시 보안카드로 재발급 받고 직접 초 간단 앱을 개발 했다.
간만에 앱을 개발하려니 xcode도 6.1로 업그레이드가 되고 해서 어리 버리 했다. 살짝 당황했지만 대충 후다닥 만들었다.
UI설계랄 것도 없는 간단한 UI는
하나의 화면만 존재 하며
피커뷰가 3개의 열을 가지고 있다.
첫번째 은행 선택
두번째는 첫번째 번호
세번째는 두번째 번호
세가지 조합으로 두개의 레이블에 코드를 보여 준다.
대충 single view application으로 작성한다.
대충 스토리보드에 디자인을 한다.
pickerview 컨트롤을 ctrl키를 누른 상태에서 viewcontroller.h 파일로 끌어 프로퍼티 코드가
생성 되며 연결 시킨다.
이런 작업은 직접 코딩으로 개발 할 때는 필요 없지만 후다닥 빨리 개발 하기 위해 인터페이스 빌더 방법을 이용했다.
같은 방법으로 label 컨트롤 두 개 도 연결 한다.
이제 코딩
@interface ViewController ()
{
NSArray *_picker1Data;
NSArray *_picker2Data;
NSArray *_picker3Data;
NSArray *code1;
NSArray *code2;
NSArray *code3;
}
@end
picker1Data 는 은행이름으로 초기화
picker2Data 는 첫번째 index
picker3Data 는 두번째 index
물론 index 숫자는 NSString을 포켓 문자로 생성해도 된다. 하지만 난 SN을 넣어 주고 싶어서...
초기화는 viewDidLoad 메서드에 다음과 같이 코딩 한다.
_picker1Data = @[@"기업", @"미래", @"ING"];
_picker2Data = @[@"1", @"2", @"3", @"4", @"5", @"6",
@"7", @"8", @"9", @"10", @"11", @"12",
@"13", @"14", @"15", @"16", @"17", @"18",
@"19", @"20", @"21", @"22", @"23", @"24",
@"25", @"26", @"27", @"28", @"29", @"30",
@"31", @"32", @"33", @"34", @"35", @"SN"];
_picker3Data = @[@"1", @"2", @"3", @"4", @"5", @"6",
@"7", @"8", @"9", @"10", @"11", @"12",
@"13", @"14", @"15", @"16", @"17", @"18",
@"19", @"20", @"21", @"22", @"23", @"24",
@"25", @"26", @"27", @"28", @"29", @"30",
code2
code3
은 각각 은행의 보안카드를 보고 위와 비슷한 방법으로 각자 알아서 코드 값을 초기화 한다.
내 코드니까 공개 하지 않는다.
마지막 값은 카드 SN 번호를 넣는다.
viewDidLoad의 마지막에 다음과 같이 코딩 한다.
self.picker1.dataSource =self;
self.picker1.delegate = self;
self.picker1.showsSelectionIndicator = YES;
3개의 component이고
각각 component가 0일때 은행 선택
1일때 첫번째 인덱스
2일때 두번째 인덱스
로 처리 한다.
- (NSUInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;
}
- (NSUInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0)
{
return _picker1Data.count;
}
if (component == 1)
{
return _picker2Data.count;
}
return _picker3Data.count;
}
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0)
{return _picker1Data[row];}
if (component == 1)
{
return _picker2Data[row];
}
return _picker3Data[row];
}
- (void) pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
static NSInteger code = 0;
static NSInteger idx1 = 0;
static NSInteger idx2 = 0;
if (component == 0)
{
code = row;
}
if (component == 1)
{
idx1 = row;
}
if (component ==2 )
{
idx2 = row;
}
if (code == 0)
{
self.label1.text = code1[idx1];
self.label2.text = code1[idx2];
}
if (code == 1)
{
self.label1.text = code2[idx1];
self.label2.text = code2[idx2];
}
if (code == 2)
{
self.label1.text = code3[idx1];
self.label2.text = code3[idx2];
}
}
피커뷰에 첫번째 것을 변경 하든 두번째 것을 변경 하든 세번째 것을 변경하든 매번 호출 되기 때문에 좀 무식하지만 이렇게 작성 했다.
머 자료구조나 보안 코드 값을 하나에 array에 넣는방법이나 index는 그냥 row값을 문자열로 변환 한다든지 머리 써서 잘 만들어도 되지만 난 후다닥이 중요 했다.
이제 구글링으로 찾은 아이뻐 5s에 finger print 인증 코드를 추가하고 앱이 background에서 forground로 올라와도 매번 재 인증을 하기 위한 코드를 삽입 하면 된다.
그리고 비번으로 하겠다를 선택 했을때 가감하게 귀차니즘으로 exit(0) 해버렸다.
AppDelegate.m에서
@import LocalAuthentication;
를 추가 하고
didFinishLaunchingWithOption 메서드와
applicationWillEnterForeground 메서드에 다음과 같은 코드를 삽입 하면
매번 지문 인증을 시도 한다.
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
//핑거 프린트 사용가능 여부
LAContext *context = [[LAContext alloc] init];
if ([context canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil])
{
NSLog(@"Fingerprint authentication available.");
}
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Authenticate for server login" reply:^(BOOL success, NSError *authenticationError){
if (success) {
NSLog(@"Fingerprint validated.");
}
else {
NSLog(@"Fingerprint validation failed: %@.", authenticationError.localizedDescription);
exit(0);
}
}];
}
이상 허접하게 만든 보안카드 앱이다. 나혼자 쓸거니. 이코드를 보고 머라하지 않았으면 좋겠다.
그냥 이렇게도 앱을 만드는 구나 pickerview 컨트롤 메서드를 이렇게 대충 만들면 되는 구나로 알았으면 좋겠다.