Ios 快速-在后台打开和关闭位置以节省电池

Ios 快速-在后台打开和关闭位置以节省电池,ios,swift,background,gps,core-location,Ios,Swift,Background,Gps,Core Location,这类问题在这个网站上被问了很多,但都充满了困惑或过时的答案,我想知道是否有人能给我一个明确的答案,关于如何解决我的问题?我想经常在后台更新位置,但在不需要时关闭位置服务,这样可以省电。 所以我有定期的背景更新 因此 func applicationWillResignActive(application: UIApplication) { NSNotificationCenter.defaultCenter().postNotificationName(BeginBackGroundMod

这类问题在这个网站上被问了很多,但都充满了困惑或过时的答案,我想知道是否有人能给我一个明确的答案,关于如何解决我的问题?我想经常在后台更新位置,但在不需要时关闭位置服务,这样可以省电。 所以我有定期的背景更新 因此

 func applicationWillResignActive(application: UIApplication) {
  NSNotificationCenter.defaultCenter().postNotificationName(BeginBackGroundMode, object:self)

}
此通知调用的此函数包括以下内容-

locationManager.pausesLocationUpdatesAutomatically = false
timer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: Selector("onTick"), userInfo: nil, repeats: true)         
所以这在背景中重复

  func onTick(){
    println("ticking")  
    println("\(Coordinates!.latitude)")
    println( "\(Coordinates!.longitude)")


    self.locationManager.allowDeferredLocationUpdatesUntilTraveled(CLLocationDistanceMax, timeout: 4)



}

  func locationManager(manager: CLLocationManager!,didFinishDeferredUpdatesWithError error: NSError!) {
    locationManager.startUpdatingLocation()



}
这是可行的,但我觉得我可能没有用正确的方法来实现它,所以在代码优雅性或理解能力方面的任何改进都将是非常棒的。至于我的问题,在这个过程中,我应该在哪里打开和关闭位置以节省电池?还是有其他方法可以节省电池?(我需要最大的准确性)。
首先要感谢您,Paulw11是正确的,一旦应用程序进入后台,NSTimer将不会执行。在应用程序挂起之前,苹果只提供30秒的时间来完成任何工作

但是,处理这种情况的正确方法只是更改正在执行的位置更新的类型。在后台,您应该使用“重要位置更改”事件。其工作方式是当用户的位置发生重大变化时,系统将更新您的应用程序。这是在应用程序处于后台时跟踪位置的最节省电池的方法

一旦应用程序返回前台,您就可以停止重要的位置更改事件,并开始正常的位置跟踪

请参阅下面的一些示例代码。这在objective-c中,但可以很容易地移植到Swift

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOption
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = 1.0f; //one meter

    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        [locationManager requestAlwaysAuthorization];

    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [locationManager stopUpdatingLocation];
    [locationManager startMonitoringSignificantLocationChanges];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [locationManager stopUpdatingLocation];
    [locationManager startUpdatingLocation];
}

一旦你的应用进入后台,
NSTimer
将不再执行。减少电池消耗的最佳方法是在后台使用显著的位置更改模式,需要进行一些调整(jayesh kavathiya的回答)