2014-02-24 108 views
1

在我的項目中,我需要獲取位置evry小時。我的代碼如下所示: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]; 

然後位置服務永久停止。如何更改此代碼以節省電池電量?

+0

現在sleepForTimeInterval是200秒,但我應該改爲3600秒。 – Nizzre

+0

嗨請檢查這個答案這將幫助你肯定,因爲它可以幫助我很多。 –

回答

0

可以在設置locationManager.pausesLocationUpdatesAutomaticallyYES這應該幫助有關獲取,因爲你的應用程序需要一個活躍的位置監控,以保持在後臺運行的位置是不是真的在iOS中可能

1

你的點子。

對於此Apple有檢查主要變化的方法,startMonitoringSignificantLocationChanges

這會告訴你應用程序的位置的任何重大變化。那麼你可以做些什麼來獲得更準確的位置是開始正常的startUpdatingLocation

這樣可以節省電池,只需要時就抓住位置。

+0

您是否確定每個小時都無法通過充電電池獲取位置?如果是的話,我會回到基於startMonitoringSignificantLocationChanges的早期解決方案。 – Nizzre

+0

*節省電池當然:) – Nizzre

+0

在iOS中執行計劃任務幾乎是不可能的,您可以詢問系統是否可以每小時執行後臺任務。那麼如果系統允許的話,你每小時會得到10秒左右的時間來做一些事情。我的解決方案將確保它可以正常工作,而不會導致電池耗盡。 – rckoenes