2013-03-11 3 views
0

Я хотел бы знать, есть ли способ сохранить приложение на переднем плане в течение определенного интервала времени.Храните приложение iOS на переднем плане

У меня есть поток, выполняющийся ровно в течение 3 минут, и мне нужно, чтобы пользователь не мог покинуть приложение. Если такое невозможно, я задам еще один вопрос.

Я могу позволить пользователю установить приложение в фоновом режиме, потому что я использую метод applicationDidEnterBackground:(UIApplication *)application для сохранения необходимых мне данных, но если пользователь нажимает кнопку питания, как я могу сохранить данные?

applicationWillTerminate:(UIApplication *)application будет называться? Есть ли решение?

+0

Во-первых, вы не можете заставить приложение находиться на переднем плане. – viral

+0

вы можете сохранить данные в пользовательских настройках по умолчанию, пока данные не будут сохранены, и после этого очистите пользовательские значения по умолчанию. – channi

+0

. Это больше, чем сохранение данных в пользовательских по умолчанию, я сохраняю данные в plist, я также использую Coredata, что мне нужна точка, чтобы сохранить всю эту информацию, если пользователь пытается отключить устройство. – user1708257

ответ

2

Возможно, вы захотите заглянуть в beginBackgroundTaskWithExpirationHandler, что позволяет вашему приложению запрашивать дополнительное время обработки для выполнения задач, когда ваше приложение основано.

Это то, что вы хотите сделать, нецелесообразно. Вы должны убедиться, что ваше приложение сможет восстановиться с вашей трехминутной задачи в случае неожиданного завершения или сбоя. Например, ваше приложение может неожиданно аварийно завершить работу или завершить работу из-за низкой памяти - в этих случаях вы не получите никаких обратных вызовов до applicationWillTerminate или applicationDidEnterBackground.

Поэтому моя рекомендация будет заключаться в использовании поддержки фоновых задач iOS, чтобы сохранить ваше сохранение в фоновом режиме, если пользователь покидает приложение, но также гарантирует, что в случае, если ваше приложение будет завершено системой без предупреждения о вашей задаче восстанавливается/может безопасно перематываться.

+0

Я понял, что в случае неожиданной ошибки я мог бы справиться с ней с помощью didReceiveMemoryWarning, но, как я читаю, приложение может потерпеть крах, не получив предупреждения? – user1708257

+0

'didReceiveMemoryWarning' вызывается только для предупреждений о памяти, а не для других типов сбоев: также возможно, что у вас может не хватить времени в ответ на предупреждение памяти для решения проблем, особенно если что-то пытается сделать огромное выделение. В основном, ваше приложение должно иметь возможность обрабатывать завершение без предупреждения. – lxt

+0

спасибо за объяснение! – user1708257

0

Чтобы обработать ваш процесс, вам необходимо использовать beginBackgroundTaskWithExpirationHandler. используйте этот код.

Здесь я вызывал этот метод из приложения ApplicationDidEnterBackground: (UIApplication *) для хранения данных в SQlite, даже если приложение вводит фон или UIApplicationStateInactive (нажмите кнопку питания). Процесс сохранения продолжится в течение 10 минут в соответствии со стандартом IOS, если application.backgroundTimeRemaining достигнет 0. Я отправлю одно локальное уведомление, чтобы вывести приложение на передний план, чтобы поддерживать мой процесс. используйте этот код и настройте свой процесс.

-(void)handleBackgroundSavingingProcess:(UIApplication *)application 
    { 
     NSLog(@"background task remaining time before background %f",application.backgroundTimeRemaining); 

     if ((([application applicationState] == UIApplicationStateBackground) || ([application applicationState] == UIApplicationStateInactive)) && [application respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) 
    { 


    self.bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{ 
    // Synchronize the cleanup call on the main thread in case 
    // the task actually finishes at around the same time. 
       NSLog(@"background task remaining time in expiration handler %f",application.backgroundTimeRemaining); 

       dispatch_queue_t concurrentQueue; 
       if([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) 
        concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 
       else 
        concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0UL); 

       if (concurrentQueue == nil) 
        return; 

       dispatch_async(concurrentQueue, ^{ 

        if (self.bgTaskId != UIBackgroundTaskInvalid){ 
         NSLog(@"background task remaining time in dispatch queue %f",application.backgroundTimeRemaining); 
         NSLog(@" Downloading status %d",self.isDownloadingInComplete); 
         if(self.isDownloadingInComplete) 
         { 
          [application presentLocalNotificationNow:localNotification]; 
          NSLog(@"Local notification fired."); 
         } 
         [DataManager managedObjectContext] save:nil]; 
         [application endBackgroundTask:self.bgTaskId]; 
         self.bgTaskId = UIBackgroundTaskInvalid; 
         NSLog(@"Initialization invalid."); 
        } 
       }); 
      }]; 
     } 

    } 
+0

спасибо большое! Было полезно – user1708257

+0

@Ganapathy, будет ли этот метод поддерживать мое приложение в фоновом режиме ...? –

+1

Ваше приложение будет в фоновом режиме до 10 минут по умолчанию. что этот метод будет делать, через 10 минут он покажет одно предупреждение о том, что ваша задача работает в фоновом режиме в течение 10 минут (настройте содержимое). После получения предупреждения вам нужно вернуть приложение на передний план. – Ganapathy

Смежные вопросы