본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] 웹 서비스와 UIWebView

by 돼지왕 왕돼지 2016. 3. 15.
반응형

 [iOS Study] 웹 서비스와 UIWebView


출처 : 아론 힐리가스의 iOS 프로그래밍


authentication challenge, Base-64 인코딩, body, cachePolicy, completionHandler, content-length, credentialWithUser:password:persistence:, dataTaskWithRequest:completionHandler:, defaultSessionConfiguration, delegate, dispatch_async, dispatch_get_main_queue, escape char, escape-sequence, example code, Factory, Get, goback, goForward, header, host, http protocol, HTTP 프로토콜, HTTPBody, HTTPMethod, ios study, ios tutorial, JSON, json array, json object, json string, json 객체, JSON 배열, JSONObjectWithData:options:error:, loadRequest, main thread, NSArray, NSData, NSDictionary, nserror, NSJSonSerialization, nsmutableurlrequest, nsrequest, NSString, NSURL, nsurlauthenticationchallenge, nsurlcredential, NSURLCredentialPersistenceForSession, NSURLRequest, NSURLRequestReloadIgnoringCacheData, nsurlresponse, nsurlsession, NSURLSessionAuthChallengeDisposition, NSURLSessionAuthChallengeUseCredential, NSURLSessionConfiguration, NSURLSessionDataDelegate, NSURLSessionDataTask, NSURLSessionDownloadTask, NSURLSessionTask, NSURLSessionUploadTask, NSUTF8StringEncoding, password, Path, pathExtension, port, Post, protocol, query, request, requestWithURL, resume, Sample Code, scalesPageToFit, scheme, sessionWithConfiguration:delegate:delegateQueue:, setValue, setValue:forHTTPHeaderField:, stringByAddingPercentEscapesUsingEncoding, stringByRemovingPercentEncoding, timeout, timeoutInterval, UIImagePNGRepresentation, UIWebview, URLSession:task:didReceiveChallenge:completionHandler:, User, Webview, xml, [iOS Study] 웹 서비스와 UIWebView, 공유 속성, 공유 행동, 공통 속성, 기본값, 네트워크, 단일 요청, 데이터, 데이터 전송, 델리게이트, 동일 헤더, 메인 스레드, 명세, 보디, 분석, 비밀번호, 사용자명, 사파리, 상태, 샘플 코드, 셀룰러, 아론 힐리가스, 예제 코드, 요청 행, 웹 서버 응답 제한 시간, 웹 서비스, 웹 컨텐츠, 인증, 인증 요청, 일생, 자격 증명, 자격 증명 타입, 재시작, 중단, 중단 상태, 추가 데이터, 추적, 취소, 캐시 정책, 캡슐화, 컨테이너, 태스크, 태스크 제작소, 하위클래스, 헤더, 헤더 필드, 히스토리

-

NSURL

     URL 포맷에 웹 프로그램의 위치를 담고 있다.

     URL 은 여러 웹 서비스를 위해 기본 주소, 통신하고 있는 웹 프로그램, 전달 인자로 구성된다.


https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/



-

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”];










반응형

댓글