#objective-c #cocoa #macos
#objective-c #cocoa #macos
Вопрос:
Я создаю приложение для Mac OSX, которому необходимо опрашивать сервер каждую минуту или даже реже, если пользователь пожелает. К сожалению, служба не поддерживает push…
В любом случае, я хотел бы предоставить пользователю два варианта:
- Интервал опроса при опросе батареи
- интервал во время зарядки
Как я могу получить состояние зарядного устройства в Objective C? Меня действительно не волнует фактический процент, только если ноутбук подключен или нет. Очевидно, что для настольных компьютеров это не имеет значения, поэтому, надеюсь, есть решение, которое работает для ноутбуков и настольных компьютеров.
Ответ №1:
Взгляните на API IOPowerSources.
Сначала вызовите IOPSCopyPowerSourcesInfo()
, затем IOPSCopyPowerSourcesList()
, чтобы получить список всех доступных источников питания. IOPSGetPowerSourceDescription()
вернет словарь с информацией о конкретном источнике питания. Согласно документации, ключ kIOPSPowerSourceStateKey
описывает «текущий источник питания. kIOPSBatteryPowerValue
указывает, что источник питания потребляет внутреннее питание; kIOPSACPowerValue
указывает, что источник питания подключен к внешнему источнику питания.»
Вы также можете настроить уведомление при смене источников питания с помощью IOPSNotificationCreateRunLoopSource()
.
(ПРИМЕЧАНИЕ: я ничего из этого не тестировал, просто просмотрел документацию.)
Комментарии:
1.
IOPSCopyExternalPowerAdapterDetails()
кажется, лучше подходит: «Если адаптер переменного тока / внешнего питания не подключен или если произошла ошибка, возвращаетсяNULL
’.
Ответ №2:
Хотя на этот вопрос уже есть принятый ответ, который привел меня к моему решению, было больно переходить по множеству неработающих ссылок.
Вот мое решение:
- Добавить
IOKit.framework
- Импорт
#import <IOKit/ps/IOPowerSources.h>
-
Код:
CFTimeInterval timeRemaining = IOPSGetTimeRemainingEstimate(); if (timeRemaining == kIOPSTimeRemainingUnlimited) { // connected to outlet } else if (timeRemaining == kIOPSTimeRemainingUnknown){ // time remaining unknown (recently unplugged) } else if ((timeRemaining / 60) < 30){ // less than 30 minutes remaining }
Комментарии:
1. -2 (зарядное устройство подключено) и -1 зарядное устройство отключено от сети, иначе срок службы аккумулятора увеличится на несколько секунд
2. У меня это сработало идеально и было намного понятнее.