2014-04-22 117 views
-4

我一直在面对一个问题,即我的应用程序不能运行超过10分钟的后台,我已经实现了后台任务,可立即获取通知。我的iPhone应用程序后台进程在10分钟后终止

我的应用程序的后台任务停止10分钟后,我已审阅的thisthis解决方案,但它似乎有帮助

我的代码如下

-(void)methodBGTask :(UIApplication *)application{ 

    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 
     if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
      //create new uiBackgroundTask 
      __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
       [application endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      }]; 
      //and create new timer with async call: 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       //run function methodRunAfterBackground 
       NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(methodGetNotificatioin) userInfo:nil repeats:YES]; 
       [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 
       [[NSRunLoop currentRunLoop] run]; 
      }); 
     } 
    } 
} 


-(void)methodGetNotificatioin{ 
    //retrieve notifications from service 
} 

在此先感谢

+3

这是预期的行为,有10分钟的限制,阅读文档! –

+0

我还没有downvoted,但我猜,因为它在文档中很清楚地表明后台任务是有时间限制的,并警告不要将它们用于此类工作。 –

+2

因为你没有做任何研究就问了一个问题,我就低估了。这在苹果文档中很清楚地解释(我自己读过) –

回答

3

这是正常的。你不应该在后台运行计时器。在iOS7及更高版本中,您应该使用后台获取模式获取数据(或使用推送方式正确执行)。

阅读here了解关于iOS7背景模式的更多信息。

请注意,在iOS7及更高版本中,后台任务甚至更短(约30秒)而非10分钟,因此您甚至不鼓励将此API用于此类工作。

+1

@ S.P没有解决方案。您可以实施推送,当用户点击推送通知时,应用程序可以打开并加载所有待处理数据。 –

1

如果我没有弄错或者没有误解你的问题,这是预期的行为。后台任务是有时间限制的,以便一个应用程序不会无限期地运行,并消耗电池电量和蜂窝数据等资源。

有不同类型的背景模式,其中一些执行设置的任务,并在完成或超时时挂起,其他时间周期性运行。

您可能希望实现后台获取,其中操作系统将定期唤醒您的应用并允许其检查新内容并执行快速数据获取以从服务器获取最新数据。

后台提取可以通过推送通知触发,该通知在其有效内容中设置了“content-available”标志。操作系统将有选择地调度应用程序的后台提取,并且通常会将它们合并在一起以提高效率。操作系统还会学习用户何时运行您的应用程序,并尝试在用户打开您的应用程序之前安排后台提取,以便获取最新数据。

0

您应该使用Push Notifications而不是每5分钟读取一次。它会在飞行中工作,不会耗尽电池。

相关问题