Over a million developers have joined DZone.

Battery Information using iPhone's Cocoa Touch

· Mobile Zone

I have done something similar (although on a smaller scale) to this but for the Android platform. For the iPhone platform, the main class used is UIDevice. Below is the header used:

#import <UIKit/UIKit.h>


@interface BatteryInformationViewController : UIViewController {
IBOutlet UITextView *batteryLevel;
IBOutlet UITextView *chargingState;
// Used to format the battery level
NSNumberFormatter *numberFormatter;
}

@property (nonatomic, retain) UITextView *batteryLevel;
@property (nonatomic, retain) UITextView *chargingState;
@property (nonatomic, retain, readonly) NSNumberFormatter *numberFormatter;

@end

There are two UI elements (text views), namely the battery level and the battery charging state. The corresponding implementation file is next:

#import "BatteryInformationViewController.h"

@interface BatteryInformationViewController ()

- (void)displayBatteryLevel;
- (void)displayBatteryStatus;

@end

@implementation BatteryInformationViewController

@synthesize batteryLevel, chargingState;


- (NSNumberFormatter *)numberFormatter
{
if (numberFormatter == nil)
{
// Used for formatting the battery level
numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterPercentStyle];
[numberFormatter setMaximumFractionDigits:1];
}
return numberFormatter;
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];

// Register for battery level and state change notifications.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(batteryLevelDidChange:)
name:UIDeviceBatteryLevelDidChangeNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(batteryStateDidChange:)
name:UIDeviceBatteryStateDidChangeNotification object:nil];

[self displayBatteryLevel];

[self displayBatteryStatus];

}

#pragma mark Battery Info

- (void)displayBatteryLevel {
float batteryLevelLocal = [UIDevice currentDevice].batteryLevel;
if (batteryLevelLocal < 0.0)
{
// -1.0 means battery state is UIDeviceBatteryStateUnknown
self.batteryLevel.text = NSLocalizedString(@"Unknown", @"");
}
else {
NSNumber *levelObj = [NSNumber numberWithFloat:batteryLevelLocal];

// Using the numberFormatter property lazily creates that object the
// first time it's used.
self.batteryLevel.text = [self.numberFormatter stringFromNumber:levelObj];
}
}

- (void)displayBatteryStatus {
// Get battery state
switch ([UIDevice currentDevice].batteryState) {
case UIDeviceBatteryStateUnknown:
{
self.chargingState.text = NSLocalizedString(@"Unknown", @"");
break;
}
case UIDeviceBatteryStateUnplugged:
{
self.chargingState.text = NSLocalizedString(@"Unplugged", @"");
break;
}
case UIDeviceBatteryStateCharging:
{
self.chargingState.text = NSLocalizedString(@"Charging", @"");
break;
}
case UIDeviceBatteryStateFull:
{
self.chargingState.text = NSLocalizedString(@"Full", @"");
break;
}
}
}

#pragma mark Battery Notifications

// Called when the battery level has changed
- (void)batteryLevelDidChange:(NSNotification *)notification
{
[self displayBatteryLevel];
}

// Clalled when the battery status has changed
- (void)batteryStateDidChange:(NSNotification *)notification
{
[self displayBatteryStatus];
}

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.batteryLevel = nil;
self.chargingState = nil;
}

- (void)viewDidDisappear:(BOOL)animated {
[[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"WhichView"];
}


- (void)dealloc {
[batteryLevel release];
[chargingState release];
[numberFormatter release];
[super dealloc];
}


@end
The above code is commented, so it should be pretty obvious what it does. I first register for change notifications for battery level and battery status change, and display the initial values for those properties.

There is a really good example from Apple called BatteryStatus. It should give you anything you need regarding battery information.

I hope you find it useful!
Topics:

Published at DZone with permission of Mihai Fonoage, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}