Я использую :

UIDevice *myDevice = [UIDevice currentDevice];
[myDevice setBatteryMonitoringEnabled:YES];
float batLeft = [myDevice batteryLevel];
int i = [myDevice batteryState];    
int batinfo = batLeft * 100;

Чтобы узнать состояние батареи. Я ищу, как узнать время, оставшееся до завершения зарядки. Пример: осталось 1 час 20 минут. Как его найти программно?

17
Shishir.bobby 16 Дек 2012 в 11:02

1 ответ

Лучший ответ

Я не нашел для этого способа в официальной документации , ни в дампе класса, закрытом заголовке UIDevice класс.

Итак, мы должны что-то придумать. Лучшее «решение», которое я имею в виду на данный момент, похоже на подход, использованный при оценке времени загрузки: вычисление средней скорости загрузки / зарядки и деление оставшегося количества (данных или заряда) на эту скорость:

[UIDevice currentDevice].batteryMonitoringEnabled = YES;
float prevBatteryLev = [UIDevice currentDevice].batteryLevel;
NSDate *startDate = [NSDate date];

[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(batteryCharged)
           name:UIDeviceBatteryLevelDidChangeNotification
         object:nil
];

- (void)batteryCharged
{
    float currBatteryLev = [UIDevice currentDevice].batteryLevel;
    // calculate speed of chargement
    float avgChgSpeed = (prevBatteryLev - currBatteryLev) / [startDate timeIntervalSinceNow];
    // get how much the battery needs to be charged yet
    float remBatteryLev = 1.0 - currBatteryLev;
    // divide the two to obtain the remaining charge time
    NSTimeInterval remSeconds = remBatteryLev / avgChgSpeed;
    // convert/format `remSeconds' as appropriate
}
10
user529758user529758 16 Дек 2012 в 11:22
4
Это предполагает, что зарядка линейна - это не так. Зарядка резко замедляется, когда аккумулятор почти полностью заряжен.
 – 
user149341
16 Дек 2012 в 11:27
Да, и даже уровень заряда батареи, сообщаемый ОС, может быть неточным и т. д. Как вы думаете, почему я везде использовал термин "средний" ? Дерьмо бывает ...
 – 
user529758
16 Дек 2012 в 11:29
Спасибо H2CO3, я не могу вызвать метод batterCharge. Любые предложения
 – 
Shishir.bobby
16 Дек 2012 в 11:37
Почему «вы не можете» вызвать этот метод? Еще важнее: зачем вам это называть? Вызывается центром уведомлений. Вы просто делаете что-то в конце метода с полученным значением remSeconds.
 – 
user529758
16 Дек 2012 в 11:41
Наконец это сработало. но в NSLog я получаю это: remSeconds: -inf
 – 
Shishir.bobby
16 Дек 2012 в 12:15