Это не работает на игровой площадке, но она работает в реальном приложении.
Я не смог получить доступ к заголовочному файлу IOPowerSources.h
с помощью Swift и import IOKit
, хотя: мне пришлось сделать мост к Objective-C.
Вот мое решение:
Добавить IOKit.framework
в свой проект (нажмите +
в Linked Frameworks and Libraries
)
Создайте новый пустой файл .m
, независимо от его имени. Затем Xcode спросит, должен ли он сделать «мостовой заголовок». Скажи да.
Игнорировать файл .m
. В новом YOURAPPNAME-Bridging-Header.h
файл, который Xcode только что создали, добавьте строку #import <IOKit/ps/IOPowerSources.h>
(и не добавлять import IOKit
в вашем Swift файл)
Теперь вы можете получить доступ к большинству из IOPowerSources
функций.
Пример:
func getBatteryStatus() -> String {
let timeRemaining: CFTimeInterval = IOPSGetTimeRemainingEstimate()
if timeRemaining == -2.0 {
return "Plugged"
} else if timeRemaining == -1.0 {
return "Recently unplugged"
} else {
let minutes = timeRemaining/60
return "Time remaining: \(minutes) minutes"
}
}
let batteryStatus = getBatteryStatus()
print(batteryStatus)
Примечание: Я не мог получить доступ к константы, как kIOPSTimeRemainingUnlimited
и kIOPSTimeRemainingUnknown
поэтому я использовал их исходных значений (-2.0 и -1.0), но было бы лучше найти эти константы, если они все еще существуют где-то.
Другой пример с IOPSCopyPowerSourcesInfo
:
let blob = IOPSCopyPowerSourcesInfo()
let list = IOPSCopyPowerSourcesList(blob.takeRetainedValue())
print(list.takeRetainedValue())
Результат:
(
{
"Батарея обеспечивает время, оставшееся" = 1;
BatteryHealth = Хорошо;
Ток = 0 ;
«Текущая мощность» = 98;
DesignCycleCount = 1000;
«Серийный номер оборудования» = 1X234567XX8XX;
"Is Charged" = 1;
«Is Charging» = 0;
«присутствует» = 1;
«Максимальная вместимость» = 100;
Название = "InternalBattery-0";
«Состояние источника питания» = «Мощность переменного тока»;
«Время пуста» = 0;
«Время полной зарядки» = 0;
«Тип транспорта» = Внутренний;
Тип = Внутренняя батарея;
}
)
Спасибо за это! Я сделаю это и вернусь. –