O'Reilly logo

Programming iOS 4 by Matt Neuburg

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Heading and Course

For appropriately equipped devices, Core Location also supports use of the magnetometer to determine which way the device is facing (its heading) and the GPS to determine which way it is moving (its course).

In this example, I’ll take advantage of the magnetometer and use the device as a compass. The headingFilter setting is to prevent us from being bombarded constantly with readings. For best results, the device should be held level (like a tabletop, or a compass); I have not changed the headingOrientation property, so the reported heading will then be the direction that the top of the device (the end away from the Home button) is pointing:

CLLocationManager* lm = [[CLLocationManager alloc] init];
self.locman = lm;
[lm release];
self.locman.delegate = self;
self.locman.headingFilter = 3;
[self.locman startUpdatingHeading];

Readings arrive as messages to the delegate. I’ll simply log our magnetic heading along with a rough corresponding cardinal direction. I choose to use the magnetic heading (magneticHeading) rather than the true heading (trueHeading) because, as the documentation explains, the latter can be calculated correctly only if we are getting location updates as well as heading updates:

- (void) locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { CGFloat h = newHeading.magneticHeading; NSString* dir = @"N"; NSArray* cards = [NSArray arrayWithObjects: @"N", @"NE", @"E", @"SE", @"S", @"SW", @"W", @"NW", nil]; for (int i ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required