문제

In my project I need to get location evry hour. My code looks like this:

#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];
    }
   }
}

This works, but battery im my phone is drained very fast and location is checking every second. If I enable:

[locationManager stopUpdatingLocation];

then location service is stoped permanently. How to change this code for saving battery power ?

도움이 되었습니까?

해결책 2

can you set locationManager.pausesLocationUpdatesAutomatically to YES this should help

다른 팁

Your idea about getting the location is not really possible in iOS since your app needs a active location monitoring to keep running in the background.

For this Apple has the methods to check only major changes, startMonitoringSignificantLocationChanges.

This will inform you app of any major changes in location. Then what you could do to get a more accurate location is start the normal startUpdatingLocation.

This way you save battery and only grab the location when needed.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top