使用位置管理器时,我的 Swift 应用程序耗电非常快
Posted
技术标签:
【中文标题】使用位置管理器时,我的 Swift 应用程序耗电非常快【英文标题】:My Swift App drains battery very fast while using Location Manager 【发布时间】:2017-03-06 17:54:25 【问题描述】:在我的Swift
应用程序中,我正在检查用户的位置并将其发送到我的后端代码。
我的代码都放在AppDelegate
,看起来像这样:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
NotificationCenter.default.addObserver(self, selector:
#selector(AppDelegate.notificationConfirmationSent),
name: NSNotification.Name(rawValue: locationUpdKey), object: nil)
initLocationManager()
return true
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
location = locations.last
let coord = location.coordinate
longitude = coord.longitude
latitude = coord.latitude
NotificationCenter.default.post(name: Notification.Name(rawValue: locationUpdKey), object: self)
location_fixed = true;
func notificationConfirmationSent()
if(defaults.object(forKey: "uniqueId") != nil)
let currentTime = Date().timeIntervalSince1970
if (currentTime - timeInterval > 30)
print("SENDING DATA TO WEBSERVICE FROM NOTIFICATION")
timeInterval = currentTime
sendCurrentUserPositionToWebService(self.longitude, latitude: self.latitude, uniqueId: defaults.string(forKey: "uniqueId")!)
除此之外我也在使用这两种方法:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
switch status
case .notDetermined:
print("NotDetermined")
case .restricted:
print("Restricted")
case .denied:
print("Denied")
case .authorizedAlways:
print("AuthorizedAlways")
case .authorizedWhenInUse:
print("AuthorizedWhenInUse")
locationManager.distanceFilter = 200
locationManager.startUpdatingLocation()
func initLocationManager()
print("init location manager app delegate")
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
if CLLocationManager.authorizationStatus() == .authorizedWhenInUse
//locationManager.startMonitoringSignificantLocationChanges()
locationManager.distanceFilter = 200
locationManager.startUpdatingLocation()
else
locationManager.requestWhenInUseAuthorization()
现在,在使用我的应用程序一段时间后,电池消耗得非常快,而且整个手机都变热了。我想改变这个行为并修复它,所以手机只发送一次位置(当它是fixed
时),然后在位置发生重大变化时发送。
您能否给我一个提示,我该如何从这里开始,以及为什么电池电量消耗如此之快?
【问题讨论】:
没有什么比说startUpdatingLocation
并保持开机更能消耗电池电量的了。这显然就是您正在做的事情(尽管您没有显示足够的代码来确定)。
@matt 目前我也在`applicationWillTerminate 中使用locationManager.stopUpdatingLocation() locationManager = nil
,但我想这还不够?
我应该在什么时候停止更新位置?
不需要的时候就应该停下来。
【参考方案1】:
就电池消耗而言,运行 Instruments 并查看 CPU 消耗量。我的猜测是它不是位置管理器。
就只知道重大变化而言,Apple 提供了一个 API。
startMonitoringSignificantLocationChanges()
注意应用程序可以在设备移动 500 后立即收到通知 米或更多从其先前的通知。它不应该期望 通知的频率高于每五分钟一次。如果 设备能够从网络中检索数据,位置管理器 更有可能及时发送通知。
【讨论】:
【参考方案2】:一般的想法是调用 startMonitoringSignificantLocationChanges,现在设置 location_fixed = true。您还需要停止位置更新,因此您的代码可能如下所示:
location_fixed = true
manager.stopUpdatingLocations()
manager.startMonitoringSignificantLocationChanges()
【讨论】:
以上是关于使用位置管理器时,我的 Swift 应用程序耗电非常快的主要内容,如果未能解决你的问题,请参考以下文章