Вам нужно обновить вид карты после обновления местоположения;это займет некоторое время.
У вас также есть потенциальное состояние гонки, потому что вы вызываете startUpdatingLocation
в своем AppDelegate, но контроллер представления не устанавливается в качестве делегата до viewDidLoad
.Делегат почти наверняка будет установлен до того, как будет обновлено местоположение, но вы не можете гарантировать это.
Я бы посоветовал вам переместить все в контроллер представления и, если вы хотите обновить карту только один раз, используйтеrequestLocation
:
@interface GMapViewController ()<CLLocationManagerDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocation *currentLocation;
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
@implementation GMapViewController
#pragma mark - Lifecycle methods
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
self.currentLocation = nil;
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestAlwaysAuthorization];
} else {
[self.locationManager requestLocation];
}
-(void) setMapTo:(CLLocation *)location {
MKCoordinateRegion visibleRegion;
visibleRegion.center =location.coordinate;
visibleRegion.span = MKCoordinateSpanMake(200, 200);
[self.mapView setRegion:visibleRegion animated:YES];
}
#pragma mark - CLLocationManagerDelegate's methods
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *currentLocation = [locations lastObject];
dispatch_async(dispatch_get_main_queue(), ^{
[self setMapTo:currentLocation];
});
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (status != kCLAuthorizationStatusRestricted && status != kCLAuthorizationStatusDenied) {
[manager requestLocation];
}
}
Если вы просто хотите, чтобы карта постоянно отслеживала местоположение пользователя, тогда вы можете просто установить свойство userTrackingMode
вида карты на MKUserTrackingModeFollow