iOS에서 백그라운드 업로드 / 다운로드 이해하기

백그라운드 작업을 생각할 때 iOS 개발자가 생각하는 일반적인 생각은 무엇입니까?

맞습니다. UIApplication에서 위의 API를 즉시 생각하면 업로드 / 다운로드를 완료하기 위해 앱이 백그라운드에서 실행되는 시간을 연장 할 수 있습니다. 하지만 다운로드 / 업로드 크기가 크면 예를 들어 500MB에 대해 가정하고 LTE / 3G 연결을 사용하고 있습니다. 그래도 작동할까요? 대답은 업로드 / 다운로드가 완료 될 것이라는 보장이 없으며 그 사이의 다양한 이유 (예 : 메모리 부족, 배터리 등)로 인해 시스템에 의해 앱이 종료 될 가능성이 매우 높습니다.

이것이 작동한다는 것을 어떻게 보장합니까? iOS에도 동일한 솔루션이 있습니까?

Unsplash에 Jake Young의 사진

대답은 '예'입니다. NSURLSessionConfiguration은 앱을 백그라운드로 사용할 때 업로드 / 다운로드가 원활하게 작동하도록 API를 제공합니다. 이 API를 사용한 업로드 / 다운로드는 앱이 OS에 의해 종료 된 경우에도 작동합니다. 앱을 강제 종료하면 작동하지 않습니다 . iOS는 기본적으로 앱이 종료되면 업로드 / 다운로드 작업을 시스템의 업로드 데몬 스레드에 전달합니다. 바로 이러한 이유로 파일을 장치의 영구 위치에 저장하는 것이 중요합니다.

위의 코드 스 니펫에서 백그라운드 세션 구성에 전달 된 식별자가 고유 한 식별자인지 확인해야합니다.

Q : 이제 실행중인 업로드 / 다운로드 상태를 어떻게 알 수 있습니까?

A : 특정 NSURLSession에 대한 식별자를 제공하는 다음 API를 AppDelegate에 추가 할 수 있습니다. OS는 일반적으로 세션의 모든 작업이 완료되면 앱을 깨우고 다음 API를 호출하여 세션 진행 상황을 알려줍니다.

위의 방법을 사용하여 NSURLSession을 다시 연결하고 업로드 / 다운로드 진행률을 확인할 수 있습니다. 여기에 전달하는 식별자가 실제로 진행 상황을 가져 오려는 식별자인지 확인해야합니다. 그렇지 않으면 예상대로 작동하지 않을 수 있습니다.

Q : 백그라운드 구성으로 NSURLSession에 대한 작업을 생성하려면 어떻게해야합니까?

A : NSURLSessionUploadTask / NSURLSessionDownloadTask를 사용하여 위에서 만든 백그라운드 구성과 함께 파일을 업로드 / 다운로드 할 수 있습니다.

이 파이프 라인을 사용하여 직면 한 주요 문제는 무엇입니까?

  • 다운로드 / 업로드하려는 파일을 디스크에 저장해야합니다. 이것은 일반적으로 업로드 / 다운로드 시간 동안 IO 작업을 증가시킵니다. 업로드 / 다운로드가 진행되는 동안 CPU 사용량이 크게 증가하는 것을 볼 수 있습니다.
  • 사용자 정의 프로토콜은 지원되지 않습니다.
  • 이 파이프 라인을 디버깅하는 것은 매우 어렵습니다. 다운로드 / 업로드가 아직 실행 중인지 확인하는 유일한 방법은 Mac 콘솔 또는 시스템 진단 로그에서 로그를 확인하는 것입니다. 아래 섹션을 확인하십시오 .
  • OS가 앱을 강제 종료하고 다운로드 / 업로드가 작동하는지 확인하려는 시나리오를 모방하기는 어렵습니다. iPhoneX 아래의 휴대 전화에서는 전원 버튼을 누른 상태에서 스위치 꺼짐 화면이 표시 될 때까지 홈 버튼을 길게 눌러이를 복제 할 수 있습니다. iPhoneX 이상에서이 작업을 수행하는 방법이 있는지 확실하지 않습니다. 누군가가 알고 있다면 좋을 것입니다 :)
  • 무제한 세션을 계속 만들 수는 없습니다. 앱이 활성 상태가 아니고 OS에 의해 종료되는 경우 OS는 모든 세션이 작업을 완료하고 iOS 재개 속도 제한 기가 표시 되면 앱을 깨 웁니다 . 세션이 앱을 깨울 때마다 깨우기 시간이 매번 증가하고 계속해서 증가하여 앱이 전혀 깨어나지 않을 수 있습니다. 이를 방지하는 최선의 전략은 하나의 세션 만 갖고 동일한 세션에 작업을 계속 추가하는 것입니다. (참고 : 위의 상황은 다운로드가 아닌 업로드에만 발생합니다.)
  • Wi-Fi, 느린 Wi-Fi, LTE, 3G, 네트워크 없음, 업로드 재개 등과 같은 모든 조건에서 테스트하는 데는 엄청난 QA 시간이 걸립니다.

