我有一个计时器,显示用户锻炼的NSTime。当我的应用程序进入后台模式时,位置管理器和该计时器停止更新。当我的应用处于后台模式时,如何让它们更新?
我有一个名为RunViewController的视图,它有一个启动按钮。当用户单击该按钮时,计时器和位置管理器将启动。代码是:
-(void)startRun{
timeSec = 0;
timeMin = 0;
timeHour = 0;
NSString* timeNow = [NSString stringWithFormat:@"%02d:%02d:%02d",timeHour , timeMin, timeSec];
//Display on your label
lblTime.text = timeNow;
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
self.locManager = [[CLLocationManager alloc] init];
locManager.delegate = self;
locManager.desiredAccuracy = kCLLocationAccuracyBest; //kCLLocationAccuracyBest
[locManager setDistanceFilter:3]; //kCLDistanceFilterNone
[locManager startUpdatingLocation];
locationManagerStartDate = [[NSDate date] retain];
}
In - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
只需在地图上从旧位置绘制一条线到新位置,然后将该位置保存在数组中。
提前致谢。
答案 0 :(得分:1)
在Apple Developer论坛的帮助下找到了实现此解决方案的解决方案。我做了以下事情:
指定位置背景模式
使用
UIApplication:beginBackgroundTaskWithExpirationHandler:如果n是
小于UIApplication:backgroundTimeRemaining它确实有效 很好,如果n较大,应启用位置管理器 (并禁用)在没有剩余时间之前再次避免 背景任务被杀死。这确实有效,因为位置是其中之一 三种允许的后台执行类型。
注意:通过在无法运行的模拟器中进行测试可以节省一些时间,在手机上正常工作。
Here是相同的参考。
答案 1 :(得分:0)
试试这个..
-(void)viewDidLoad
{
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
backgroundSupported = device.multitaskingSupported;
NSLog(backgroundSupported ? @"Yes" : @"No");
counterTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
//called after 10min of your app in background
NSLog(@"10 minutes finished.");
}];
theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(selectorForUpdatingLocation) userInfo:nil repeats:YES];
}