PPPan's 平凡之路

做一个互联网内容的贡献者

PPPan's 平凡之路 一个技术博客覆盖范围包括 iOS Objecticve-C Swift Xcode 等


电池电量与低电量模式

优步最近公布的数据显示,当电池快没电的时候,人们更愿意接受溢价。同时,优步也表明他们并没有利用电量相关的数据来设置溢价规则。换句话说,我们在开发App的时候,可以通过电池电量来”提升用户体验”。

电池状态与电量

UIDevice 中有三个电池相关的属性:

1
2
3
@property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;  // default is NO
@property(nonatomic,readonly) UIDeviceBatteryState batteryState NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // UIDeviceBatteryStateUnknown if monitoring disabled
@property(nonatomic,readonly) float batteryLevel NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // 0 .. 1.0. -1.0 if UIDeviceBatteryStateUnknown

我们可以通过 batteryState 来获取电池状态,通过 batteryLevel来获取电池电量信息。

值得一提的是,在获取电池信息之前,需要手动设置 batteryMonitoringEnabledYES,不然batterystate 会返回 Unkonw.

如果想要订阅电池状态,可以注册为以下两个通知的观察者:

1
2
UIKIT_EXTERN NSString *const UIDeviceBatteryStateDidChangeNotification;
UIKIT_EXTERN NSString *const UIDeviceBatteryLevelDidChangeNotification;

batteryLevel 的值每改变 0.05(也就是电池电量的 5%), 就会触发一次 UIDeviceBatteryLevelDidChangeNotification

低电量模式

为了解决续航问题,Apple 在 iOS 9 中为 iPhone 添加了低电量模式 。在此模式下,系统会通过禁用一些特性诸如电子邮件自动获取、后台刷新、Hey Siri等,来达到降低能耗的目的。

低电量模式的设置藏得比较深,以至于从设置中找到它对大多数人来说是一件非常困难的事。换句话说,用户打开了低电量模式,才能真正说明用户所处的情景需要尽可能地节约电量。因此,相比较于直接获取电池电量来说,探测低电量模式是否开启,更能直观地反应产品情景和用户心理。

检测低电量模式

在 iOS 9 中,我们可以很容易地检测到用户是否开启了低电量模式,NSProcessInfo 提供了相对于的属性。

1
2
3
4
if ([[NSProcessInfo processInfo] isLowPowerModeEnabled]) 
{
// 做低电量模式下该做的事
}

同时,如果想要对低电量模式的变化做出响应,可以注册为以下通知的观察者:

1
NSString * const NSProcessInfoPowerStateDidChangeNotification;

当我们检测低电量模式的时候,需要注意以下两点:

  • 低电量模式仅支持 iOS 9 。当 App 需要兼容更早的版本时,先检查api的可用性。
  • 低电量模式仅适用于 iPhone ,在 iPad 中,isLowPowerModeEnabled 的返回值始终为 NO

当我们检测到用户开启了低电量模式,可以为用户做一些小改变,来帮助用户延长电池续航。以下是 Apple 给出一些建议:

  • 停止使用定位服务
  • 减弱动画效果
  • 停止后台任务(比如网络请求)
  • 禁用运动追踪

参考资料

Newer Post

让你的应用更好地利用 3D Touch - WWDC 2016 Session 228 笔记

我们回首 iPhone 的历程,不禁感叹它是如何不断改变我们对手机的认知的。从触屏改变手机的定义开始,距离传感器、光线传感器,到三轴陀螺仪、GPS、运动传感器、再到指纹。这些功能一步步地拓展 iPhone 的能力,不断地改变着我们的生活。 iPhone 6s 再次增加了新的功能 – 3D Touch …

继续阅读
Older Post

Objective-C与Swift混编实践

###前言 由于Swift的语法趋于稳定,目前本人负责的项目也已经在小范围地引入Swift。关于混编过程中遇到的各种思考与选择,胡波的这篇文章已经阐述得得比较全面了,看完文章回头看自己在混编过程中的各种选择,与胡先生的看法是一致的。在此梳理一下一些值得注意的小细节。 Optional基于Object …

继续阅读