由于要通過電量為用戶開啟不同使用模式贝椿,所以需要獲取手機(jī)的電量來檢測(cè)電量的變化。
[UIDevice currentDevice].batteryLevel
這是系統(tǒng)給出的電量獲取方法陷谱,在獲取之前首先要把batteryMonitoring
設(shè)置為YES烙博,但是在實(shí)際操作中,發(fā)現(xiàn)電量在第一次獲取之后,再獲取都是定值习勤,一開始以為是方法問題,在網(wǎng)上分別著了幾種獲取電量的方法焙格,包括
- 1.batteryLevel
- 2.通過私有API獲取Statusbar的電量值
- 3.通過引入IOKit framework來獲取
實(shí)際使用中2獲取的電量址并不準(zhǔn)確图毕,而且由于使用了私有API,在審核過程中有被拒風(fēng)險(xiǎn)眷唉,所以直接舍棄了予颤。
第三種由于引入了framework,增加了包大小冬阳,不劃算蛤虐,也舍棄了。后來開始查找為什么會(huì)獲取一次之后都是定值肝陪,通過runtime的一些列表檢查了ivar
和method
的地址驳庭,通過demo對(duì)比發(fā)現(xiàn)是一樣的,所以方法并沒有被其他人hook氯窍,檢查調(diào)用線程饲常,發(fā)現(xiàn)第一次設(shè)置在子線程,于是在launch中設(shè)置了YES狼讨,通過一系列的嘗試贝淤,發(fā)現(xiàn)以下結(jié)論:
- 1.
batteryMonitoring
設(shè)置的時(shí)候必須在主線程,否則之后獲取電量以及電池狀態(tài)政供,都是第一次獲取的狀態(tài) - 2.
batteryMonitoring
重復(fù)設(shè)置多次相同值的時(shí)候播聪,會(huì)被屏蔽掉,只會(huì)保留第一次的設(shè)置布隔,可能在setter
方法里做了優(yōu)化离陶,判斷值是否和之前的相同直接return
了