- 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻
https://developer.apple.com/videos/play/wwdc2017/709/
관련내용
- URLSession의 향상을배워보자.
- 새로운 URLSessionAPI를 더 낫게 연결을 하는방법을 배워보자.
- 백그라운드 스케쥴정하는방법도.
- progress report도 받는방법도.
👍요약
- 연결이좋지않을떄, 이제는 URLSessionConfiguration - waitsForConectivity 를통해 연결이좋아질때까지 기다리도록 하게됐다.
- 물론, 연결이좋지않을때 , waiting상태일떄 알수있는 delegate메서드도있다.
- 예외상황을제외하고는 항ㅅ아 true로하라.
- URLSessionBackground일때, 여러문제가있는데, SessionTask - earliestBeginDate , delegate , count를 통하여 해결해준다.
- timeutIntervalForResource - 는 default로 7일이다.
- URLSessionTask는 progressReporting프로토콜을채택하여, progress객체가있다.
Default URLSession은 fetch하거나 fail만 존재한다.
- 연결이부종한경우 즉시 실패하게된다.
Background URLSesion은 연결성을 계속 모니터링하게한다.
연결성이 안좋은경우는
- 이더넷케이블이 없고, 와이파이없고, 셀룰러가아닐때.
- 또는 에어플래인모드일때,
- VPN연결이안됐을때,
지금까지는 연결성이부족하거나, 할떄 완전하지않은 솔루션이있었다.
하지만 이제는 URLSession Adapatable Connectivity API 를 소개한다.
URLSessionConfiguration - waitsForConectivity 를 true로한다.
- 연결성이 일시적으로안좋을때, 원래는 바로 fail이되지만, 이를 키게되면, 연결이될때가지 기다리도록해준다! 그리고연결이되면 그때부터 다운받도록 해준다!
- 더이상 연결과 다시 리쿼스트를 할필요가없다!
- 그리고 background session에서는 이는 필요없다. 자동적으로해준다.
- 또한 DNS 실패에도 기다리게해준다.
또한 waiting하고있는지, 를 알 수 있는 방법이있따.
urlsession(_: taskIsWaitngForConnectivity: )
- delegate메서드로, 받을수있다.
- 그리고이는 waitsForConnetivity 가 true일때만, 호출된다.
예외상황빼고는 항상 이 프로퍼티를 true로 하라.
- 연결이되기시작한다면 즉시바로 실행되기때문에 downside가없다.
- 예외상항은 그즉시리쿼스트가 실패하거나성고앻야하라때, - 주식사고파는것처럼
👍Example Code

요약 -Recap

URLSession background
- 앱이 running하고있지않아도, 통신하게해준다.
- background app refresh을 가능하게해준다.
- 항상최신상태로유지하게해준다.
- watch os complication처럼
- 더자세한건 What’s new with Multitasking - WWDC2013
- Keeping Your Watch App Up to Date - WWDC2016
실제로 Background App refresh 가하는건뭘까?
우선, 앱의상태가필요하다

아래와같이, 러닝일때, background request를한다.
- 미래에 내가 앱을사용할건데, 최신상태로유지해주삼!
그리고 suspend 되고, background갔을때, 시스템은 해당request를생성하고, 완료하고, 데이터를받는다
하지만 몇가지문제가있다.
- 이렇게 background task가있으면, 사용자의폰 배터리에도 영향이있고, cpu를 사용한다 .이는 사용자에게 좋지못하다.
- 또한, 리쿼스트를 생성한것과 네트워킹을시작할때에 변화가있을수있다. 즉 네트워킹을마쳤지만, 더이상필요없는데이터일수도있다.
- 시스템은 언제스케쥴할지 에대한 정보가부족하다.
그럼 우리가 이러한것들을 해결했는데, 그것은 URLSession scheduling API이다.
- URLSessionTask 객체에서 새로운 프로퍼티를제공한다.
- 👍earliestBeginDate : Date?
- 이는 언제 이 task를 실행할지 정하도록한다.
- 이를통해, 이날짜이전까지는 네트워킹하지않도록보장하고, backgroundSession에서만가능하다

그러므로 earliestBeginDate 를사용하면 아래로아같이 3단게로바뀐다

이렇게 첫번째문제는 해결됐고,
두번째 context가 바뀐경우에는
👍urlSession(_:task:willBeginDelayedReuqest:completionHandler: ) delegate를 통해 해결할수있다.
- beginNetwroking이 될때, 우리에게 실행할지말지 기회를준다.
- 물론 earliestBeginDate가 켜져있고, backgroundSession에서만가능하다.
- 즉, 이때면 더이상필요없다고판단할수있고, 변경해야할수도있고, 등등 결정ㅎ알수있따.
- 잘 신중해서하길바란다
👍3번째문제 - 언제스케쥴릴할지,
- 는 시스템은 알지못하기때문에, 시스템에게 더 많은정보를 주기위해 우리는 2가지프로퍼티를 사용ㅎ라수잇다.
- 직접개발자는 어느정도데이터가필요한지, 서버에얼마나데이터가올지를 더 명확히알것이기때문이다.
- 그러므로 시스템은 정보를가지고 더 언제 스케쥴링ㅎ라지 최적화할수있게된다.
-
- 또는 잘모르겠다면, 아래와같이 알릴수있다.

👍예제코드
- 오호, timeIntervalSliceNow 를사용할수있군! 120분!
delgate메서드
- 오호! 기존 request를 변경하여 보내는구나,

👍ProgressReporting
- 이제 iOS11부터 , URLsesionTask는 ProgressReporting프로토콜을 채택했다.
- 그래서, URLSessionTask는 progress 프로퍼티가생겼다.
- 이 progress객체는, fractionCompleted 프로퍼티로, 0.0~1.0의 값사이를 준다 ( 완료하고있는 )
- 또한, 나중에 보기위해, 더 자세한 정보를 담을수있도록 String을 줄수도있다. - localizedDescription, localizedAdditionalDescription
- 그리고, 해당 progress 객체를 UIPorgressView 또는 NSProgressIndicator에 부착할수도있따!!! 대박.
- 또한 여러개의 task들을 합쳐서 나타낼수도있다. 다운로딩파일, decompressing 파일등등

각각 1-1이매칭된다

URLSession은 이제 Brotli compression 알고리즘을 적용했다.
- URL로드가 15%나 더 빨라졌다.
- 사파리도빨라짐
Networkig TIP

👍TimeOut
- ForResource
- 그시간안에 리소스가 다 받지않는다면 끝난다.
- default로 7일이다.


TLS 1.3 을 애플이같이 진행중이다. (이제는 완료됐고, )

QUIC
애플이같이진행중이다
( 이번 WWDC 21 에서 발표했었죠! )

Bonjure

- 스티브잡스가소개하고나서 15년이지났다.
- 음, 뭐 다양한 기기들이 Bonjure와 웹서버를 장착해, 맥으로 조종및 모든결과를쉽게볼수있게됐다.
- ( 찾아보니, 로컬네트워크에서 연결된 디바이스들을 쉽게 찾아주도록 해준다. 음, 따로 포트번호 및 네트워크주소를 정의하지않아도 감지할수있는 ? )

'WWDC' 카테고리의 다른 글
WWDC 18 - Introducing Network.framework: A modern alternative to Sockets (0) | 2021.06.26 |
---|---|
WWDC 19 - Advances in Networking, Part 1 (0) | 2021.06.24 |
WWDC 15 - Networking with NSURLSession (0) | 2021.06.24 |
WWDC 15 - Mysteries of Auto Layout, Part 1 (0) | 2021.06.24 |
WWDC 19 - Advances in UI Data Sources (0) | 2021.06.23 |