A note about how in iOS 8 you now have to request permission to use geolocation differently.
For example, some old code like this:
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startUpdatingLocation];
In iOS 8, on first launch it will not ask the user for permission to use geolocation. It will simply ignore this code, and you will not get the location in the app without any warnings.
In iOS 8, you now have to use one of these two methods:
[locationManager requestWhenInUseAuthorization];
[locationManager requestAlwaysAuthorization];
The first requests permission to use geolocation only while the app itself is actually running (when the user has launched it and is inside it). The second also requests permission to use geolocation in the background, or even when the app is no longer running. The second includes the first. If you do not need to track the user constantly and in the background, the first one is enough.
Next, to use one of these methods, you need to add a new item to your Info.plist:
Key: NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription, depending on which permission type you chose. Value - explanatory text describing why you need permission to use geolocation. You can leave it empty, and then the user will see the standard system text. Or you can fill in your own explanation, and then your text will be shown when requesting permission. In principle, this is convenient: you explain to the user why, they understand it, and you have a better chance that they will allow it.
Thus, after adding everything from the previous paragraph, code like this will request permission for us:
// locationManager must be a class property, otherwise it gets released
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if ( [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined ) {
if ( [locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] ) {
[[UIApplication sharedApplication] sendAction:@selector(requestAlwaysAuthorization)
to:locationManager
from:self
forEvent:nil];
}
}
[locationManager startUpdatingLocation];
The check [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined verifies the permission status - if it has not yet been requested, only then do we ask the user.


If you need to support multiple languages, the message can be localized in InfoPlist.strings.
That's it.