2014-06-12 3 views

답변

3

가능성에 대한 설명은 iOS App Programming Guide: App States and Multitasking백그라운드 실행 및 멀티 태스킹 섹션을 참조하십시오. 예를 들어 몇 가지 유한 길이 작업을 완료하려면 몇 분 동안 백그라운드에서 앱을 실행 상태로 유지할 수 있습니다. 에 가청 콘텐츠를 재생할

  • 앱 : 또는 당신은 (상기 문서에서 인용) 기능의 아주 특별한 목록 중 하나를 수행 않다면 오랜 기간 동안 백그라운드에서 응용 프로그램을 계속 실행할 수 음악 플레이어 앱과 같이 백그라운드에서 사용자가있는 경우
  • 백그라운드에서 오디오 콘텐츠를 녹음하는 앱. 이러한 탐색 응용 프로그램으로, 항상 자신의 위치에 대한 정보를 새로운 콘텐츠를 정기적으로
  • 앱을 다운로드하고 처리 할 필요가 인터넷 프로토콜 (VoIP)를
  • 앱을 통해 음성을 지원
  • 앱 사용자를 유지

이러한 서비스를 구현하는 앱은 지원하는 서비스를 선언하고 시스템 프레임 워크를 사용하여 해당 서비스의 관련 측면을 구현해야합니다. 서비스를 선언하면 시스템에서 사용하는 서비스를 알 수 있지만 어떤 경우에는 실제로 응용 프로그램이 일시 중단되는 것을 막는 시스템 프레임 워크입니다.

하지만 iOS 배터리/전원 관리의 기본 설계 원칙은 임의의 앱이 백그라운드에서 계속 실행될 수 없다는 것입니다. 가능한 정확하게 무엇을하려고하는지 (즉, 정확히 executeEveryOneMinute 방법을 사용하여) 무엇을 공유하는지, 가능한 경우 원하는 효과를 얻는 방법에 대한 조언을 제공 할 수 있습니다.


당신은 업로드를하려는 경우는 아이폰 OS 7과 이상, 당신은 배경 세션 구성 NSURLSession을 사용하는 것이 좋습니다, 백그라운드에서 계속 ([NSURLSessionConfiguration backgroundSessionConfiguration:identifier], 아이폰 OS 8 유사한 방법이있다). 앱이 포 그라운드를 벗어난 후에뿐만 아니라 앱이 종료 된 후에도 (예 : 메모리 부족 또는 충돌로 인해) 업로드를 시도 (자동으로 사용자의 개입없이 자동으로 시도)합니다.AFNetworking은 NSURLSession 기반의 클래스 인 AFURLSessionManager을 제공합니다 (비록 NSOperation 기반이 아니지만). 이렇게하면 배경 업로드를 즐길 수 있지만, 특히 60 초마다 다시 시도하는 것보다 배터리의 영향이 훨씬 적은 백그라운드 작업에 관한 Apple의 가이드 라인을 준수합니다.

WWDC 2013 비디오 What’s New in Foundation Networking의 후반 부분을 참조하십시오.이 과정은이 과정을 보여줍니다 (다운로드를하고 있지만 아이디어는 업로드와 동일합니다).

+0

여기 내가하려는 일. 로컬 db (전화)에 일부 데이터가 있으며이를 서버로 보내야합니다. AFNetworking을 사용하여 서버에 데이터를 전달합니다. 사용자가 처음으로 데이터를 업로드하려고 시도했지만 FAILS (예를 들어 인터넷이 없거나 서버가 다운 된 경우) 나는 로컬 db에 저장하고 서버가 성공할 때까지 몇 분마다 서버에 보내야합니다. 이렇게하기위한 더 좋은 방법이 있는지 나는 모른다. – 1110

+0

@ 1110 iOS7은 배경 업로드 기능을 제공합니다. AFNetworking은 또한'NSURLSession' 기반 클래스 인 ['AFURLSessionManager'] (http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPSessionManager.html)를 제공합니다. 내 대답 부록을 참조하십시오. – Rob

0

타이머는 주 스레드에서 작동합니다. 응용 프로그램이 백그라운드로 들어가면 타이머가 유효하지 않게됩니다. 따라서 응용 프로그램이 백그라운드로 들어가면 같은 작업을 수행 할 수 없습니다.

+0

내가 모두 전경/배경에서이 작업을 위해 무엇을 할 수 있는가? – 1110

+0

오디오, 비디오, 위치 등과 같은 백그라운드 모드를 활성화해야합니다. – Apurv

+0

오디오 및 위치를 이미 사용할 수 있습니다. – 1110

0

백그라운드에서 무효화되므로 타이머를 사용하여이를 수행 할 수 없습니다. 확인하려면 this을 시도하십시오.

+0

내가 할 수있는 것을 보여 줄 수 있니? – 1110

+0

@ 1110 시도해 볼 수 있습니다. http://www.raywenderlich.com/29948/backgrounding-for-ios – Rushi

0

당신은 당신이 원하는 것을 달성하기 위해 백그라운드 작업을 사용해야합니다

UIApplication* app = [UIApplication sharedApplication]; 
task = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    }]; 
// Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task. 
     NSLog(@"Started background task timeremaining = %f", [app backgroundTimeRemaining]); 
     if (connectedToNetwork) { 
      // do work son... 
     } 

     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    });