使用 iOS CLLocationManager 节省电池
Posted
技术标签:
【中文标题】使用 iOS CLLocationManager 节省电池【英文标题】:Conserving Battery with iOS CLLocationManager 【发布时间】:2014-12-03 20:36:28 【问题描述】:考虑到我的应用程序的限制,我正在尝试通过使用 CLLocationManager 来提高效率:
如果应用处于“A”模式,请提供尽可能多且准确的位置数据 尽可能。
如果应用程序处于模式“B”,请至少每 10 分钟签入一次 具有“足够好”(可能约为 500m)的位置数据
当应用程序处于 背景。
由于约束 3,我在我的 plist 中向 UIBackgroundModes 添加了“位置”。 我正在像这样配置我的核心位置管理器:
- (CLLocationManager *)manager
if (_manager == nil)
_manager = [[CLLocationManager alloc] init];
_manager.desiredAccuracy = kCLLocationAccuracyBest;
_manager.distanceFilter = kCLDistanceFilterNone;
_manager.pausesLocationUpdatesAutomatically = NO;
_manager.delegate = self;
return _manager;
我还定义了一个这样的枚举:
typedef NS_ENUM(NSUInteger, LocationMonitoringMode)
LocationMonitoringModeSignificantChanges, //Mode B
LocationMonitoringModeContinuous, //Mode A
;
我是这样使用的:
- (void)setLocationMonitoringMode:(LocationMonitoringMode)mode
if (mode == LocationMonitoringModeContinuous)
[self.manager stopMonitoringSignificantLocationChanges];
[self.manager startUpdatingLocation];
else if (mode == LocationMonitoringModeSignificantChanges)
[self.manager stopUpdatingLocation];
[self.manager startMonitoringSignificantLocationChanges];
问题:这种“切换”是使用 CLLocationManager 节省电池的有效方法吗?显然,使用kCLLocationAccuracyBest
和kCLLocationAccuracy3Kilometers
(gps 与蜂窝塔无线电)的功耗存在很大差异。但是是否也有很大的成本,比如kCLLocationAccuracyBest
和kCLLocationAccuracyNearest10Meters
?
【问题讨论】:
kCLLocationAccuracyBest
& kCLLocationAccuracyNearest10Meters
的费用相同。任何低于 100m 的距离都需要设备为 GPS 芯片供电。
【参考方案1】:
第一个问题:
是的。切换看起来很好。您不必创建两个单独的位置管理器实例。
根据 Apple 关于 CoreLocation 的文件 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html
显着变化的位置服务提供的准确度足以满足大多数应用的需求,是标准位置服务的省电替代方案。该服务使用 Wi-Fi 来确定用户的位置并报告该位置的变化,从而使系统能够比其他方式更积极地管理电源使用情况。
第二个问题:
您可以使用 Apple 的能量诊断仪器来查看 GPS 芯片的启动精度。我们最近的调查表明,当 desiredAccuracy 或 distanceFilter 值小于 100 米时,GPS 芯片就会通电。仪器提供的能源使用值对我来说非常粗略,无法得出所需准确度和电池使用量之间的任何直接关联。然而,根据流行的观点,尽可能不打开 GPS 芯片是节能的一个很好的代表。
【讨论】:
以上是关于使用 iOS CLLocationManager 节省电池的主要内容,如果未能解决你的问题,请参考以下文章
CLLocationManager 未在 iOS 10.2 [Swift] 中调用 didUpdateLocation()
ios CLLocationManager didUpdateToLocation 经纬度迁移
iOS - 在不使用 CLLocationManager 的情况下确定用户所在的国家/地区
CLLocationManager requestWhenInUseAuthorization() 不能在 ios7 上使用 swift 2.0
在 iOS 11 和 Xcode 9.1 中未调用 CLLocationManager 的 didUpdateLocations 委托 [重复]