백그라운드 구성 세션이 초기화되고 업로드가 시작 되려고 할 때 로그가 표시되는 방식입니다.

백그라운드 업로드 시작 로그

그리고 이것은 앱을 백그라운드로 설정하고 OS가 앱을 종료했지만 업로드는 계속 진행 중일 때 로그가 어떻게 표시되는지 보여줍니다. OS는 세션의 모든 작업이 완료되는 즉시 앱을 깨우고 앱 델리게이트 이벤트를 보내려고합니다.

백그라운드 업로드 종료 로그

Fyusion Inc 에서 구현 한 내용

  • 진행중인 업로드 상태를보다 쉽게 ​​유지하고 NSURLSession에서 하나의 작업으로 모든 작업을 수행 할 수 있도록 단일 파일 업로드로 이동했습니다. 파이프 라인에 대기열 아키텍처가있는 경우이 방법을 사용하는 것이 좋습니다. 단일 NSURLSession에 작업을 계속 추가하십시오. 우리는이 파이프 라인에 대해 여러 개의 NSURLSession을 만드는 것이 현명하지 않다는 것을 어렵게 배웠습니다.
  • 하나의 NSURLSession으로 이동하면 iOS Resume Rate Limiter도 처리 됩니다. (참고 : 하나의 파일을 갖는 것도 매우 큰 파일을 처리하는 방법과 같은 자체 문제가 있습니다. 우리는 여전히 작업 중이며 파일 크기가 큰 파일을 분할하는 작업을 진행할 것입니다.)
  • 여러 NSURLSession으로 앱을 폭격하면 OS의 업로드 데몬 스레드가 중단되고 결과적으로 전체 장치가 중단 될 수 있습니다. (그러나이를 위해 세션 수는 일반적인 시나리오가 아니라 엄청나게 높아야합니다. :))
  • 백그라운드 업로드 진행 상황의 내부 상태를 유지하는 것은 특히 SDK를 개발하는 경우 매우 중요합니다. 클라이언트는 앱을 재개 한 후에도 업로드 상태에 액세스 할 수 있어야합니다.
  • 재개 가능한 다운로드는 항상 옵션이지만 재개 가능한 업로드는 옵션이 아닙니다. 업로드를 최적화하는 유일한 옵션은 파일 청크를 만드는 것입니다.

Suggested posts

코드없이 SwiftUI 디자인 블록 배우기

최고의 SwiftUI 학습 경험을 구축하는 전 Apple 디자이너

코드없이 SwiftUI 디자인 블록 배우기

제 이름은 Sahand Nayebaziz입니다. 저는 Photoshop과 그래픽 디자인으로 시작한 인터페이스 디자이너입니다.

모든 초보자가 알아야 할 5 가지 Swift 기능

모든 초보자가 알아야 할 5 가지 Swift 기능

초보 개발자로 일한다고해서 우리가 가지고있는 기본 지식으로 계속 일하고 노인의 도움을 기다리는 것은 아닙니다. 우리의 기술을 향상시킬 여지는 항상 있습니다.

Related posts

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜과 위임은 Swift의 기본 개념입니다. 작동 방식과 사용 방법에 대해 알아 보려면이 빠른 가이드를 읽어보세요.

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜은 Swift에서 매우 간단하지만 기본적인 개념입니다. 프로토콜은 코드 계약과 같습니다.

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

M1 칩을 실행하는 Mac이있는 경우 Mac App Store에 나열된 iOS / iPadOS 앱만 실행할 수 있습니다. 하지만 Mac App Store에 나열되지 않은 iOS / iPadOS 앱은 어떻습니까? 공식적으로는 할 수 없습니다.

더 접근하기 쉬운 오디오 플레이어

실명 및 시각 장애가있는 사람들을위한 공감력으로 구축하는 법 배우기

더 접근하기 쉬운 오디오 플레이어

작성자 : Francis Mariano, iOS 엔지니어 Headspace의 대담한 사명 선언문 인 세상의 건강과 행복을 개선합니다. 우리가 그곳에 사는 사람들의 다양한 경험을 인식하게 만드는 것.

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

이번에는 SwiftUI를 사용하여 원 안에 텍스트 레이블을 표시하는 몇 가지 방법을 살펴 보겠습니다. ZStack보기를 사용하여 세 가지 다른 방법을 자세히 살펴 보겠습니다.