2014년 11월 5일 수요일

iOS초간단 보안카드앱 만들기


오래전 회사 형님이 윈도우용으로 보안카드 프로그램을 자작해서 사용하는 것을 보고 그 아이디어를 채용해서 윈도우용 프로그램을 만들어 사용했다.
그러다가 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",

code1
code2
code3
은 각각 은행의 보안카드를 보고 위와 비슷한 방법으로 각자 알아서 코드 값을 초기화 한다.
내 코드니까 공개 하지 않는다.
마지막 값은 카드 SN 번호를 넣는다.

viewDidLoad의 마지막에 다음과 같이 코딩 한다.
    self.picker1.dataSource =self;
    self.picker1.delegate = self;
    

    self.picker1.showsSelectionIndicator = YES;

데이터는 모두 준비가 끝났고 이제 pickerViewControl에 대한 메서드를 작성 하면 된다.
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];
    }


}

마지막 메서드는 선택 되었을 때 마다 호출이 되며 여기 서는 가운데에 있는 label 컨트롤에 text를 세팅 하는 것으로 기능이 끝이다.

피커뷰에 첫번째 것을 변경 하든 두번째 것을 변경 하든 세번째 것을 변경하든 매번 호출 되기 때문에 좀 무식하지만 이렇게 작성 했다.

머 자료구조나 보안 코드 값을 하나에 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 컨트롤 메서드를 이렇게 대충 만들면 되는 구나로 알았으면 좋겠다.




2014년 11월 1일 토요일

SyncMaster TA531 hdmi케이블 연결시 사운드 설정

지금껏 집에 mac mini 2012 late 의 모니터로 SyncMaster TA531을 사용했다.
모니터를 두개 사용하는데 이것을 주 모니터로 사용한다.

miniDP2hdmi로 SyncMaster를
모니터 설정은 HDMI/DVI PC 아래 내용 참고
http://mtsparrow.blogspot.kr/2011/08/syncmaster-ta531-review.html

로 설정하고 다른 HP모니터를 HDMI2 DVI 케이블로 DVI로 연결 하여 사용하였다.

별다른 의미는 없었고 왠지 miniDP좀더 좋은 것으로 생각 했다.

그런데 문제는 이 모니터가 27인치 Full HD이고 물론 TN 모니터지만
작은 크기의 글자를 보는 경우 폰트 가독성이 떨어졌다.

이건 상대적인 것으로 회사에서 사용하는 24인치 imac과 비교 할 때 매우 불편했다.

혹시나 하는 마음에 hdmi케이블로 hdmi에서 바로 SyncMaster TA531로 연결 했더니 가독성이 좋아 졌다. 왜 지금껏 시도 하지 않았을까? ㅠ.ㅠ

사운드는 이미 기존 부터 라인 연결로 하고 있었다.
그런데 사운드 설정에 모니터가 잡히고 왠지 모니터로 사운드가 HDMI케이블을 이용해서 나오게 하는게 도리 일거 같다.

그러나 소리가 나지 않는다.

이것 저것 아무리 시도해 보아도 소리가 나지 않는다.
그대로 라인잭을 연결하는건 뭔가 바보 같은 것 같고

다시 모니터 설정으로 외부 입력 수정을 이용해서 DVIPC를 그냥 PC로 조정하니 소리가 모니터로 HDMI케이블을 타고 바로 나온다.

이 모니터를 구매한지는 3년이고 이 맥미니를 구매한지는 2년이 되었는데
이제야 제대로 쓰는 느낌이다.