Подтвердить что ты не робот

Получение долготы/широты пользователя Когда 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

Не могли бы вы помочь мне?

4b9b3361

Ответ 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];


}