네트워크 데이터 전송 작업과 관련된 그룹을 조정하는 객체
iOS 7.0+
iPadOS 7.0+
macOS 10.9+
Mac Catalyst 13.1+
tvOS 9.0+
watchOS 2.0+
@interface NSURLSession : NSObject
NSURLSession 클래스 및 관련 클래스는 URL로 표시된 endpoint에서 데이터를 다운로드하고 업로드하기 위한 API를 제공합니다.
앱이 실행 중이 아닐 때나 iOS에서 앱이 일시 중단된 동안 백그라운드 다운로드를 수행하기 위해 이 API를 사용할 수도 있습니다.
NSURLSessionDelegate 및 NSURLSessionTaskDelegate를 사용하여, 1) 인증을 지원하고 2) 재접속 및 작업 완료와 같은 이벤트를 수신할 수 있습니다.
NSURLSession API는 상당히 복잡한 방식으로 함께 작동하는 여러 클래스를 포함하며, 현재 문서만 참고할 경우에는 명확하게 이해되지 않을 수 있습니다.
API를 사용하기 전에 URL Loading System의 overview를 읽어보세요.
Essentials, Uploading 및 Downloading 문서에서 NSURLSession으로 일반적인 작업을 수행하는 예시를 제공하고 있습니다.
앱은 하나 이상의 NSURLSession 인스턴스를 생성하며, 각 인스턴스는 관련 데이터 전송 작업 그룹을 조정합니다.
예를 들어, 웹 브라우저를 만드는 경우,
1) 앱에서 tab 또는 window 당 하나의 session을 만들거나
2) Interactive use를 위한 session과 background download를 위한 session
을 만들 수 있습니다.
각 session 내에서 앱은 특정 URL에 대한 요청(필요한 경우, HTTP 리디렉션을 따름)을 나타내는 일련의 작업을 추가합니다.
지정된 URL session 내의 작업은
등과 같은 연결 동작을 정의하는 공통 세션 구성 객체를 공유합니다.
NSURLSession에는 기본 요청을 위한 싱글톤 sharedSession이 있습니다.
생성하는 session만큼 사용자 정의가 가능하지는 않지만, 요구 사항이 매우 제한적인 경우에는 좋은 시작점 역학을 합니다.
공유 클래스 메서드를 호출하여 이 session에 접근합니다.
다른 유형의 session은, 다음 세 가지 구성 중 하나를 사용하여 NSURLSession을 생성할 수 있습니다.
Default Session : shared session과 유사하게 동작하지만, 이를 구성할 수 있습니다.
기본 세션에 delegate를 할당하여 데이터를 점진적으로 가져올 수도 있습니다.
Ephemeral Session : shared session과 유사하지만, 캐시, 쿠키 또는 자격 증명을 디스크에 쓰지 않습니다.
Background Session : 앱이 실행되지 않는 동안 background에서 컨텐츠 업로드 및 다운로드를 실행할 수 있습니다.
각 타입 생성에 대한 디테일한 사항은 NSURLSessionConfiguration 클래스에 Creating a Session Configuration Object을 참고하세요.
session 내에서, 선택적으로 데이터를 서버에 업로드한 다음 디스크의 파일 또는 메모리의 하나 이상의 NSData 객체로 서버에서 데이터를 검색하는 작업을 생성합니다.
NSURLSession API는 다음과 같은 네 가지 유형의 task를 제공합니다.
Data Task : NSData 객체를 사용하여 데이터를 주고 받습니다. 이 작업은 서버에 대한 짧고 인터랙티브한 요청을 위한 것입니다.
Upload Task : Data Task와 유사하지만, 파일 형식의 데이터도 전송하며 앱이 실행되지 않는 동안 백그라운드 업로드를 지원합니다.
Download Task : 파일 형식으로 데이터를 받아오고 앱이 실행되지 않는 동안 백그라운드 다운로드 및 업로드를 지원합니다.
WebSocket Task : RFC 6455에 정의된 WebSocket 프로토콜을 사용하여 TCP 및 TLS를 통해 메시지를 교환합니다.
- TCP란? Transmission Control Protocol 전송 제어 프로토콜
서버와 클라이언트 간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜.
데이터를 전송하기 전에 데이터 전송을 위한 연결을 만드는 연결지향 프로토콜.
- TLS란? Transport Layer Security 전송 계층 보안
인터넷 커뮤니케이션을 위한 개인 정보와 데이터 무결성을 제공하는 보안 프로토콜.
session의 task도 shared delegate 객체를 공유합니다.
과 같은 다양한 이벤트가 발생할 때 정보를 제공하고 얻기 위해 delegate를 구현합니다.
delegate가 제공하는 기능이 필요없는 경우, session을 만들 때 아무 것도 제공하지 않고 API를 사용할 수 있습니다.
✏️ Important
Session 객체는 앱이 session을 종료하거나 명시적으로 비활성화할 때까지 delegate에 대한 강한 참조를 유지합니다.
session을 비활성화하지 않으면 앱이 종료될 때까지 메모리가 낭비됩니다.
session으로 생성하는 각 task는 NSURLSessionTaskDelegate에 정의된 방법을 사용하여 session의 delegate에게 다시 호출합니다.
또한 task와 관련된 별도의 delegate를 입력하여 session delegate에 도달하기 전에 콜백을 가로챌 수 있습니다.
대부분의 네트워킹 API와 마찬가지로, NSURLSession API는 비동기적입니다.
호출하는 방법에 따라 세 가지 방법 중 하나로 앱에 데이터를 반환합니다.
Swift를 사용하는 경우, async 키워드로 표시된 메서드를 사용하여 일반 task를 수행할 수 있습니다.
예를 들어, data(from:delegate:)는 데이터를 가져오지만, download(from:delegate:)는 파일을 다운로드합니다.
call point는 전송이 완료될 때까지 await 키워드를 사용하여 실행을 일시중단합니다.
bytes(from:delegate:) 메서드를 사용하여 데이터를 비동기 시퀀스로 수신할 수도 있습니다.
이 접근 방식을 사용하면 앱이 데이터를 수신할 때 데이터를 반복하기 위해 for-await-in 구문을 사용할 수 있습니다.
URL 타입은 또한 shared URL session에서 바이트 또는 라인을 가져올 수 있는 편리한 메서드를 제공합니다.
Swift 또는 Objective-C에서는 전송이 완료될 때 실행되는 completion handler block을 제공할 수 있습니다.
Swift 또는 Objective-C에서는 전송이 진행되는 대로 그리고 전송이 완료된 직후에 delegate 메서드에 대한 콜백을 받을 수 있습니다.
NSURLSession은 delegate에 정보를 전달하는 것 외에도 상태 및 진행률 속성을 제공합니다.
task의 상태가 언제든지 변경될 수 있다는 주의 사항을 포함하여 task의 현재 상태를 기반으로 프로그래밍 방식으로 결정해야 하는 경우 이러한 속성을 요청하세요.
NSURLSession 클래스는 data, file, ftp, http, https URL 스키마를 기본적으로 지원하며 사용자의 시스템 환경설정에 구성된 프록시 서버와 SOCKS 게이트웨이에 대한 투명한 지원을 제공합니다.
NSURLSession은 HTTP/1.1, HTTP/2, HTTP/3 프로토콜을 지원합니다.
RFC 7540에서 설명한 바와 같이 HTTP/2를 지원하려면 ALPN(응용 계층 프로토콜 협상)을 지원하는 서버가 필요합니다.
또한 NSURLProtocol을 하위 분류하여 자체 사용자 지정 네트워킹 프로토콜 및 URL 스킴(앱 개인용)에 대한 지원을 추가할 수 있습니다.
iOS 9.0 및 macOS 10.11 이후 버전은 NSURLSession으로 만든 모든 HTTP 연결에 App Transport Security(ATS)를 사용합니다.
ATS는 HTTP 연결이 HTTPS(RFC 2818)를 사용해야 합니다.
자세한 내용은 NSAppTransportSecurity를 참조하세요.
Session과 Task 객체는 다음과 같은 NSCopying 프로토콜을 준수합니다.
URL session API는 thread-safe합니다.
thread context에서 session과 task를 자유롭게 생성할 수 있습니다.
delegate 메서드가 제공된 completion handler를 호출하면, 작업은 자동으로 올바른 delegate queue에 예약됩니다.