study record

[iOS] URLSession (Foundation - URLSession) 본문

iOS/iOS_Document

[iOS] URLSession (Foundation - URLSession)

asong 2022. 4. 20. 15:30

공식문서 https://developer.apple.com/documentation/foundation/urlsession 를 읽고 정리한 글입니다.

 

URLSession

네트워크 데이터 통신 작업들을 협력하는 객체

 

class URLSession : NSObject

 

Overview

URLSession 클래스와 연관된 클래스들은 URL이 가리키는 엔드포인트에 데이터를 업로드하거나 데이터를 다운로드 받아오는 API를 제공한다. 앱이 실행되고 있지 않을 때, suspended 상황일 때 백그라운드 다운로드를 수행하기 위해 이 API를 사용할 수 있다. 인증을 지원받거나 리디렉션, 작업 완료 이벤트들을 받기 위해서는 URLSessionDelegate, URLSessionTaskDelegate를 사용할 수 있다.

 

데이터 통신관련 작업들에 협력하는 URLSession 인스턴스들을 하나 이상 만들 수 있다. 예시로, 웹 브라우저를 만든다면 앱은 탭마다 하나의 세션을 만들지도 모른다. 각 세션 안에 앱은 여러 작업들을 추가하고 특정 URL을 위한 요청을 나타낼 것이다.

 

Types of URL Sessions

URL 세션 내의 작업들은 커넥션 행동(동시 연결 최대 수 같은), 셀룰러 네트워크를 사용할 수 있는지 없는지 등을 정의하는 흔한 세션 configuration 객체를 공유한다.

 

URLSession은 기초 요청을 위한 싱글톤 shared 세션을 가진다. (configuration 객체를 가지지 않는다.) 직접 만든 세션들만큼 커스텀 가능하지 않지만 제한된 요청사항을 가진다면 좋은 시작점을 제공한다. shared 클래스의 메서드를 호출하며 세션에 접근할 수 있다. 여러 세션들을 위해 세 종류 중 하나의 configurations과 함께 URLSession을 만든다.

- default session : shared 세션같이 행동한다. 그러나 configure이 가능하다. 데이터를 추가하기 위해 default session에 delegate를 할당할 수 있다.

- Ephemeral session : shared 세션가 비슷하다. 그러나 캐시, 쿠키, 디스크 크리덴셜을 제공하지 않는다.

- Background session : 앱이 작동하지 않는 동안에도 백그라운드에서 먼텐츠를 업로드, 다운로드할 수 있게 돕는다.

 

Types of URL Session Tasks

세션 안에서 서버에 데이터를 업로드하고 서버로부터 데이터를 회복하는 작업을 만들 수 있다. URLSession API는 네가지 타입의 테스크를 제공한다.

- Data : NSData 객체를 사용해 데이터를 주고 받는다. Data 테스크는 짧고 자주 상호작용적인 요청에 좋다.

- Upload : data 테스크와 비슷하다. 그러나 데이터를 보내고, 앱이 실행되지 않는 동안에 백그라운드 업로드를 지원한다.

- Download : 파일 형태로 데이터를 얻는다. 앱 실행이 멈추어도 백그라운드 다운로드와 업로드를 지원한다.

- WebSocket : 웹소켓 프로토콜을 사용해 TCP, TLS로 메시지 교환을 돕는다. 

 

Using a Session Delegate

세션의 테스크들은 delegate 객체를 공유한다. 다양한 이벤트가 일어날 때 정보를 제공하고 얻기 위해 delegate를 시행한다.

- 인증에 실패한 경우

- 데이터가 서버로부터 도착했을 때

- 데이터가 캐싱에 가능해졌을 때

 

*세션 객체는 앱이 종료되거나 세션 무효화를 하기 전까지 delegate에 강한 참조를 유지한다. 세션 무효화를 하지 않으면 앱의 메모리 누수가 앱 종료시까지 이어진다.

 

세션에 만든 각각의 테스크는 URLSessionTaskDelegate에 정의된 메서드를 사용하여 세션의 delegate에 콜백한다. 분리된 delegate를 만들어 그들이 세션 delegate에 이르기 전에 콜백을 가로챌 수 있다.

 

비동기성과 URL Sessions

네트워킹 API들과 같이 URLSession API는 비동기적으로 작동한다. 세가지 방식 중 하나로 데이터를 리턴한다.

- 만약 Swift를 사용한다면 async 키워드에 의해 표시된 메서드를 사용할 수 있다. 예시로 data(from:delegate:)는 데이터를 가져오고, download(from:delegate:)로 파일을 다운로드한다. 요청 포인트에서는 통신이 완료될 때까지 실행을 멈추기 위해 await 키워드를 사용한다. 

- Swift, Objective-C에서 completion hanler block을 사용할 수 있다. 통신이 완료될 때 수행된다.

- Swift, Objective-C에서 통신이 진행될 때, 완료된 후 즉시, delegate 메서드를 통해 콜백을 받을 수 있다.

 

delegate에 정보를 전달시에는 URLSession은 상태와 진행 프로퍼티들을 제공한다. 

 

Protocol Support

URLSession 클래스는 데이터, 파일, ftp, http, https URL 스킴을 지원한다.  URLSession은 HTTP/1.1, HTTP/2, HTTP/3 프로토콜을 지원한다. 또한 커스텀 네트워킹 프로토콜도 URLProtocol을 상속받아 지원할 수 있다.

 

App Transport Security (ATS)

iOS 9.0, macOS 10.11는 ATS를 모든 HTTP 커넥션을 위해 사용한다. ATS는 HTTPS에 필요로 한다.

 

Foundation Copying Behavior

세션과 테스크 객체들은 NSCopying 프로토콜을 따른다.

- 앱이 세션이나 테스크 객체를 복사할 때 같은 객체를 돌려받느다.

- 앱이 configuration 객체를 복사할 때, 독립적으로 수정할 수 있는 새 복사본을 얻는다.

 

Thread Safety

URL 세션 API는 thread-safe이다. 자유롭게 세션들과 테스크들을 각각의 스레드 컨텍스트에서 만들 수 있다. delegate 메서드가 제공된 컴플리션 핸들러를 호출할 때, 작업이 자동적으로 옳은 delegate 큐에 스케줄된다.