【发布时间】:2018-01-03 08:44:08
【问题描述】:
我在应用程序中有一个计时器。要重现此问题,用户应启动此计时器,然后将应用程序置于后台或关闭屏幕。该应用程序最多可以运行 5 分钟,然后被系统杀死。用户重新打开屏幕后,他们可以看到主屏幕。如果再次启动应用程序,它会从头开始,而不是从用户关闭屏幕之前的位置开始。
我尝试在我的 AppDelegate 中使用以下解决方案来解决此问题:
- (void)methodToRepeatEveryOneSecond
{
if (self.flag) {
dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, q_background, ^(void){
[self methodToRepeatEveryOneSecond];
});
}
}
-(void)applicationDidEnterBackground:(UIApplication *)application{
NSUserDefaults* def = [[NSUserDefaults alloc] init];
if ( [[def valueForKey:@"status" ] boolValue]) {
self.flag = true;
dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(q_background, ^{
[self methodToRepeatEveryOneSecond];
});
}
}
-(void)applicationWillEnterForeground:(UIApplication *)application{
self.flag = false;
}
但应用在后台运行约 5 分钟后仍会停止运行。
当我在 USB 电缆应用程序的帮助下测试此解决方案时,它确实在后台工作长达 30 分钟,但在后台工作大约 4 分钟后,我可以在控制台中看到以下日志(这里是一部分):
2017-07-26 17:43:14.496379+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16df86530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
2017-07-26 17:43:14.496493+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16e1b6530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
2017-07-26 17:43:14.496790+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16e012530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
2017-07-26 17:43:14.497065+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16df86530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
2017-07-26 17:43:14.497188+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16e242530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
2017-07-26 17:43:14.497476+0300 MusicMonitor[486:339431] Can't endBackgroundTask: no background task exists with identifier 16e242530, or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
但是,如果在从 testflight 下载的帮助下测试相同的构建,我会遇到上面写的问题(显示主屏幕)。
我还尝试在我的 Info.plist 文件中的 UIBackgroundModes 键中使用对位置的支持,它工作正常,但由于 «Guideline 2.5.4» 的问题而拒绝了 beta 应用审核。
请给我建议,我可以用什么来解决这个问题
【问题讨论】:
-
您的应用的目的是什么,您使用了哪种后台模式?
-
@mag_zbc 应用程序适用于音乐家。他们在计时器下排练。所以我需要它一直工作,除非他们将其关闭(即使屏幕关闭或应用程序处于后台)背景模式:后台获取。我也尝试过使用地理位置,为此我使用了位置更新后台模式
标签: ios objective-c iphone background kill-process