2013년 4월 16일 화요일

iOS 프로그래밍 팁, jSON 객체를 주고 받는 클라이언트 개발

서버 <-----> iOS 클라이언트 관에 데이터 통신을 하는 앱 개발에 필요한 방법을 정리한다.



1. jSON 객체를 주고 받는다.
2. HTTP 프로토콜을 이용한다.
3. jSON 객체 string은 다음에 과정을 거친다.
jSON string --> base64Enc --> AES256Enc --> byte2Hex String --> HTTP 통신 --> 서버
서버 --> HTTP 통신 ---> hex2byte --> AES256Dec --> base64Dec --> JSON string


4. 필요한 모듈
이를 위해 필요한 것은 아래의 NSString 및 NSData 카테고리 클래스를 구해야 한다.



NSString+Base64.m / h

https://github.com/kyoshikawa/ZUtilities/blob/master/NSData%2BAES256.m

NSData+AES25.m / h

https://github.com/nicklockwood/Base64

NSData+Base64.m / h


5. 인크립트 디크립트 함수를 구현 하는 crypto클래스를 작성한다.
... 생략 ....



//string -> base64Enc -> aes256Enc -> byte2hex
- (NSString *) encryptString:(NSString *)textString {
    NSString * base64Enc = [self base64Encode:textString];
    NSData * aes256enc = [self encryptString:base64Enc withKey:[self generateKey]];
    return [self byteToHexString:aes256enc];
}

// hex2byte-> aes256Dec --> Base64Dec --> string
- (NSString *) decryptString:(NSString *)textString {
    NSData * data = [self hexToBytes:textString];
    NSString * aes256dec = [self decryptData:data withKey:[self generateKey]];
    return [self base64Decode:aes256dec];
}

... 생략 ...



6. jSON객체를 핸들링 하기 위한 모듈을 준비한다.
json 객체를 이용하기 위해서는 

http://superloopy.io/json-framework/

에서 jSON 모듈이 필요하다.


7. 서버에 요청 하기 위한 jSON객체 생성과 인크립트를 한다.


NSArray *keys = [NSArray arrayWithObjects:@"graduateNo", @"name", @"alumniName", nil];
    NSArray *objects = [NSArray arrayWithObjects:txtFieldNumber.text, txtFieldName.text, txtFiledAlumiName.text, nil];
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    
    NSString *jsonString =[jsonDictionary JSONRepresentation];



위와 같이 key와 key값을 NSArray와 NSDictionary 를 이용하여 jsonString을 얻어 낼수 있다.

인크립트 메서드를 가지고 있는 crypto클래스를 이용해서 전송에 필요한 데이터를 구성한다.


8. 서버에 전송
NSMutableURLRequest,  NSURLConnection 을 이용해서 서버에 전송한다.

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:
                                    [NSURL URLWithString:[NSString stringWithFormat: @"%@/api/xxxx.api",
                                                          SERVER_URL]]
                                                                cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    
    [request addValue:@"application/x-www-from-urlencoded" forHTTPHeaderField:@"content-type"];
    [request setHTTPBody:jsonData];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d",[jsonData length]] forHTTPHeaderField:@"Content-Length"];
    
    NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
        
    if(connection) {
receiveData = [[NSMutableData alloc] init];
}

9. 서버로 부터 응답 처리


- (void)connection:(NSURLConnection *)connection didReceiveResponse:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

응답에 관련된 메서드를 각각 구현한다.

서버에 응답 데이터에 대해서는
didReceiveResponse 에서 NSData 를 append 하고

connectionDidFinishLoading
에서 완성된 데이터를 crypto 클래스의 decryp 메서드를 이용해서 json 스트링으로 변환 한다.

마지막으로 JSONValue 를 통해서 NSDictionary로 변환 하여 
필요한 값을 valeuForKey로 얻어 낸다.











댓글 없음: