학습 노트/iOS (2021) 96

219. Task Scheduling

Task Scheduling Task는 처음 생성하면 별다른 동작 없이 대기하고 있다가 resume 메서드가 호출되면 즉시 동작을 시작한다. 이는 사용자에게 즉시 필요한 데이터라면 적합한 작동 방식이다. 하지만 지금 당장 데이터가 필요한 경우가 아니라면 미리 기기의 용량을 차지하거나, 셀룰러 용량을 낭비하게 된다. Task Scheduling은 iOS가 Task의 정보를 저장하고 있다가 지정된 시점에 자동으로 다운로드하는 방식으로 동작한다. 따라서 Task의 주체가 앱이 아니게 되고, Background Session 에서만 구현할 수 있다. @IBAction func startDownload(_ sender: Any) { guard let url = URL(string: bigFileUrlStr) el..

218. Adaptable Connectivity

Adaptable Connectivity 네트워크가 연결되지 않은 상태에서 발생한 Task를 대기상태로 두었다가 연결되면 실행되도록 구현한다. lazy var session: URLSession = { [weak self] in let config = URLSessionConfiguration.default config.waitsForConnectivity = true let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main) return session }() SessionConfiguration의 waitsForConnectivity 속성을 true로 변경한다. 이제부터 해당 Sess..

217. Cellular Connection

Cellular Connection 위와 같은 차이점 때문에 네트워크를 사용하는 앱의 경우 사용자가 현재 사용하는 네트워크 방식을 인지할 수 있도록 구현하는 것이 바람직하다. Reachability를 사용하면 이를 쉽게 구현할 수 있지만, 이는 애플의 권장을 벗어난 해결법이다. 애플은 'Framework가 제공하는 API로 허용 여부를 설정'하도록 권고하고 있다. Cellular 연결 설정하기 request.allowsCellularAccess = cellularSwitch.isOn request의 allowsCellularAccess 속성을 Switch의 상태와 동기화한다. DownloadTask는 스위치와 해당 속성의 상태에 따라 다운로드 여부를 결정한다. Switch가 켜져 있는 경우 allowsC..

216. Reachability

Reachability Reachability는 호스트의 접속 가능 상태를 의미한다. iOS는 Reachability를 네트워크 연결에 실패했을 때 상태를 진단하는 목적으로 주로 이용한다. Apple은 Reachability에 따라 요청의 진행 여부를 결정하는 것이 아닌, 상태에 상관없이 요청을 진행하고 이것이 실패하는 경우 Reachability를 사용하도록 안내하고 있다. 이외의 용도로서 기기의 '네트워크 상태'를 확인하거나 Wi-Fi 상태인지의 여부를 확인하는 용도로 사용하기도 한다. Reachability는 SystemConfiguration이 제공하는 API로 구현되어있다. 이를 사용해 직접 구현하는 것보다는 이미 만들어진 오픈소스를 활용하는 것이 더 간편하다. Reachability Open ..

215. Response Caching

Response Caching 항상 네트워크를 통해 작동하도록 하는 것은 매우 비효율적이다. 요정과 응답 사이에 지연이 발생하고, 많은 시스템 자원과 서버 자원을 사용한다. Cache를 사용하면 이를 조금 해소하는 것이 가능하다. 이를 위해 Cache Policy를 설정해 기본으로 제공하는 Cache Store를 사용하거나 새옵게 정의하는 것이 가능하다. Cache Policy useProtocolCachePolicy protocol 형식에 따라 기본 Cahce 정책을 사용한다. Server의 Cahce Controller가 존재하면 기본값을 사용한다. reloadIgnoringLocalCacheData Local Cache를 무시한다. 요청 시도마다 매번 네트워크 요청이 발생한다. 특정 요청에 따른 C..

214. Background Download

Background Download UploadTask와 DownloadTask는 기본적으로 Foreground에서 실행되도록 구현돼있다. Background로 전환했던 앱이 Foreground로 돌아왔을 때 중지된 Task를 이어서 하도록 구현하는 것도 가능하지만, Background에서도 문제 없이 동작하도록 하는 것이 자연스럽다. BackgroundSession은 다른 Session과 다르게 별도의 Process에서 실행되고, 데이터의 전송도 OS가 관리하도록 설계돼있다. 이 때문에 App이 Background로 전환돼도 주체는 변하지 않기 때문에 동작이 유지될 수 있다. BackgroundDownload가 완료되면 Delegate로 Notification을 전송한다. 기능의 원리는 복잡하지만 구현..

213. Download Task

Download Task 네트워크를 통해 데이터를 전송받을 수 있는 Task는 두 가지가 있다. 어느 것을 쓰라고 애플에서 정해주진 않지만, 각각의 특성 덕분에 Data Task는 휘발성의 작은 데이터에, Download Task는 비휘발성의 큰 데이터에 쓰는 것이 일반적이다. Download Task가 동작하는 방식은 다음과 같다. OS가 관리하는 임시폴더에 저장 Delegate를 사용해 임시 폴더의 URL 전달 URL에 접근 후 파일을 원하는 위치로 복사 Download Task는 CancelDownload와 ResumeDownload를 지원하며, 이를 위한 일시정지도 구현 가능하다. 이러한 기능은 Wifi연결이 끊기는 경우 등 여러 상황에 유연하게 대처하는 데 도움이 된다. DownloadTask를..

212. Upload Task

Upload Task Dropbox와 연동해 Upload를 Task를 구현해 본다. Dropbox의 Developer app console에서 필요한 API Key를 얻을 수 있다. 파일을 쓰는데 문제가 없도록 write 권한을 활성화 한다. Dropbox/upload HTTP - Developers - Dropbox Dropbox is a free service that lets you bring your photos, docs, and videos anywhere and share them easily. Never email yourself a file again! www.dropbox.com Dropbox의 upload url은 다음과 같다. https://content.dropboxapi.com/..

211. Post Request

Post Request 서버로 데이터를 전송하는 경우 보통 POST와 PUT을 사용하게 된다. 전송하는 데이터의 형식은 서버에 따라 달라 API 문서를 확인하는 과정이 필요하다. POST를 위해 필요한 request 정보는 다음과 같다. method POST header Content-Type : application/json body url JSON 데이터 구조 struct PostData: Codable { let a: Int let b: Int let op: String } 서버는 JSON 파일을 받고, 세 개의 데이터를 받는다. 이들은 각각, 연산자와 피연사자로 사용된다. 따라서 JSON Encoding에 사용할 구조체도 이에 맞도록 구현해야 한다. Request 생성 @IBAction func ..

210. SessionConfiguration

SessionConfiguration URLSession을 직접 생성하는 경우 SessionConfiguration을 파라미터로 전달해 줘야 할 필요가 있다. SessionConfiguration은 네트워크 연결에 관련된 속성을 설정하며, 때문에 URLSession을 생성하기 전에 구성을 완료해 전달해야 한다. 이후에는 수정할 수 없다. SharedSessionConfiguration SharedSession을 구성할 때 사용한다. 모든 설정값이 기본값을 가진다. 직접 사용하는 경우는 없다. DefaultSessionConfiguration 모든 설정값이 기본값을 가진다. SessionDelegate를 사용한 Event 처리가 가능하다. DiskCache를 사용한다. (인증정보 = KeyChain, Co..