[iOS Study] 웹 서비스와 UIWebView |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
NSURL
URL 포맷에 웹 프로그램의 위치를 담고 있다.
URL 은 여러 웹 서비스를 위해 기본 주소, 통신하고 있는 웹 프로그램, 전달 인자로 구성된다.
-
NSURLRequest
웹 서버와 통신할 때 필요한 모든 데이터를 가진다.
NSURL 객체와 캐시 정책, 웹 서버의 응답 제한 시간, HTTP 프로토콜을 통해 전달되는 추가 데이터 등을 가진다.
NSMutableURLRequest 는 NSURLRequest 의 변경 가능한 하위 클래스.
-
NSURLSessionTask
단일 요청의 일생을 캡슐화한다.
요청의 상태를 추적하고 요청을 취소, 중단, 재시작하는 메소드를 가진다.
테스크는 항상 NSURLSessionTask 의 하위 클래스로, NSURLSessionDataTask, NSURLSessionUploadTask, NSURLSessionDownloadTask 중 하나이다.
-
NSURLSession
데이터 전송 테스크의 제작소 역할을 한다.
생성한 테스크에 공통 속성을 지정할 수 있는 설정 가능한 컨테이너이다.
일부는 셀룰러 연결에서 작동하는 요청이든 아니든 모든 요청이 가지는 헤더 필드를 포함한다.
또한 NSURLSession 은 주어진 테스크의 상태 정보를 제공할 수 있는 리치 델리게이트 모델을 가지고 인증 문제 등을 처리한다.
-
URL 에 쓰이는 string 을 escape char 로 변환하기 위해서는
[NSStringObj stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
반대로 escape char 를 다시 원래 string 으로 돌리기 위해서는..
[NSStringObj stringByRemovingPercentEncoding];
-
NSURLSession 은 다음과 같이 생성한다.
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
-
실제 request 는 다음과 같이 한다.
NSString *requestString = @“http://test.com”;
NSURL *url = [NSURL URLWithString:requestString];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
-
NSURLSession 의 역할은 유사한 성격의 테스크를 만드는 것이다.
예를 들어 앱이 모두 동일한 헤더 필드가 필요한 요청 집합을 가졌다면 이 추가 헤더 필드를 가지고 NSURLSession 을 구성할 수 있다.
이와 유사하게 요청 집합이 셀룰러 네트워크에 연결할 수 없다면 NSURLSession 을 셀룰러 접근을 허용하지 않도록 구성할 수 있다.
이러한 공유 행동 및 속성은 세션을 만드는 테스크에 구성된다.
태스크는 항상 중단된 상태로 만들어진다.
그래서 태스크가 웹 서비스 요청을 시작하려면 resume 을 호출한다.
-
애플은 JSON 데이터를 분석하는 내장 클래스 NSJSONSerialization 을 가지고 있다.
JSON 데이터에 이 클래스를 사용하여 모든 JSON 객체의 NSDictionary, 모든 JSON 배열의 NSArray, 모든 JSON 문자열의 NSString, 모든 JSON 숫자의 NSNumber 인스턴스를 만들 수 있다.
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
-
메인 스레드에서 강제로 코드를 실행할 방법이 필요할 때에는..
dispatch_async 함수를 사용하면 된다.
dispatch_async(dispatch_get_main_queue(). ^{ … } );
-
UIWebView 인스턴스는 웹 콘텐츠를 표시한다.
실제로 장치의 사파리 앱은 UIWebView 를 사용해 웹 콘텐츠를 표시한다.
UIWebView *webView = [[UIWebView alloc] init];
webView.scalesPageToFit = YES;
if ( _URL ){
NSURLRequest *req = [NSURLRequest requestWithURL:_URL];
[webView loadRequest:req];
}
-
웹 서비스에 접근할 때 종종 인증 요청(authentication challenge)을 하는 응답을 받게 된다.
이것은 “도대체 넌 누구냐?” 를 의미한다.
서버가 진짜로 응답을 보내기 전에 사용자명과 비밀번호(자격 증명)을 보내야 한다.
NSURLSession 델리게이트는 인증 요청을 받으면 사용자명과 비밀번호를 전달하여 이에 응답한다.
이를 위해서는 NSURLSessionDataDelegate 메소드를 구현한다.
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
NSURLCredential *cred = [NSURLCredential credentialWithUser:@"BigNerdRanch" password:@"AchieveNerdvana" persistence:NSURLCredentialPersistenceForSession];
completionHandler(NSURLSessionAuthChallengeUseCredential, cred);
}
완료 핸들러는 두 인자를 받는다.
첫 인자는 전달한 자격 증명 타입이다. name & password pair 를 제공하므로 NSURLSessionAuthChallengeUseCredential 을 보내야 맞다.
두번째 인자는 NSURLCredential 인스턴스 자격 증명 자체이다.
이것은 사용자명, 비밀번호, 자격 증명이 얼마동안 유효한지를 나타내는 값으로 구성된다.
-
UIWebView 는 히스토리를 유지한다.
goBack 과 goForward 메시지를 웹 뷰에 보내 그 히스토리를 돌아다닐 수 있다.
-
NSURLSessionTask 는 웹 서버와 통신할 때 HTTP 프로토콜을 사용한다.
이 프로토콜은 주고 받는 모든 데이터가 반드시 HTTP 명세를 따르도록 한다.
-
NSURLRequest 는 요청을 명시할 수 있는 많은 메소드를 가지고 있어 적절하게 포매팅을 해준다.
서비스 요청은 요청 행, HTTP 헤더, HTTP 보디의 세 부분으로 나뉜다.
여기서 HTTP 보디는 선택적이다.
요청 행(애플은 상태 행이라 부른다.)은 HTTP 요청의 첫 번째 행이다.
NSURLRequest 의 기본값은 GET 이다.
요청문의 보디는 요청과 함께 포함할 수 있는 데이터이다.
보통 XML, JSON, Base-64 인코딩 데이터 등이다.
-
요청이 바디를 가지면 반드시 헤더에 Content-Length 를 가져야 한다.
편리하게도 NSURLRequest 는 바디의 크기를 계산하여 헤더에 추가해준다.
NSURL *someURL = [NSURL URLWithString:@“http://www.photos.com/upload”];
UIImage *image = [self profilePicture];
NSData *data = UIImagePNGRepresentation(image);
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:someURL
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:90];
req.HTTPBody = data;
req.HTTPMethod = @“POST”;
// Content-Length 를 프로그래밍으로 설정하고자 한다면..
// [req setValue:[NSString stringWithFormat:@“%d”, data.length] forHTTPHeaderField:@“Content-Length”];
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] 지역화 (0) | 2016.03.17 |
---|---|
[iOS Study] UISplitViewController (0) | 2016.03.16 |
[iOS Study] 유동글자 (0) | 2016.03.09 |
[iOS Study] UITableViewCell 하위 클래스 만들기 (0) | 2016.03.08 |
[iOS Study] 저장, 읽기, 앱 상태 (0) | 2016.03.07 |
댓글