2013-10-04 2 views
18

새로운 iOS7 API (NSURLSession)로 백그라운드 다운로드에 대한 Apple 설명서를 읽은 후 조금 실망했습니다. 나는 ... 애플이 어떤 배경에서 네트워크 가용성을 통해 일시 정지/다시 시작을 관리 (또는 그렇게 할 수있는 옵션을 제공합니다)하지만 것을 확신했다NSURLSession 백그라운드 다운로드 - 네트워크 오류 재개

그래서 문서를 읽고, 이것은 우리가 가지고 무엇을 :

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).

은 지금까지 나는 해결책을 이해하지만, 내 질문은 : 네트워크의 손실을 처리하고 백그라운드에서 다운로드를 재개하는 가장 좋은 무엇 아키텍처?

내 입장에서는 네트워크를 사용할 수있을 때마다 모든 작업 (작성시 NSArray를 통해 참조 됨)을 재개하고 네트워크가 손실되면 일시 중단합니다. 이 전경에서 잘 작동하지만 배경에 대해 나는 다음과 같은 점에서 도움이 필요합니다 내 모든 작업을 연결하지 않고 백그라운드로 이동하면 내 애플, 전경에는 연결이없는 경우

  • 중단 남아 있고하지 않습니다를 네트워크가 사용 가능한 경우 다시 방문하십시오 ...

  • 백그라운드에서 네트워크가 손실되면 모든 다운로드/작업이 중지됩니다. 시나리오 : 전경

    • , 내 작업을 다운로드를 시작는
    • 나는 배경과 10 초 후 이동은 "aireplan 모드"
    • 에 내 모든 작업에 오류가있어 전환합니다. 따라서 URLSession 메서드에서 : done : doneCompleteWithError : downloadTaskWithResumeData를 사용하여 다시 시작하거나 (일부는 충분한 이력서 데이터를 가지고 있지 않기 때문에) 다시 시작할 수없는 경우를 제외하고는 새 작업을 만들고 있습니다. 그 시간에).
    • 그때 나는 백그라운드에서 여전히 해요 등의 네트워크가 다시 응용 프로그램을 실행하지 않고있을 때 나는이 점을 해결하려면 어떻게 내가 ...

을에 "이력서"를 실행할 수 없습니다까지

  • 무선 랜을 넣어 ? 내가 놓친 게 있니? 내가 백그라운드에서 여전히 해요으로

  • +0

    실망감을 공유합니다. 당신은 당신이 애플에 대한 답변을 기다리고 있다고 언급합니다. 그들로부터 들었습니까? 결의안은 무엇입니까? – gavdotnet

    +0

    애플과의 교류가 많았지 만 생산적이지는 않았으므로,이 사건을 처리해야하는 임의의 깃발을 사용하는 것이 좋습니다. 이 모드는 내 목표가 아니었지만 이것에 집중하지는 않았지만 테스트가 성공적이지 않았습니다. 이 부분에 대해 테스트 해 본다면 정보를 얻는 것이 여전히 흥미로울 것입니다. – Gros

    답변

    3

    내가 네트워크가 다시 응용 프로그램을 실행하지 않고있을 때 ...는 "이력서"를 실행할 수 없습니다

    앱을 가져 오기에 의해 시작되어 당신이 "배경 가져 오기"를 사용할 수 있습니다

    , 그러면 네트워크를 확인하고 다운로드 작업을 재개 할 수 있습니다.

    +0

    해결 방법 일 수 있습니다 ... 지금 Apple의 답변을 기다리고 있습니다. – Gros

    +0

    @Gros Apple에 대한 답변을 얻었습니까? 나는 같은 문제가있다. – Keith

    +0

    이것에 관한 단어는 없습니까? – Siriss

    2

    백그라운드 구성으로 NSURLSession을 만들어야합니다. 그런 다음 작업이 백그라운드 악마에게 보내지고 작업이 완료되면 앱이 호출됩니다.

    2

    구현 : 응용 프로그램의 위임에

    application:handleEventsForBackgroundURLSession:completionHandler: 
    

    일 - completionHandler를 호출하지 않고 - 일시 중단 된 동안 장치의 연결이 끊어 후 앱이 백그라운드에서 놀아됩니다.그렇게하면 앱은 네트워크 연결이 다시 가능 해지면 도달 가능성 알림을 수신하고 다운로드를 다시 시작할 수 있습니다. 그러나 이것은 꽤 위험한 접근이며 Apple의 앱 스토어 제출 지침을 통과하지 못할 수 있습니다. 또한이 방법은 앱이 포 그라운드에있는 동안 연결이 끊어 지거나 앱이 일시 중지 된 상태에서 연결이 복구 될 때 많은 도움이되지 않습니다. 백그라운드에서 내 다운로드를 일시 중지 application:handleEventsForBackgroundURLSession:completionHandler: 통지의

    • 만들어 사용 : 결국

      나는 다음을했다.
    • 연결 상태를 확인하고 일시 중지 된 다운로드를 다시 시작하기 위해 간헐 백그라운드 페치 알림 (예 : application:performFetchWithCompletionHandler:completionHandler)을 사용했습니다.

    여전히 최적의 다운로드 성능을 제공하지 못하며 사용자가 응용 프로그램을 다시 열면 "배경 다운로드"가 왜 완료되지 않았는지 궁금해 할 수 있습니다. 우리가 지금 당장은 애플로부터 기대할 수있는 가장 좋은 것입니다.

    +0

    내가 할 수있는 한, 앱에 전달 된 완료 핸들러를 호출하는 데 일정한 시간 (약 30 초)이 주어진다는 것을 알 수 있습니다. 그러면 실행하지 않으면 워치 독에 의해 죽을 것입니다. Xcode를 통해 시작된 디버깅 즉, 일부 개발자는 완성 처리기를 무시한다고 생각하게 만들 수 있습니다. 그렇지 않은 경우 유효한 해결 방법입니다. –

    +0

    @oscahie 그건 말이 되겠지만, 이건 내 iPad 4 세대에서 테스트했을 때 목격 한 것이 아니 었습니다. 앱이 백그라운드에서 무기한으로 남아있는 것처럼 보였고 네트워크 도달 가능성 알림에 응답했습니다. – gavdotnet

    관련 문제