我一直面临一个问题,即我的应用程序运行后台超过10分钟,我已经实现了后台任务,可以立即获取通知。
我的申请后台任务在10分钟后停止,我已经审阅了this和this的解决方案,但它似乎没有帮助
我的代码如下
-(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
}
提前致谢
答案 0 :(得分:3)
这很正常。你不应该在后台运行计时器。在iOS7及更高版本中,您应该使用后台获取模式来获取数据(或使用推送正确地执行此操作)。
阅读here以获取有关iOS7背景模式的更多信息。
请注意,在iOS7及更高版本上,后台任务甚至更短(约30秒)而不是10分钟,因此您甚至不太鼓励将此API用于此类工作。
答案 1 :(得分:1)
如果我没有弄错或没有误解你的问题,这是预期的行为。后台任务是有时间限制的,因此一个应用程序无法无限期运行并消耗电池电量和蜂窝数据等资源。
有不同类型的背景模式,有些执行设置任务,在完成或超时时暂停,其他模式定期运行。
您可能希望实施后台获取,其中操作系统会定期唤醒您的应用并允许其检查新内容并执行快速数据获取以从您的服务器获取最新数据。
后台提取可以通过具有"内容可用"的推送通知来触发。标志在其有效载荷中设置。操作系统将有选择地为应用程序安排后台提取,并且通常会将它们合并在一起以提高效率。操作系统还将了解用户何时运行您的应用并尝试在用户打开您的应用之前安排后台提取,以便获得最新数据。
答案 2 :(得分:0)
您应该使用Push Notifications代替每5分钟取一次。它会在运行中工作,不会耗尽电池。