Referenced by
Background execution demystified - WWDC20 - Videos - Apple Developer
background(withIdentifier:) | Apple Developer Documentation
URLSession: Common pitfalls with background download & upload tasks
Uploading data in the background in iOS
URLSession background |
Background modes |
---|---|
요청 후 해당 작업이 | |
백그라운드에서 네트워크 작업 유지 | 시스템 자체 자동으로 |
앱 최적화, 업데이트 작업 수행 | |
(coreML최적화, DB 최적화 등) | |
HTTP, HTTPS 업로드 및 다운로드 네트워크 작업 등 | 시스템 자체 사용자가 앱을 사용하지 않을 때 자동 진행(새벽, 충전 상태 등) |
앱 강제 종료 시
백그라운드 세션의 모든 전송 자동취소
sessionSendsLaunchEvents(Bool)
: true 설정 시 백그라운드 작업 완료 후 앱 자동 실행
isDiscretionary(Bool)
: true설정 시 wi-fi연결, 배터리 충전 상태에서 동작 default-false
옵션 무시
옵션 적용
한 번에 하나의 프로세스만 백그라운드 세션 사용 가능
다중 작업 시 각 세션을 만들어 사용(충돌 가능성 방지)
let a = URLSessionConfiguration.background(withIdentifier: "background.A")
let b = URLSessionConfiguration.background(withIdentifier: "background.B")
uploadTask와 downloadTask의 delegate를 활용하여 백그라운드 작업 상태 유지
지원되지 않는 클로저 코드
let url = URL(string: "<http://0.0.0.0>")!
let data = "Secret Message".data(using: .utf8)
let request = URLRequest(url: url)
let config = URLSessionConfiguration.background(withIdentifier: "background.Identifier")
// 클로저 처리 시 백그라운드 비지원
let session = URLSession(configuration: config, delegate: nil, delegateQueue: nil)
let task = session.uploadTask(with: request, from: data) { responseData, response, error in
print("수신된 작업으로 처리")
}
task.resume()
<aside>
❗ *** Terminating app due to uncaught exception 'NSGenericException',
reason: 'Completion handler blocks are not supported
in background sessions.
Use a delegate
instead.'***
</aside>
delegate를 사용하여 처리 (URLSessionTaskDelegate 채택)
let url = URL(string: "<http://0.0.0.0>")!
let data = "Secret Message".data(using: .utf8)!
let request = URLRequest(url: url)
let config = URLSessionConfiguration.background(withIdentifier: "uniqueId")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
let task = session.uploadTask(with: request, from: data)
task.resume()
// delegate를 사용한 처리
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
print("수신된 작업으로 처리")
}