我想做以下
- 在 APP Delegate 文件中在后台跟踪位置
- 在 View Controller 中跟踪某人的位置。
这是我的做法:
在 APPDelegate 中:
在 applicationDidFinishLaunching 中:
if ([CLLocationManager locationServicesEnabled])
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
_startLocation = nil;
self.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
self.locationManager.distanceFilter=500;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// Set Property
self.myLocation = newLocation;
BOOL isInBackground = NO;
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)
{
isInBackground = YES;
}
// Handle location updates as normal, code omitted for brevity.
// The omitted code should determine whether to reject the location update for being too
// old, too close to the previous one, too inaccurate and so forth according to your own
// application design.
if (isInBackground)
{
[self sendBackgroundLocationToServer:newLocation];
}
if(newLocation.horizontalAccuracy <= 100.0f)
{
[self.locationManager stopMonitoringSignificantLocationChanges];
}
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
}
[self.locationManager stopMonitoringSignificantLocationChanges];
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
self.locationManager = nil;
[self.locationManager stopUpdatingLocation];
[self.locationManager stopMonitoringSignificantLocationChanges];
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
在视图控制器中:
- (void) startLocationChanges {
if ([CLLocationManager locationServicesEnabled])
{
PLAppDelegate *appDelegate = (PLAppDelegate *) [[UIApplication sharedApplication] delegate];
if(appDelegate.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
}
else {
self.locationManager = appDelegate.locationManager;
}
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
self.myLocation = newLocation;
[self uploadLocationCoordinates];
if(newLocation.horizontalAccuracy <= 100.0f)
{
NSLog(@"stop updating location");
[self.locationManager stopUpdatingLocation];
}
//_horizontalAccuracy.text = currentHorizontalAccuracy;
}
我这样做对吗?当有人关闭应用程序时,位置服务似乎仍在运行。