Reputation: 1409
So, I'm trying to figure out how to monitor the battery level and state changes in iOS devices.
So far I've determined how to get the current battery level, but can't figure out how to get the state or how to monitor any changes so I can pop a dialog (or notification, but I assume I can't monitor this in the background anyway so...) when 100% charged.
This is what I have so far:
@IBOutlet var BatteryLevelLabel: UILabel!
@IBOutlet var BatteryStateLabel: UILabel!
// function to return the devices battery level
func batteryLevel()-> Float {
return UIDevice.currentDevice().batteryLevel
}
// function to return the devices battery state (Unknown, Unplugged, Charging, or Full)
func batteryState()-> UIDeviceBatteryState {
return UIDevice.currentDevice().batteryState
}
override func viewDidLoad() {
super.viewDidLoad()
let currentBatteryLevel = batteryLevel()
// enables the tracking of the devices battery level
UIDevice.currentDevice().batteryMonitoringEnabled = true
// shows the battery level on labels
BatteryLevelLabel.text = "\(batteryLevel() * 100)%)"
BatteryStateLabel.text = "\(batteryState())"
print("Device Battery Level is: \(batteryLevel()) and the state is \(batteryState())")
// shows alert when battery is 100% (1.0)
if currentBatteryLevel == 1.0{
let chargedAlert = UIAlertController(title: "Battery Charged", message: "Your battery is 100% charged.", preferredStyle: UIAlertControllerStyle.Alert)
chargedAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action: UIAlertAction!) in
print("Handle Ok logic here")
}))
presentViewController(chargedAlert, animated: true, completion: nil)
}
}
Any assistance here would be greatly appreciated! Thanks!
Upvotes: 15
Views: 12666
Reputation: 133
Swift 5 Version of the solution:
NotificationCenter.default.addObserver(self, selector: #selector(batteryLavelChanged), name: UIDevice.batteryLevelDidChangeNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(batteryStateChanged),name: UIDevice.batteryStateDidChangeNotification, object: nil)
Upvotes: 0
Reputation: 1090
There are new methods now through the UIDevice class:
Getting the Device Battery State
var batteryLevel: Float
The battery charge level for the device.
var isBatteryMonitoringEnabled: Bool
A Boolean value indicating whether battery monitoring is enabled (true) or not (false).
var batteryState: UIDeviceBatteryState
The battery state for the device.
With UIDeviceBatteryState
having the following values:
case unknown
The battery state for the device cannot be determined.
case unplugged
The device is not plugged into power; the battery is discharging.
case charging
The device is plugged into power and the battery is less than 100% charged.
case full
The device is plugged into power and the battery is 100% charged.
Upvotes: 1
Reputation: 1368
Here is the new way of implementing the code @tbaranes suggested for Swift 3.0
NotificationCenter.default.addObserver(self, selector: Selector(("batteryStateDidChange:")), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: Selector(("batteryLevelDidChange:")), name: NSNotification.Name.UIDeviceBatteryLevelDidChange, object: nil)
Upvotes: 7
Reputation: 3590
You can use the battery state notification UIDeviceBatteryStateDidChangeNotification
and UIDeviceBatteryLevelDidChangeNotification
to be notified when its state changed:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "batteryStateDidChange:", name: UIDeviceBatteryStateDidChangeNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "batteryLevelDidChange:", name: UIDeviceBatteryLevelDidChangeNotification, object: nil)
// Stuff...
}
func batteryStateDidChange(notification: NSNotification){
// The stage did change: plugged, unplugged, full charge...
}
func batteryLevelDidChange(notification: NSNotification){
// The battery's level did change (98%, 99%, ...)
}
Upvotes: 26