jammyman34
jammyman34

Reputation: 1409

How to monitor battery level and state changes using swift

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

Answers (4)

Nazmul Hasan
Nazmul Hasan

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

jlmurph
jlmurph

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

KSigWyatt
KSigWyatt

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

tbaranes
tbaranes

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

Related Questions