我刚刚进入iOS编程,并且正在努力解决很多问题。
我正在尝试实现一小段代码来获取当前位置并在后台将其发送到服务器。
当我拨打beginBackgroundTaskWithExpirationHandler
时,我发现backgroundTimeRemaining
属性返回的数字太大了。查看代码下方的日志。
if (self.backgroundTask == UIBackgroundTaskInvalid) {
NSLog(@"***** startBackground work");
UIApplication *app = [UIApplication sharedApplication];
self.backgroundTask = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Background handler called. Not running background tasks anymore.");
[app endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}];
DebugLog(@"====>backgroundTimeRemaining:%.1f seconds", app.backgroundTimeRemaining);
if (timer == nil) {
timer = [NSTimer scheduledTimerWithTimeInterval:10 * 60
target:self
selector: @selector(timerFired:)
userInfo:nil
repeats:YES];
}
}
日志:
2013-11-29 09:23:14.852 JeeneeLocatorService[1666:70b] <JLSViewController.m:(317)> ====>backgroundTimeRemaining:179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 seconds
它看起来不正常,我从iOS开发者库网站上读取iOS即使我打电话也允许大约10分钟
beginBackgroundTaskWithExpirationHandler
做长时间的后台任务。
我正在使用XCode5中的iOS7模拟器进行测试。我是否可以将大量时间用于后台工作。非常感谢您的回答。
编辑: 得到答案后,我将剩余时间显示代码移动到timerFired:方法。
- (void)timerFired:(NSTimer *)timer {
DebugLog(@"***** Timer fired *****");
UIApplication *app = [UIApplication sharedApplication];
DebugLog(@"====>backgroundTimeRemaining:%.1f seconds", app.backgroundTimeRemaining);
}
但是,每当调用timerFired:方法时,它仍会给我相同的时间。这不适用于模拟器吗?
答案 0 :(得分:8)
作为ios编码的新手,有一点提示: 按住ALT并单击backgroundTimeRemaining。它告诉你,它返回一个双精度的NSTimeInterval,所以使用%f不是问题。
如果你点击弹出窗口的底部蓝色链接,它将打开文档,你会看到如果应用程序实际上不在后台,这个数字会非常大。
所以我猜这是你的问题,当打印NSLog时你的应用程序就在前台。