전경

5

이 코드를 사용하여 배경 세션을 생성하고 회복 속도가 느린 배경 NSURLSessionDownloadTask 포장 마차, ...전경

let configuration = URLSessionConfiguration.background(withIdentifier: UUID().uuidString) 
    configuration.sessionSendsLaunchEvents = true 
    configuration.isDiscretionary = false 
    self.session = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

... 및 다운로드 작업 :

let downloadTask = self.session.downloadTask(with: request as URLRequest)   
    downloadTask.resume() 

내 요청 객체는 다음과 같습니다 :

let request = NSMutableURLRequest(url: someURL) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    do { 
     try request.httpBody = JSONSerialization.data(withJSONObject: someDictionary, options: JSONSerialization.WritingOptions()) 
    } catch let error as NSError { 
     // logging calls 
    } 

다운로드중인 리소스는 ~ 20MB zip 파일입니다.

아무런 문제없이 포 그라운드에서 4 회의 동시 다운로드를 실행할 수 있습니다. 모든 예상 된 대리자 메서드가 호출되고 전송 속도가 정상 속도로 완료됩니다.

내가보기에 문제는 전방에서 다운로드를 시작한 다음 홈 버튼을 누르면 다운로드가 중단된다는 것입니다. 장치를 깨우기 위해 노력하고 네트워크가 한 시간 동안 회전하고 전송이 백그라운드에서 완료되지 않습니다. 또한 앱을 포 그라운드로 가져 오면 전송이 즉시 다시 시작되지 않습니다. 앱을 포 그라운드에서 약 4 분 동안 앉아있게하면 깨어나서 다시 작업하기 시작합니다. 그들은 앱이 백그라운드로 들어간 시점의 비율로 다시 시작하고 완료 될 때까지 정상 속도로 전송합니다. 언제든지 오류가 발생하지 않으며 전송이 궁극적으로 성공합니다. 백그라운드에서 멈추는 순간, 앱이 포 그라운드로 되돌아 올 때 다시 시작하는 속도가 매우 느립니다.

iOS 10을 실행하는 iPhone 6에서 테스트 중입니다. Xcode 또는 외부 전원에 연결되어 있지 않아 응용 프로그램이 차가워졌습니다. WiFi 및 셀룰러 연결을 통해 문제를 재현 할 수 있습니다. 앱을 삭제하고 여러 번 다시로드했습니다.

약 20 %의 시간이 걸리므로 문제가 발생했습니다. 일관되게 작동하거나 실패하게하는 특정 변수 세트를 찾지 못했습니다. 여러 다운로드가 발생하면 더 자주 발생하는 것으로 보이며,이 상황에서 모든 다운로드가 위에서 설명한 동작을 나타냅니다.

모든 안내가 크게 감사드립니다!

매트

+0

다른 세션 구성을 시도해 보셨습니까? 배경이 아닌 – iWheelBuy

답변

0

당신이 아이폰 OS의 버그 같은 소리를 설명하고, 그러나 나는 시도 할 몇 가지가 동작 :

  • 은 YES로 임의 설정하십시오. 이것은 배경 재발행의 속도를 제한합니다.
  • 실수로 기존 ID와 동일한 ID로 새 백그라운드 세션을 만들지 않았는지 확인하십시오 (이벤트 처리를 위해 방금 다시 실행 한 경우 및 완료 핸들러를 호출 한 후에 만 ​​수행).
  • 관련된 클래스의 하위 클래스 (특히 NSURL 또는 NSURLRequest)를 생성하지 않도록하십시오.
  • shouldUseExtendedBackgroundIdleMode를 YES로 설정하십시오.
  • UIBackgroundModes에서 배경 가져 오기 활성화를 추가해보십시오.

마지막 두 사람 모두 도움이되지 않으며 버그가 있으면 버그를 신고하십시오.

또한 IIRC는 앱이 백그라운드에서 너무 많이 다시 시작되면 처벌 될 수 있으므로 백그라운드 작업에서 짧은 요청이 쌓이면 앱을 사용하지 않아야합니다. 백그라운드에서 앱을 다시 시작하면 앱이 다운되는 경우 매우 나빠질 수 있습니다.

마지막으로 홈 화면으로 이동해야합니다. 앱을 강제 종료하면 (더블 탭, 스 와이프) 백그라운드 요청이 종료됩니다. 그리고 그것은 예상되는 행동입니다.

팁이 도움이되지 않는다면, bugreporter.apple.com에 버그 보고서를 보내주십시오. 설명하는 것은 예상 된 동작이 아니기 때문입니다.