Как получить уровень заряда батареи в реальном времени на iOS с точностью до 1%

Я использую эту функцию, чтобы получить текущий уровень заряда батареи устройства:

[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
UIDevice *myDevice = [UIDevice currentDevice];

[myDevice setBatteryMonitoringEnabled:YES];
double batLeft = (float)[myDevice batteryLevel]; 
NSLog(@"%f",batLeft);

но результат имеет 5% гранулярность. Пример: когда батарея телефона заряжена на 88%, регистрируется только значение 0,85. batteryLevel возвращает значения только с шагом 0,05. Например: 0,85, 0,9, 0,95 и никогда не возвращает такие значения, как 0,82 или 0,83.

Есть ли решение, чтобы получить процент с более высокой точностью?


person cat    schedule 04.08.2012    source источник
comment
Для протокола: я просто проверяю ваш код на iPhone 6 Plus, и он показывает все скалярные уровни, например 0,49 и т. д.   -  person brainray    schedule 09.08.2015


Ответы (7)



Существует как минимум четыре разных способа считывания уровня заряда батареи, и все четыре способа могут возвращать разные значения.

Вот диаграмма этих значений во времени.

Значения были записаны с помощью этого проекта iOS: https://github.com/nst/BatteryChart.

Пожалуйста, проверьте код для справки.

Аккумулятор iPhone 5

person nst    schedule 22.05.2013
comment
Это приложение продолжает работать и сообщает проценты в фоновом режиме? Или вы просто оставляете приложение работающим? - person simonthumper; 25.11.2016

Версия Swift для получения уровня заряда батареи:

UIDevice.current.isBatteryMonitoringEnabled = true
let batteryLevel = UIDevice.current.batteryLevel 

batteryLevel вернуть 0,39; 0,40 значения для меня.

person maxwell    schedule 21.02.2019
comment
Это не работает для меня? Нужно ли мне выполнять какие-либо другие настройки? Я получаю -1 в качестве ответа. - person Maninder Singh; 30.05.2019
comment
Вы написали этот код? UIDevice.current.isBatteryMonitoringEnabled = true Если вы этого не написали, вы получите -1. - person maxwell; 30.05.2019
comment
Да, я написал эту строку UIDevice.current.isBatteryMonitoringEnabled = true. Кроме того, я новичок в разработке приложений для iOS. Я вызываю этот метод формы кода viewDIdLoad() в ViewController. Кроме того, я подключен к симулятору, а не к реальному телефону. Будет ли это иметь значение? - person Maninder Singh; 30.05.2019
comment
Конечно, симулятор вернет -1. Используйте этот код только для реальных устройств. - person maxwell; 31.05.2019

Ответы выше очень хороши, но все они в Obj-C, я использовал их с другими примерами, чтобы выполнить ту же задачу на MonoTouch, поэтому я помещаю свой код здесь на случай, если он кому-то понадобится:

try
{
    UIDevice.CurrentDevice.BatteryMonitoringEnabled = true;
    _Battery.Level = (int)(UIDevice.CurrentDevice.BatteryLevel * IOSBatteryLevelScalingFactor);
    _Battery.State = UIDevice.CurrentDevice.BatteryState;
}
catch (Exception e)
{
    ExceptionHandler.HandleException(e, "BatteryState.Update");
    throw new BatteryUpdateException();
}
finally
{
    UIDevice.CurrentDevice.BatteryMonitoringEnabled = false;
}

У меня также есть полный пост в моем блоге, чтобы дать все подробности в здесь

person Has AlTaiar    schedule 20.01.2014

Вы можете найти идеальный ответ здесь

Xcode: 11.4 Свифт: 5.2

Нажмите здесь

person Sivabalaa Jothibose    schedule 21.04.2020

Если вы используете Swift 5.1 или более позднюю версию, этот код определенно вам подойдет.

Шаг 1. Чтобы начать, сначала включите свойство isBatteryMonitoringEnabled текущего устройства, например:

UIDevice.current.isBatteryMonitoringEnabled = true

Шаг 2: - Теперь вы можете прочитать текущий уровень заряда батареи

let level = UIDevice.current.batteryLevel
print(level)
person Navdeep Paliwal    schedule 05.03.2020

person    schedule
comment
Ваша первая строка лишняя, поскольку вы делаете то же самое в третьей строке кода. - person Victor Engel; 24.05.2017
comment
@VictorEngel Я только что отредактировал его, чтобы удалить повторяющуюся строку кода. Спасибо что подметил это. - person PaulMest; 29.11.2018