Службы определения местоположения в IOS, подсказка

Моему приложению нужны службы определения местоположения для работы, поэтому пользователю задают вопрос при первом запуске приложения. Если пользователь скажет «ОК», тогда все приложение будет запущено без него, потому что оно продолжит выполнять свою работу. Таким образом, первый запуск ничего не дает контроллеру представления.

Когда я нажимаю кнопку перехода в XCODE во второй раз, все работает нормально, потому что пользователь уже разрешил использование служб определения местоположения для получения широты/долготы.

У кого-нибудь была эта проблема раньше? Любой совет ?


person user3328028    schedule 07.03.2014    source источник
comment
в чем тогда проблема?   -  person Himanshu Joshi    schedule 07.03.2014
comment
проблема в том, что при первом запуске информация не передается в контроллер представления, она пустая. второй раз нормально!   -  person user3328028    schedule 07.03.2014
comment
Вы включили обновления местоположения в приложении? Проверьте это в разделе «Настройки службы определения местоположения в устройстве».   -  person Himanshu Joshi    schedule 07.03.2014
comment
да, потому что вы получаете запрос на авторизацию служб определения местоположения.   -  person user3328028    schedule 07.03.2014
comment
Итак, в первый раз он предлагает разрешить локальные службы, затем вы нажимаете «ОК», а затем приложение запускается без него, я думаю, что это больше связано с потоком приложения. во второй раз все идеально и работает нормально.   -  person user3328028    schedule 07.03.2014
comment
Вы использовали CLLocationManagerDelegate функции?   -  person Himanshu Joshi    schedule 07.03.2014
comment
Да, я использовал функцию делегата: didUpadeLocation. В этом методе есть первое, что нужно сделать, а именно отправить широту/долготу в базу данных. Так что, поскольку это не делается с первого раза, вот в чем проблема, может ли кто-нибудь посоветовать?   -  person user3328028    schedule 07.03.2014
comment
в основном все делается до того, как появится подсказка и спрашивается «Хотел бы x использовать текущее местоположение», ничего не следует делать до того, как появится подсказка   -  person user3328028    schedule 07.03.2014
comment
Хорошо, тогда ничего не делайте, пока ваш didUpadeLocation не вернет, что местоположение было обновлено, и вы решите свою проблему.   -  person AntonijoDev    schedule 07.03.2014


Ответы (2)


В вашем viewDidLoad:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager startUpdatingLocation];
person Himanshu Joshi    schedule 07.03.2014
comment
да, это первое, что нужно сделать в viewdidload, затем оно переходит к событию didUpdateLocation, которое получает lat.long и переходит к базе данных. но когда вы впервые устанавливаете приложение, появляется приглашение запросить авторизацию, но оно делает что-то до того, как это приглашение появится на экране. Мне нужно запустить приложение как минимум дважды, прежде чем табличное представление и метка появятся с правильными данными. - person user3328028; 07.03.2014
comment
Итак, вы говорите, что приложение получает координаты до того, как пользователь нажмет кнопку «ОК» в приглашении службы определения местоположения. - person Himanshu Joshi; 07.03.2014
comment
Нет, это не так, появляется приглашение, и оно переходит к делегату didUpdateLocation, все в порядке! но другие вещи, которые полагаются на данные из didUpdateLocation, запускаются раньше, и это все портит. Когда вы запускаете его во второй раз, он работает, потому что он уже получил ваше одобрение. - person user3328028; 07.03.2014
comment
Итак, на что вы смотрите, я не могу понять вашу проблему. - person Himanshu Joshi; 07.03.2014

Что вам нужно сделать, так это обновить свое представление после вызовов «didUpdateLocation» и вызвать «SetNeedsDisplay», чтобы ваше представление нарисовало себя для обновления. Вот так:

-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{

    self.LabellLatitude = [NSString stringWithFormat:@"%f",self.locationManager.location.coordinate.latitude];
    self.LabelLongitude = [NSString stringWithFormat:@"%f",self.locationManager.location.coordinate.longitude];
    [self.view setNeedsDisplay];

}

Еще лучше, если вы добавите индикатор активности в обновления местоположения.

Теперь, если вы вызываете это из своего класса «AppDelegate», вы можете использовать «NSNotificationCenter» для отправки сообщения в ваше представление, для обновления меток или представления или всего, что вам нужно, например:

#pragma mark - locationManager:
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{

    [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdatedLocation" object:nil userInfo:dictionary];


} 

И на вашем UIVIewController ViewDidLoad используйте это, чтобы зарегистрироваться в уведомлениях:

 //Adding self to notification Center:
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"UpdatedLocation" object:nil];

Надеюсь это поможет

person MCMatan    schedule 07.03.2014