Получение долготы/широты пользователя Когда viewDidLoad
Моя цель - получить долготу/широту пользователя при загрузке представления и сохранить значения в двух переменных для последующих вычислений. Мне не нужно отслеживать местоположение пользователя и обновлять его, мне просто нужно получить его/ее координаты один раз. Мой код выглядит следующим образом:
- (void)viewDidLoad {
[super viewDidLoad];
// locationManager update as location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
float longitude=coordinate.longitude;
float latitude=coordinate.latitude;
NSLog(@"dLongitude : %f",longitude);
NSLog(@"dLatitude : %f", latitude);
}
В консоли я продолжаю получать следующее:
dLongitude : 0.000000
dLatitude : 0.000000
Не могли бы вы помочь мне?
Ответы
Ответ 1
Чтобы получить местоположение пользователя даже после того, как вам нужно сделать locationManager
, чтобы начать обновление местоположений (вы это сделали), и реализовать метод делегирования, который вызывает менеджер при удалении местоположения - вы не можете сразу получить местоположение из диспетчера местоположений.
Если вы не хотите отслеживать местоположение пользователя - просто прекратите обновление местоположений в этом методе делегата после того, как местоположение было выбрано в первый раз (и сохраните его, если оно вам понадобится в будущем).
Ответ 2
Как только вы вызываете [locationManager startUpdatingLocation];
, ваш метод viewDidLoad выполняется. Вам необходимо реализовать
-(void) locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *) newLocation
fromLocation: (CLLocation *) oldLocation
и
- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
который вызывается вашим менеджером locationManager, когда он получает местоположение, или когда он терпит неудачу. В обоих этих методах вы можете вызвать [locationManager stopUpdatingLocation]
.
Внутри метода didUpdateToLocation вы должны переместить весь свой код из viewDidLoad, начиная с CLLocation *location = [locationManager location];
То, где вы получите правильные значения.
Ответ 3
Это сработало для меня
- (void)viewDidLoad {
[super viewDidLoad];
// locationManager update as location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
[locationManager stopUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
float longitude=location.coordinate.longitude;
float latitude=location.coordinate.latitude;
NSLog(@"dLongitude : %f", longitude);
NSLog(@"dLatitude : %f", latitude);
}
Ответ 4
Попробуйте этот код
-(IBAction)Button:(id)sender
{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
//Настройте новое событие с информацией из местоположения
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];
NSLog(@"dLatitude : %@", latitude);
NSLog(@"dLongitude : %@",longitude);
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 40, 250, 50)];
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 80, 200, 50)];
UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 120, 200, 100)];
myLabel.textColor = [UIColor blackColor];
myLabel1.textColor = [UIColor blackColor];
label.backgroundColor = [UIColor clearColor];
myLabel.backgroundColor = [UIColor clearColor];
myLabel1.backgroundColor = [UIColor clearColor];
[myLabel setText:latitude];
[myLabel1 setText:longitude];
label.text = @"Current Latitude And Longitude";
[self.view addSubview:label];
[self.view addSubview:myLabel];
[self.view addSubview:myLabel1];
}
Ответ 5
если вы получаете Lat lang как (0.00, 0.00)
это может быть решением для вашего,
шаг 1:
NSLocationAlwaysUsageDescription
или NSLocationWhenInUseUsageDescription
Добавьте эти два ключа в Info.plist
шаг 2:
И чем [locationManager startUpdatingLocation];
начнет обновление
шаг 3:
и вам необходимо реализовать
два метода
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation * currentLocation = [locations lastObject];
NSLog(@"Updated Lat %f",currentLocation.coordinate.longitude);
NSLog(@"Updated Lang %f",currentLocation.coordinate.latitude);
}
of CLLocationManagerDelegate
в вашем интерфейсе ViewController.
**step 4:**
-(void)viewDidLoad
{
[super viewDidLoad];
geocoder = [[CLGeocoder alloc] init];
manager.delegate = self;
manager.desiredAccuracy = kCLLocationAccuracyBest;
[manager requestWhenInUseAuthorization];
[manager requestAlwaysAuthorization];
[manager startUpdatingLocation];
}