2012年5月19日土曜日

iOSでバッテリー残量を取得する

iPhone/iPadのアプリで、バッテリー残量を取得するには、以下で取得が可能です。

[UIDevice currentDevice].batteryMonitoringEnabled = YES;
float battery = [UIDevice currentDevice].batteryLevel;

float battery にて入ってくる値は -1 〜 1.0 までになり、
-1 は シュミレータで実行などにより、バッテリー状態が不明な時(UIDeviceBatteryStateUnknown の時)に設定されます。
実際の値は、0〜1.0 までの値で設定されるので 100 をかければ パーセントの値になります。

簡単やーん! とおもって早速書いていたのですが、
iPhone/iPadでiOSが表示している上部のステータスバーのバッテリー残量の%と違う値が返ってくる。

コードでは 85% の時、ステータスバーは92%
コードでは 65% の時、ステータスバーは69%
コードでは 55% の時、ステータスバーは57%
コードでは 50% の時、ステータスバーは51%

どうやら、コード上では 5%刻みでしか取得できていないっぽい。

ググっていたら以下のサイトを発見。

How to get UIDevice batteryLevel to provide status in 1% increments or finer

The UIKit calls to retrieve Battery can only get a number better 0.0 to 1.0 with 0.05 steps which means 5% intervals. In order to get it with finer granularity you might have to jail break the device and setup something like this but you might not be able to submit the app. Just in case, I came across this post, which might be of interest to you.

そういうものらしいです。
リジェクト対象になってもいいなら方法はあるらしいw

試していると、
しかも誤差は +-5%には収まらない時がある気もする。 +-10%とかなのだろうか。
UIDeviceBatteryLevelDidChangeNotification で変更イベントをリスナーしていると、充電してないのにbatteryLevelが増えた値が来る時があったりとかもする。
まぁ、あまり当てにしてはいけない ということだろう。

ということで、本日の教訓。

バッテリー残量を自作して表示する時は、90%など、実際の数値は表示しないほうがよさそう。
誤差が +-10%離れた値が返ってくる可能性もあるので、正確な値はやんわり隠しても大丈夫なアプリ仕様を考えよう。
• • •