2013-03-11 64 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

相关问题