使用位置管理器时,我的 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 应用程序耗电非常快的主要内容,如果未能解决你的问题,请参考以下文章

当我在有效负载中上传应用程序非公共选择器时收到警告

Swift 属性包装器

Swift 属性包装器

如何在位置管理器功能swift 3中使用用户位置

我应该在 Swift 中使用单例位置管理器吗?

iOS GPS 电池耗电,如何减少耗电?