2014-12-05 3 views
2

사진 확장 기능을 통해 사진 앱에서 이미지를 업로드하려고합니다. NSURLSession을 사용하여 백그라운드에서 업로드합니다. 여기에 내가 사용하는 코드가있다.동작 확장 - 여러 NSURLSession

var configName = "com.myapp.uploadImage" 
var config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(configName) 
config.sharedContainerIdentifier = "group.myApp.sample" 

var session = NSURLSession(configuration: config) 
let task = session.dataTaskWithRequest(request) 
task.resume() 

self.extensionContext!.completeRequestReturningItems(self.extensionContext!.inputItems, completionHandler: nil) 

잘 작동합니다.

질문은 이미지를 업로드하고보기를 한 번 취소 한 다음 초기 프로세스가 백그라운드에서 실행 중일 때 두 번째 이미지를 업로드하려고 시도 할 때 초기 NSURLSession이 완료되지 않은 것입니다. 두 번째 프로세스 만 완료됩니다. 즉, 두 번째 세션은 첫 번째 세션을 극복합니다.

NSOperationQueue를 사용해 보았습니다. 그러나 액션 확장은 한 번 해고되고 두 번째 세션을 위해 다시 열립니다. 단지 새로운 NSOperationQueue를 생성하기 때문에 문제가 여전히 지속됩니다.

어떤 제안이 도움이 될 것입니다. 미리 감사드립니다.

답변

1

첫 번째 백그라운드 세션이 실행되는 동안 동일한 식별자로 두 번째 백그라운드 세션을 인스턴스화하지 않도록하십시오. 배경 세션을 저장하여 나중에 사용할 수 있습니다. URL Loading System Programming Guide: Using NSURLSession의 "배경 세션 고려 사항"으로

는 말한다 :

참고 : (당신이 구성 개체를 만들 때 지정) 식별자마다 정확히 하나의 세션을 작성해야합니다. 동일한 식별자를 공유하는 여러 세션의 동작은 정의되지 않습니다.

참고로이 문서에는 위임자를 지정하고 구현해야한다는 점도 유의해야합니다. (그렇지 않은 경우 실패에 대해 어떻게 알 수 있습니까?) 업로드 및 다운로드 수행 섹션에 제공된 예제는 App Extension Programming Guide에서 위임자를 지정합니다.

또한 메인 앱의 앱 대표자가 handleEventsForBackgroundURLSession 메소드를 구현 했습니까? completionHandler을 캡처하여 NSURLSessionDelegate 방법 URLSessionDidFinishEventsForBackgroundURLSession이 호출 될 때 호출해야합니다.

마지막으로 데이터 작업을 사용하고 있음을 알게되었습니다. NSURLSession 설명서는 백그라운드 세션에서 데이터 작업을 사용해서는 안되며 업로드/다운로드 작업 만 사용해서는 안된다는 점을 자세히 설명합니다. 나는 항상 당신이 didReceiveData 대리자 메서드를 사용하려고하지 않았다고 가정했지만 백그라운드 세션의 데이터 작업과 관련된 다른 문제가있는 경우 업로드 작업을 시도해 볼 수도 있습니다.

+0

다른 식별자를 사용해 보았습니다. 여전히 같은 문제입니다. –

+0

또한 대리자 메서드는 도움이되지 않습니다. Apple 지침에 따라 우리는 작업 확장을 기각하고 백그라운드에서 실행해야한다고 알려줍니다. 따라서 행동 연장이 기각 될 때, 대의원도 죽게됩니다. –

+0

응용 프로그램 내에서 오래 동안 nsurlsessions를 수행했습니다. 그리고 매번 잘 작동했습니다. 그러나 행동 연장에는 지침이 있으며 합리적인 것으로 보입니다. –