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

CLLocationManager startUpdatingLocation не вызывает locationManager: didUpdateLocations: или locationManager: didFailWithError:

Я пытаюсь использовать структуру CLLocationManager в моем проекте iOS для доступа к местоположению пользователя, но когда я звоню

[locationManager startUpdatingLocation]

не вызываются locationManager:didUpdateLocations: или locationManager:didFailWithError:.

//myViewController.h
@interface myViewController : UITableViewController <CLLocationManagerDelegate>
@end

//myViewController.m
@implementation myViewController{
    CLLocationManager *locationManager;
}

//edit
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
}
//finish edit

-(void)getLocation
{
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
UIAlertView *errorAlert = [[UIAlertView alloc]
                           initWithTitle:@"Error" 
                                 message:@"Failed to Get Your Location"              
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                      otherButtonTitles:nil];
[errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations[[locations count] -1];
    CLLocation *currentLocation = newLocation;
    NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];

if (currentLocation != nil) {
   NSLog(@"latitude: %@", latitude);
   NSLog(@"longitude: @"%@", longitude);
}else {
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" 
                                                     delegate:nil 
                                            cancelButtonTitle:@"OK" 
                                            otherButtonTitles:nil];
    [errorAlert show];
}

}
@end

Ни метод делегата не вызывается, несмотря на то, что он говорит в документации:

"Этот метод возвращает немедленно. Вызов этого метода заставляет диспетчер местоположений получить исправление исходного местоположения (которое может занять несколько секунд) и уведомить вашего делегата, вызвав его метод locationManager:didUpdateLocations: [...] В дополнение к вашему делегату объект, реализующий метод locationManager:didUpdateLocations:, он также должен реализовать метод locationManager:didFailWithError: для ответа на потенциальные ошибки."

Не знаю, как отладить проблему.

Спасибо,

JA

4b9b3361

Ответ 1

enter image description here Просто добавьте это в info.plist

NSLocationAlwaysUsageDescription --- Мне нужно местоположение

NSLocationWhenInUseUsageDescription --- Мне нужно местоположение

privacy - описание использования местоположения --- Мне нужно местоположение

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate=self;
  locationManager.desiredAccuracy=kCLLocationAccuracyBest;
  locationManager.distanceFilter=kCLDistanceFilterNone;
  [locationManager requestWhenInUseAuthorization];
  [locationManager startMonitoringSignificantLocationChanges];
  [locationManager startUpdatingLocation];

Теперь он будет называть ваш didUpdateToLocation определенно.

для более подробной информации нажмите здесь

Ответ 2

Службы местоположения работают немного иначе, начиная с iOS 8.

В основном вам нужно добавить ключ NSLocationWhenInUseUsageDescription в ваш Info.plist файл и добавить описание, почему вашему приложению нужно местоположение, например "Местоположение необходимо...".

Обратите внимание, что вам также может потребоваться проверить версию iOS. Только для iOS 8 и выше диспетчер местоположения прослушивает вызов requestWhenInUseAuthorization.

Ниже приведена приведенная ниже ссылка: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Удачи!

Ответ 3

С iOS 8.0 сначала нужно вызвать -[CLLocationManager requestWhenInUseAuthorization ] или -[CLLocationManager requestAlwaysAuthorization], чтобы пользователь попросил дать ваше разрешение на использование этого местоположения.

Ответ 4

Вам настоятельно необходимо проверить, что вы инициализируете CLLocationManager в основном потоке. В другом случае вы не получите событие updateLocation.

Я не могу найти такую ​​информацию в документах Apple, но она работает для меня в любом случае.

Ответ 5

Вам нужно добавить что-то в свой проект,

  • В plist вашего проекта добавьте следующие вещи:

    • Key: NSLocationAlwaysUsageDescription Type:String
    • Key: NSLocationWhenInUseUsageDescription Type:String
  • В файле .m с [locationManager startUpdatingLocation] добавьте это условие:

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
         [locationManager requestAlwaysAuthorization];`
    

Затем будут вызваны только ваши методы делегата CLLocationManager.