Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Battery Information using iPhone's Cocoa Touch

DZone's Guide to

Battery Information using iPhone's Cocoa Touch

· Mobile Zone
Free Resource

Download this comprehensive Mobile Testing Reference Guide to help prioritize which mobile devices and OSs to test against, brought to you in partnership with Sauce Labs.

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!

Analysts agree that a mix of emulators/simulators and real devices are necessary to optimize your mobile app testing - learn more in this white paper, brought to you in partnership with Sauce Labs.

Topics:

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

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}