我正在编写一个代码来不断跟踪应用CoreLocation
的用户。由于我无法始终保持GPS,因此我在AppDelegate
中使用StartMonitoringSignificantLocationChange
来检测到重大变化。我在UIBackgroundMode
中注册了location
。 in didUpdateLocations
方法,我检查从以前记录的位置的当前距离。如果它很重要,我申请StopMonitoringSignificantLocationChange
和StartUpdatingLocation
以获得准确的位置。同时我启动计时器(30秒)以查看用户是静止还是移动。如果用户不再移动,我再次应用StopUpdatingLocation
和StartMonitoringSignificantLocationChange
。 我也以我的AppDelegate: -(void)applicationWillResignActive:(UIApplication *)application
定义的后台任务如下:在iOS 7后台模式下高效跟踪用户的问题
- (void)applicationWillResignActive:(UIApplication *)application
{
if (![[GeoSampleManager sharedManager] isLiveTracking])
{
GeoSampleManager *manager = [HTSGeoSampleManager sharedManager];
[manager.locationManager stopMonitoringSignificantLocationChanges];
self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
[manager.locationManager startMonitoringSignificantLocationChanges];
}
}
我关闭后台任务时,应用程序eneters前景:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}
}
这里是我的didUpdateLocations
方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
CLLocation* newLocation = [locations lastObject];
if(self.isLiveTracking)
{
//Test that the horizontal accuracy does not indicate an invalid measurement
if (newLocation.horizontalAccuracy < 0 || newLocation.horizontalAccuracy > 200)
{
return;
}
if([self.lastLocation distanceFromLocation:newLocation] > 0)
{
//Create and save a GeoSample
[GeoSampleManager createSampleForLocation:newLocation onTrip:self.activeTrip];
self.lastLocation = newLocation;
}
}
else
{
if([self.lastLocation distanceFromLocation:newLocation] > 0)
{
[self.locationManager stopMonitoringSignificantLocationChanges];
self.idleChecker = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(checkIdle:) userInfo:nil repeats:YES];
[self.locationManager startUpdatingLocation];
self.isLiveTracking = YES;
}
}
}
最后这里是定时器方法:
- (void)checkIdle:(NSTimer*)timer
{
if(abs([self.lastLocation.timestamp timeIntervalSinceNow]) >= 30.0)
{
//Stopping the idle-time checking timer
[self.idleChecker invalidate];
self.idleChecker = nil;
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
self.isLiveTracking = NO;
}
}
但是,该应用程序被暂停(有时在5-10秒后,有时在10分钟后),并停止接收位置更新。由于我在这个问题上挣扎了一个多月,而且我尝试了几乎所有可能的解决方案,我非常感谢你能以任何方式帮助我解决问题。
干杯
你曾经从应用程序切换器中删除应用程序吗? – sangony
不,它只是在锁定屏幕时发送到背景。 – Behrang
看看以前的帖子。它可能会给你一个想法(看所有的答案)。 http://stackoverflow.com/questions/18946881/background-location-services-not-working-in-ios-7 – sangony