ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • URL Session 에 대해서
    Swift 2021. 7. 6. 21:05

    https://developer.apple.com/documentation/foundation/urlsession

     

    : Apple에서 제공하는 서버와 통신하기 위한 api

     

    Request와 Response 형식은 동일

     

    URLSessionDelegate, URLSessionTaskDelegate 제공

    Types of URL Sessions

    URLSession은 4가지 종류의 Session을 지원합니다.

    1. Default Session: shared session처럼 행동하지만 직접 구성할 수 있다. 또한 data를 점진적으로 획득할 수 있도록 delegate를 할당할 수 있다. 기본적인 Session으로 디스크 기반 캐싱을 지원합니다.
    2. Ephemeral Session: 임시 세션, 어떠한 데이터도 저장하지 않는다 (disk 저장 노)
    3. Background Session: 앱이 백그라운드에 있어도 통신을 진행한다.
    4. shared Session : 이미 singleton인 기본 Session

      * 그런데 여기서!
      (default vs shared 를 모르겠었다. 아래는 참고한 블로그의 내용을 덧붙여 본다.)
    더보기

    shared session의 한계점

    delegate나 configuration 객체가 없으므로 당연히 다음과 같은 한계점이 발생하게 된다.

    • 서버로 부터 데이터를 받아올 때 data를 점차 증가시면서 받아올 수 없다.
    • connection behavior를 defualt에서 더 이상 커스터마이즈 할 수 없게 된다.
    • authentication(인증)을 수행하는 기능은 사용할 수 없다.
    • 앱이 실행되지 않을 때, background에서 download나 upload를 수행할 수 없다.

    shared session은 URLCache, HTTPCookieStorage, URLCredentialStorage 객체들을 공유하게 된다.
    또한 registerClass(_:), unregisterClass(_:) 에 의해서 구성되는
    shared custom networking protocol list를 공유하게 된다.
    그리고 이러한 것들은 모두 default configuration에 기반을 두고 있다.

    따라서 shared session을 사용하는 경우에는 cache, cookie storage, credential storage를
    커스트마이징 하는 것을 피해야한다.
     (만약 NSURLConnection을 사용하는 것이 아니라면!!)

    결론은 만약 cache, cookies, authentication, custom networking protocols을 사용하는 것이라면
    shared session이 아닌 default session을 사용해야 하는 것이다!!

    출처 : https://velog.io/@minni/URLSession-URLSessionConfiguration-URLSessionTask

    Types of URL Session Tasks

     

    1. Data tasks : NSData 객체를 사용하여 데이터를 주고 받는 task, 주로 짧고 빈번한 통신에 사용한다.

    2. Upload tasks : 데이터를 업로드하고(종종 파일 형식), 앱이 실행되지 않는 동안 백그라운드 업로드를 지원한다.

    3. Download tasks : 파일 형식으로 데이터를 검색하고 앱이 실행되지 않는 동안 백그라운드 다운로드 및 업로드를 지원한다.

    4. WebSocket : 웹소켓 작업은 RFC 6455에 정의된 WebSocket 프로토콜을 사용하여 TCP, TLS를 통해 메시지를 교환한다.

     

    이러한 task를 작성한 다음에는 resume() 함수를 불러주어야한다.
    그러면 session은 strong reference를 해당 task가 끝나거나 실패할 때까지 유지해준다.

    Using a Session Delegate

    세션의 작업은 공통 위임 개체도 공유합니다. 다음과 같은 경우를 포함하여 다양한 이벤트가 발생할 때 delegate를 구현한다.

    • 인증에 실패했습니다.
    • 데이터가 서버에서 도착
    • 데이터를 캐싱 할 수있을때

    delegate 기능이 필요하지 않은 경우 nil로 세션을 만들 때 전달하여 제공하지 않고 API를 사용할 수 있습니다 .

     

    * 중요

    세션 개체는 앱이 종료되거나 세션을 명시 적으로 무효화 할 때까지 delegate에 대한 강력한 참조를 유지합니다. 세션을 무효화하지 않으면 앱이 종료 될 때까지 앱에서 메모리가 누출됩니다.

     

    세션으로 만든 각 작업은 정의 된 메서드를 사용하여 세션의 대리자를 다시 호출합니다. 작업에 특정한 별도의 항목  채워 세션 대리자에 도달하기 전에 이러한 콜백을 가로 챌 수도 있다 .URLSessionTaskDelegatedelegate

     

    Asynchronicity and URL Sessions

    URL 세션은 비동기적이다. 아래 두가지 방법으로 응답을 처리한다.

    • 전송이 완료되면 completion handler block을 호출하여 결과나 error를 반환해준다.
    • 전송이 완료되고 데이터가 도착했다면, session delegate의 메서드를 호출하여 알려준다.

     

    Protocol Support

    URLSession 클래스는 기본적으로 데이터, 파일, ftp, http, https URL 체계를 지원하며
    사용자 시스템 구성 환경에 따라 proxy server나 SCOKS gateway를 지원한다.
    URLSession은 HTTP/1.1 과 HTTP/2 프로토콜을 지원한다.

     

    App Transport Security (ATS)

    iOS 9.0 및 macOS 10.11 이상에서는 .NET을 사용한 모든 HTTP 연결에 ATS (App Transport Security)를 사용합니다. 

    ATS는 HTTP 연결에서 HTTPS ( RFC 2818 )를 사용해야 합니다. 

    (짧게 설명하자면 보안 정책중에 하난데, ios 9이상부터 http 통신을 허용하지 않는겁니다. info.plist에서 예외 처리 가능합니다. 아래 참조)

    NSAppTransportSecurity

    Foundation Copying Behavior

    세션과 task는 NSCopying protocol 을 따른다.

    • 앱이 session 또는 task를 copy하면 동일한 객체를 가져온다.
    • 앱이 configuration object를 copy하면, 독립적으로 수정할 수 있는 new Copy가 생성된다.

    Thread Safety

    The URL session API is thread-safe. 

    핵심은 위의 문장입니다. URL Session은 Thread safe하다.

    When your delegate methods call the provided completion handlers, the work is automatically scheduled on the correct delegate queue.

    -> delegate 메소드가 completion handler를 부르면, 작업은 자동적으로 올바른 delegate queue에 스케쥴링 된다.

     

    728x90

    댓글

Designed by Tistory.