2015-01-02 1 views
0

응용 프로그램이 종료 될 때 전경에서 시작된 비동기 NSURLConnection을 계속하는 방법을 알고 싶습니다. 현재 앱이 백그라운드에서 실행될 때 NSURLConnection을 시작합니다. 사용자가 연결보다 느린 한 앱을 종료하고 싶을 때 제대로 작동합니다. 그러나 사용자가 더 빠르면 연결을 설정할 수 없습니다. 다음은 내 코드입니다 :응용 프로그램이 종료 된 후 NSURLConnection을 계속하십시오.

// AppDelegate.m 
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    AnObject *newObject = [[AnObject alloc] init]; 
    [newObject InactiveApp]; 
} 

// AnObject.m 
- (void)InactiveApp 
{ 
    self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 

    // setting up the NSURLRequest 
    // [...] 

    dispatch_async(dispatch_get_main_queue(),^
    { 
     [NSURLConnection connectionWithRequest:request delegate:self]; 
    }); 
} 
// delegate functions, endBackgroundTask-closing, etc. is following 

불행하게도이 작동하지 않으며 나는 누군가가 문제를 해결하는 또 다른 방법을 알고 있는지 알고 싶습니다. Snapchat이나 WhatsApp과 같은 방법이 있어야합니다. 왜냐하면 여러분이 메시지를 작성하고 send를 누른 직후 앱을 종료하면 메시지가 전달되기 때문입니다.

내가 상상할 수있는 유일한 방법은 배경 가져 오기를 사용하는 것입니다. 그러나 앱이 백그라운드로 전송 될 때 하나의 연결 만 만들고 싶다는 사실 때문에 이것이 최선의 해결책이 아니라고 생각합니다.

+0

백그라운드 구성으로 NSURLSession을 사용하십시오. – Andy

+0

NSURLSession에서 클래스 참조를 읽고 _download sessions_를 사용하여 NSURLSession을 시도 할 것입니다. 감사합니다! – user3191334

답변

1

저는 Andy와 동의합니다. NSURLSession과 배경 NSURLSessionConfiguration을 추구해야합니다. App Programming Guide for iOS: Background Execution의 배경 섹션에서 콘텐츠 다운로드를 참조하십시오.

그런데 질문에 대한 아이디어는 잘 작동합니다 (특히, 7.0 이전의 iOS 버전에 대해서는 NSURLSession 및 배경 세션을 사용할 수없는 경우). 당신의 코드에 대해 두 관찰 :

  1. 당신이 그것을 쓴 방법, 나타납니다 당신의 AnObject이 범위를 벗어나게하고 대리자를 호출하려고 할 때 앱이 때문에 실패 할 경우 조기에 해제된다 행동 양식. AnObject에 대한 강력한 참조를 유지하십시오.

  2. 다운로드가 완료되면 endBackgroundTask (으) 로의 전화를 잊지 마세요. 마찬가지로 (그리고보다 미묘하게) 타임 아웃 처리기는 백그라운드 작업도 끝내야합니다. 전술 한 App Programming Guide유한 길이 작업 실행 섹션을 참조하십시오.

그런데 앱이 종료 된 후에도 계속 요청을 언급합니다. 사용자가 앱을 수동으로 종료하면 질문에 고려 된 백그라운드 작업과 배경 NSURLSession 작업 모두가 종료됩니다. 이것들은 앱이 포 그라운드에서 벗어나면 사용자가 수동으로 앱을 종료하는 것이 아니라 계속되는 작업을 정상적으로 처리하기위한 것입니다. NSURLSession 접근 방식은 메모리 압력으로 인한 종단 처리를 정상적으로 처리하지만 수동 종단은 처리하지 않습니다.

+0

아하, 자세한 답변을 해주셔서 감사합니다 Rob! 그것은 NSURLSession 클래스와 함께 잘 작동합니다! – user3191334