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的回答)