2013-03-11 88 views
0

我想知道是否有方法讓應用程序在特定間隔時間內在前臺運行。保持iOS應用程序在前臺運行

我有一個線程正好在3分鐘內運行,我需要用戶不能離開應用程序。如果這樣的事情是不可能的,我會問另一個問題。

我可以讓用戶在後臺模式下設置應用程序,因爲我使用applicationDidEnterBackground:(UIApplication *)application方法來保存我需要的數據,但如果用戶單擊電源按鈕,我怎麼能保存數據?

applicationWillTerminate:(UIApplication *)application會被稱爲?有沒有解決方法?

+0

首先,你不能強迫你的應用程序在前臺。 – viral 2013-03-11 09:34:42

+0

您可以將數據保存在用戶默認值中,直到數據未保存,然後清除用戶默認值 – channi 2013-03-11 09:40:59

+0

這不僅僅是將數據保存在用戶默認值中,我將數據保存爲plist,我也使用Coredata,事情是如果用戶試圖關閉設備,我需要一個點來保存所有這些信息。 – user1708257 2013-03-11 09:45:51

回答

2

您可能想要查看beginBackgroundTaskWithExpirationHandler,它可以讓您的應用在您的應用停用時請求額外的處理時間來完成任務。

也就是說,你所要做的不是可取的。你應該確保你的應用程序可以從你的三分鐘任務中恢復,以防意外終止或失敗。例如,您的應用程序可能會意外崩潰或由於內存不足而終止 - 在這種情況下,您將不會收到applicationWillTerminateapplicationDidEnterBackground的任何回調。

所以我的建議是看看如果用戶離開應用程序時使用iOS的後臺任務支持讓您的保存在後臺繼續,但也確保在系統終止您的應用程序而不會警告您的任務是可恢復的/可以安全地重繞。

+0

我已經瞭解到,如果出現意外錯誤,我可以使用didReceiveMemoryWarning處理它,但是當我在閱讀時,應用程序可能會在未收到警告的情況下崩潰? – user1708257 2013-03-11 10:23:26

+0

'didReceiveMemoryWarning'只要求內存警告,而不是其他類型的崩潰:這也有可能是你可能沒有響應內存警告足夠的時間來解決的事情,特別是如果事情是試圖使一個巨大的分配。基本上,您的應用程序應該能夠處理終止而無需警告。 – lxt 2013-03-11 11:01:44

+0

感謝您的解釋! – user1708257 2013-03-11 12:50:11

0

您需要使用beginBackgroundTaskWithExpirationHandler來處理您的進程。使用此代碼。

在這裏,我呼籲來自applicationDidEnterBackground此方法:(UIApplication的*)應用程序存儲SQLite中,即使該應用程序進入後臺或UIApplicationStateInactive(按下電源按鈕)的數據。如果application.backgroundTimeRemaining變爲0,保存過程將持續10分鐘,根據IOS標準。我將發佈一個本地通知,將我的應用程序啓動到前臺以保持我的進程活着。使用此代碼並自定義您的過程。

-(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 2013-03-11 12:53:30

+0

@Ganapathy,這個方法能讓我的應用在後臺保持活躍嗎? – 2013-11-30 10:14:01

+1

默認情況下,您的應用將在後臺最多10分鐘。這個方法會做的是在10分鐘後它會顯示一個提示,說明你的任務在後臺運行了10分鐘(自定義內容)。收到警報後,您需要將應用程序恢復到前臺。 – Ganapathy 2013-11-30 10:20:34

相關問題