iOS,每小时获取位置信息(iOS7)



在我的项目中,我需要获取位置。我的代码如下所示:

#import "AppDelegate.h"
@implementation AppDelegate {
   UIBackgroundTaskIdentifier bgTask;
   CLLocationManager *locationManager;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   locationManager = [[CLLocationManager alloc] init];
   locationManager.delegate = self;
   locationManager.pausesLocationUpdatesAutomatically = NO;
   locationManager.activityType = CLActivityTypeOther;
   locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
   locationManager.distanceFilter = kCLDistanceFilterNone;
   return YES;
}                       
- (void)applicationDidEnterBackground:(UIApplication *)application {
   __block UIBackgroundTaskIdentifier background_task;
   background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
    [application endBackgroundTask: background_task];
    background_task = UIBackgroundTaskInvalid;
   }];
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [locationManager startUpdatingLocation];
    while(TRUE)
    {
        NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
        [NSThread sleepForTimeInterval:200]; //wait for x sec
        [locationManager startUpdatingLocation];
    }
    [application endBackgroundTask: background_task];
    background_task = UIBackgroundTaskInvalid;
   });

}
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
   CLLocation *location = [locations lastObject];
   NSDate* eventDate   = location.timestamp;
   NSTimeInterval time = [eventDate timeIntervalSinceNow];
   if (abs(time) < 15.0) {
    if (location != nil) {
        NSString *lat = [NSString stringWithFormat:@"%.8f", location.coordinate.latitude];
        NSString *lng = [NSString stringWithFormat:@"%.8f", location.coordinate.longitude];
        NSLog(@"location update  ...");
        //[APIConnection SaveMyPositionWitLat:lat withLng:lng];
        //[locationManager stopUpdatingLocation];
    }
   }
}

这有效,但是我的手机电池电量耗尽得非常快,并且每秒都会检查位置。如果我启用:

[locationManager stopUpdatingLocation];

然后定位服务将永久停止。如何更改此代码以节省电池电量?

您关于获取位置的想法在 iOS 中实际上是不可能的,因为您的应用程序需要活动位置监控才能在后台继续运行。

为此,Apple具有仅检查重大更改的方法,startMonitoringSignificantLocationChanges

这将通知您应用程序位置的任何重大变化。然后,您可以做的是获得更准确的位置 启动正常startUpdatingLocation .

通过这种方式,您可以节省电池电量,并且只在需要时抓取位置。

您可以设置locationManager.pausesLocationUpdatesAutomaticallyYES这应该有所帮助

最新更新