捕获用户位置:澄清

我有一个应用程序捕获用户的位置,并将这个信息发送到我的服务器。

我已经开始使用LocationManager服务:

- (CLLocationManager *)locationManager { if (_locationManager == nil) { _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; isUpdatingLocation = NO; } return _locationManager; } -(void) startLookingForLocation{ [self locationManager].desiredAccuracy = kCLLocationAccuracyBest; [self locationManager].distanceFilter = 250; if([[self locationManager]respondsToSelector:@selector(setPausesLocationUpdatesAutomatically:)]) [[self locationManager] setPausesLocationUpdatesAutomatically:YES]; if([[self locationManager]respondsToSelector:@selector(setActivityType:) ]) [[self locationManager] setActivityType:CLActivityTypeFitness]; [[self locationManager] startUpdatingLocation]; [[self locationManager] startUpdatingHeading]; isUpdatingLocation = YES; } 

并停止它:

 -(void) stopLookingForLocation{ [[self locationManager] stopUpdatingLocation]; [[self locationManager] stopUpdatingHeading]; isUpdatingLocation = NO; } 

所以,当我检测到用户位置的变化时:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [self setCurrentLocation:newLocation]; BOOL isInBackground = NO; if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { isInBackground = YES; } if (isInBackground) { UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; // Send user-location to my server if (bgTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } } else { // Send user-location to my server } } 

和所有正常工作。 (我想)。

当应用程序进入后台模式,我调用appDelegate这个方法 – (void)applicationDidEnterBackground:(UIApplication *)application {[locationManager startMonitoringSignificantLocationChanges]; }

当应用程序返回到前台:

 - (void)applicationDidBecomeActive:(UIApplication *)application { [locationManager stopMonitoringSignificantLocationChanges]; } 

但是我有些怀疑。 这样,如果应用程序处于closures状态,我的应用程序会继续将位置传递给服务器?

只有当我处于后台或前台状态时,我如何才能发送位置信息?

编辑:我也设置了:

UIBackgroundModes位置

没有必要这样的代码,这将激活你的应用程序在后台很短的时间,你不得不提到在项目的info.plist所需的背景模式,值应该是应用程序注册的位置更新。

只有在info.plist中设置UIBackgroundModes的位置,它在后台工作,这可能会帮助你。

 //In app deligate #pragma mark - #pragma mark GPS Service //========== start GPS SERVICE =========== -(void)startGpsService { locationManager=[[CLLocationManager alloc] init]; locationManager.delegate=self; locationManager.desiredAccuracy=kCLLocationAccuracyBest; locationManager.distanceFilter=10.0; [locationManager startUpdatingLocation]; [self performSelectorInBackground:@selector(sendDataToServer) withObject:nil]; } #pragma mark - #pragma mark CLLocation Manager Delegates - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [self performSelectorInBackground:@selector(sendDataToServer) withObject:nil]; } - (void)applicationDidEnterBackground:(UIApplication *)application { // No need to do any thing /* UIApplication *app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier bgTask = 0; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; */ }