Ответ RedBlueThing работал довольно хорошо для меня. Вот пример кода того, как я это сделал.
Заголовок
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface yourController : UIViewController <CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}
@end
MainFile
В методе init
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
Функция обратного вызова
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude);
NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}
iOS 6
В iOS 6 функция делегата устарела. Новый делегат
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
Поэтому, чтобы получить новую позицию, используйте
[locations lastObject]
iOS 8
В iOS 8 необходимо явно запросить разрешение перед началом обновления местоположения
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
[self.locationManager requestWhenInUseAuthorization];
[locationManager startUpdatingLocation];
Вы также должны добавить строку для ключей NSLocationAlwaysUsageDescription
или NSLocationWhenInUseUsageDescription
в Info.plist приложения. В противном случае вызовы startUpdatingLocation
будут игнорироваться, и ваш делегат не получит никакого обратного вызова.
И в конце, когда вы закончите чтение местоположения, вызовите stopUpdating location в подходящем месте.
[locationManager stopUpdatingLocation];