티스토리 뷰

출처

https://developer.apple.com/reference/foundation/nsurlsession?language=objc
https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started


NSURLSession

iOS 7부터 사용가능한 NSURLConnection 을 대체할 Networking API 이다.
이 API 는 authentication 을 지원하는 많은 delegate set 을 가지고 있고
app 이 suspended 되더라도 background 에서 download job 이 계속 실행되도록 할 수도 있다.



개념


NSURLSession 클래스는 데이터, 파일, ftp, http 및 https URL scheme 을 지원하고,
HTTP / 1.1, SPDY 및 HTTP / 2 프로토콜을 지원한다.

HTTP / 2 지원은 (RFC7540 - https://tools.ietf.org/html/rfc7540) 에 설명되어 있으며 
이를 이용하려면 ALPN 또는 NPN을 지원하는 서버가 필요하다.

NSURLProtocol 을 사용하여 나만의 custom 네트워킹 프로토콜과
URL 스키마 (앱의 비공개 용)를 추가할 수 있다.



NSURLSession API를 사용하면 하나 이상의 세션이 만들어지며 
각 세션은 관련 데이터 전송 작업 그룹을 조정한다. 

예를 들어 웹 브라우저를 작성하는 경우 앱은 탭 또는 창 당 하나의 세션을 만들거나 
대화 형으로 사용할 세션을 만들고 백그라운드 다운로드를 위해 다른 세션을 만들 수 있다. 

각 세션 내에서 앱은 일련의 작업을 추가한다. 
각 작업은 필요한 경우 특정 URL에 대한 요청을 나타낸다. 

주어진 URL 세션 내의 작업은 단일 세션 호스트의 최대 동시 연결 수, 
셀룰러 네트워크를 통한 연결 허용 여부 등과 같은 연결 동작을 정의하는 공통 세션 구성 객체를 공유한다. 
세션의 동작은 구성 객체를 만들 때 호출하는 메서드에 의해 부분적으로 결정된다.


Session

NSURLSession 을 만들기 위해서는 sharedSession 이나
NSURLSessionConfiguration 을 이용해 sessionWithConfiguration 을 이용하면 된다.

sharedSession

Session 이 가지고 싶은 특징들을 Custom 하게 설정할 수는 없지만 
기본적인 역할을 수행할 경우 사용하기 좋다.

defaultSessionConfiguration:

추가적으로 property 를 설정하지 않았다면 sharedSession 과 유사하게 동작한다.
disk-persisted global cache, 자격증명 (credential), cookie storage objects 를 사용한다.

ephemeralSessionConfiguration:

defaultSession 과 유사하지만 cache, 자격증명 (credential), cookie 를 디스크에 쓰지 않는다.
즉, 세션관련 데이터가 메모리에 올라가 있다.

backgroundSessionConfiguration:

앱이 suspend, not running 일 때도 background 에서 콘텐츠 업로드 및 다운로드가 가능하다.



NSURLSessionConfiguration 에는  configuration 및 request type 에 따라
요청을 수행하고 응답을 처리할 때 사용하는 URL Cache 및 쿠키 저장 객체에 대한 참조가 포함되어 있다.


Session 의 task 들은 NSURLSessionDelegate 라는 공통된 delegate 를 공유하므로
인증 실패, server 로부터 데이터를 받은 시점, 데이터를 캐시할 준비가 된 시점 등 다양한 이벤트가 발생할 때
정보를 제공하고 얻을 수 있다.

모든 Background download and upload 의 경우 
NSURLSessionDownloadDelegate 를 구현하는 구현체를 제공해야한다.
반면, delegate 가 제공하는 기능들이 필요하지 않은 경우
session 생성 시 delegate 에 nil 을 전달하여 사용하면 된다.



 Session 객체는 app 종료나 명시적인 session invalidates 를 호출하기 전까지

 delegate 에 대한 strong reference 를 가진다.

 session 을 invalidate 를 시키지 않으면 메모리 leak 이 발생할 수 있다.






Tasks

Session 을 이용하면 몇가지 데이터를 서버에 업로드 하거나
서버로부터 파일이나 하나 또는 여러개의 NSData object 를 받을 수 있다.
NSURLSession 은 3가지 타입의 task 를 제공한다.

NSURLDataTask

NSData object 를 이용해 데이터를 주고받는다.
서버에 대한 짧은 요청이나 자주 상호 작용하는 요청을 위한 task 이다.

NSURLUploadTask

DataTask 와 비슷하지만 종종 데이터를 파일 형태로 보내고 
앱이 실행되지 않는 동안 백그라운드 업로드를 지원한다.

NSURLDownloadTask

파일 형태로 데이터를 받고 
앱이 실행되지 않는 동안 백그라운드 다운로드와 업로드를 지원한다.


대부분 Networking API 와 마찬가지로 NSURLSession API 도 비동기식이다.
호출되는 메서드에 따라 completionHandler block 나 delegate 중 하나로 데이터를 반환한다.

delegate 이외에도 NSURLSession 은 상태, progress 에 해당하는 프로퍼티를 제공한다.
또한 취소, 다시시작, 일시중지 등을 지원한다. (resume, suspended, canceled) 





URLSession Class Hierarchy


NSURLSession




NSURLSessionTask

NSURLSessionTask- 세션 내 작업의 기본 클래스

NSURLSessionDataTask - URL의 내용을 NSData 객체로 가져 오는task

NSURLSessionUploadTask - 파일을 업로드 한 다음 URL의 내용을 NSData 객체로 가져 오는 task

NSURLSessionDownloadTask - 디스크의 임시 파일로 URL의 내용을 검색하는 task

NSURLSessionStreamTask - TCP / IP 연결을 설정하는 task




NSURLSessionDelegate


NSURLSessionDelegate- 세션 수준 이벤트를 처리하는 delegate

NSURLSessionTaskDelegate- 모든 작업 유형에 공통된 작업 수준 이벤트를 처리하는 delegate

NSURLSessionDataDelegate- 데이터 및 업로드 작업과 관련된 작업 수준 이벤트를 처리하는 delegate

NSURLSessionDownloadDelegate- 다운로드 작업과 관련된 작업 수준 이벤트를 처리하는 delegate

NSURLSessionStreamDelegate- 스트림 작업과 관련된 작업 수준 이벤트를 처리하는 delegate




마지막으로 NSURLSession API는 NSURLConnection 및 NSURLDownload와 같은 

다른 API와 공통으로 사용되는 많은 클래스를 사용한다.

아래는 공유되는 클래스 중 일부이다.


NSURL- URL이 포함된 Object

NSURLRequest - URL, 요청 메소드 등 URL 요청과 관련된 메타 데이터를 캡슐화한다.

NSURLResponse- 콘텐츠 MIME 유형 및 길이와 같은 요청에 대한 서버의 응답과 관련된 메타 데이터를 캡슐화한다.

NSHTTPURLResponse- 응답 헤더와 같은 HTTP 요청에 특정한 추가 메타 데이터를 추가한다.

NSCachedURLResponse - 캐싱 목적으로 서버 응답의 실제 본문 데이터와 함께 NSURLResponse 개체를 캡슐화한다.





Authentication and TLS Customization


서버가 TLS 협상 중에 인증을 요청하거나 자격 증명을 제공하면 

URL 세션은 delegate 를 호출하여  사용자 지정 방식으로 인증 또는 인증서 유효성 검사를 처리한다. 

호출 방법은 task 관련 challenge 인지 session 전체 challenge 에 따라 달라진다.


Task-specific challenges

Session-wide challenges 

 NSURLAuthenticationMethodDefault

NSURLAuthenticationMethodNTLM 

 NSURLAuthenticationMethodHTTPBasic

NSURLAuthenticationMethodNegotiate 

 NSURLAuthenticationMethodHTTPDigest

NSURLAuthenticationMethodClientCertificate 

 NSURLAuthenticationMethodServerTrust 


Task-specific challenges 의 경우 session 에서 

URLSession : task : didReceiveChallenge : completionHandler : delegate method 를 호출한다.


Session-wide challenges 에서는 session 에서 

URLSession : didReceiveChallenge : completionHandler : delegate method 를 호출한다.

위 메소드가 구현 되어있지 않으면

URLSession : task : didReceiveChallenge : completionHandler : delegate method 를 호출한다.



위 메소드들이 모두 구현되어있지 않으면 request 에 클라이언트 인증이 필요한 경우

URL session 은 다음과 같이 인증을 시도한다.


1. 요청된 URL 의 일부로 제공된 인증정보 사용

2. 앱의 키 체인에서 인터넷 비밀번호와 인증서를 검색하여 사용


위 자격 증명을 사용할 수 없거나 서버가 자격 증명을 거부하면 

연결이 인증없이 계속된다.


HTTP 및 HTTPS 요청의 경우 연결 시도가 적절한 HTTP 상태 코드와 함께 실패하고

대체 콘텐츠를 제공할 수 있다.


다른 URL 의 경우 (ex. FTP) 연결이 실패하면 실패처리된다.




App Transport Security (ATS)

iOS 9부터 도입된 개념으로 새로운 보안 기능이다.

ATS 는 HTTP 연결이 HTTPS (RFC 2818) 을 사용해야함을 요구한다.


더 자세한 내용은 아래 링크를 참고한다.

  • NSApptransportSecurity
    https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33
  • Information Property List Key Reference
    https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009247
  • http://beankhan.tistory.com/23







공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함