有关UIDevice获取电量坑

由于要通过电量为用户开启不同使用模式,所以需要获取手机的电量来检测电量的变化。

[UIDevice currentDevice].batteryLevel

这是系统给出的电量获取方法,在获取之前首先要把batteryMonitoring设置为YES,但是在实际操作中,发现电量在第一次获取之后,再获取都是定值,一开始以为是方法问题,在网上分别着了几种获取电量的方法,包括

  • 1.batteryLevel
  • 2.通过私有API获取Statusbar的电量值
  • 3.通过引入IOKit framework来获取

实际使用中2获取的电量址并不准确,而且由于使用了私有API,在审核过程中有被拒风险,所以直接舍弃了。
第三种由于引入了framework,增加了包大小,不划算,也舍弃了。后来开始查找为什么会获取一次之后都是定值,通过runtime的一些列表检查了ivarmethod的地址,通过demo对比发现是一样的,所以方法并没有被其他人hook,检查调用线程,发现第一次设置在子线程,于是在launch中设置了YES,通过一系列的尝试,发现以下结论:

  • 1.batteryMonitoring设置的时候必须在主线程,否则之后获取电量以及电池状态,都是第一次获取的状态
  • 2.batteryMonitoring重复设置多次相同值的时候,会被屏蔽掉,只会保留第一次的设置,可能在setter方法里做了优化,判断值是否和之前的相同直接return

你可能感兴趣的:(有关UIDevice获取电量坑)