Почему мой делегат CLLocationmanager не вызывается? - PullRequest
20 голосов
/ 17 сентября 2010

Я не получаю никаких обратных вызовов ни на сим, ни на устройстве.У меня вызывается этот код:

- (void)startLocationCallbacks: (NSObject*) ignore
{
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
  locationManager.distanceFilter = MINIMUM_METERS;

  [locationManager startUpdatingLocation];
  NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}

и операторы журнала в верхней части

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

и

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

, но ни один оператор журнала никогдавызывается.Уведомления о местоположении включены для моего приложения (как показано в настройках, плюс я сказал «разрешить»)

По каким возможным причинам я не получаю обновления местоположения?

Конфиг / другая информация:

  • Я выделил locationManager и сохранил его в свойстве сохранения.
  • Я вызвал startUpdatingLocation
  • Я использую4.1 SDK
  • Проблема возникает как на Sim, так и на iPod-touch (2nd Gen) и iPhone-3, все работают 4.1
  • Уведомления о местоположении разрешены в моем приложении (обакак указано в разделе «Настройки», и потому что я нажал «разрешить» в предупреждении.)
  • До этого я успешно использовал CLLocationManager (во многих приложениях для доставки!)1032 *

    Спасибо!

Ответы [ 5 ]

48 голосов
/ 17 сентября 2010

Уф!Хорошо, я нашел это.

Оказывается, что один из способов заставить CLLocationManager не запускать обратные вызовы местоположения - это выполнить всю настройку в не главном потоке.Когда я переместил процедуру установки на performSelectorOnMainThread, все заработало точно так, как ожидалось.

Какой кошмар!

Надеюсь, этот ответ поможет другим ...

Редактирование / уточнение:

Первоначально у меня было что-то вроде этого:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
     // ...[app setup, snip]
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}

- (void)postLaunchSetupThread
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // ...[other setup, snip]
    [self setupLocationManager];
    [pool release];
}

- (void)setupLocationManager
{
     self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
     [myLocationManager startLocationUpdates];
}

Но вызов setupLocationManager в потоке предотвращал обратные вызовы.Поэтому я решил переместить линию

[self setupLocationManager];

из нити и обратно в appDidFinishLaunchingWithOptions

15 голосов
/ 11 февраля 2012

На самом деле вы можете запустить его и из другого потока.Из документации Apple:

Конфигурация объекта вашего менеджера местоположений всегда должна выполняться в потоке с активным циклом выполнения, например в основном потоке вашего приложения.

Просто убедитесь, чтоваш цикл выполнения выполняется в этом потоке, и отправляются события CLLocationManager.Подробнее о цикле выполнения: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

1 голос
/ 22 января 2015

Для iOS 8

1) Я разместил эти строки сразу после инициализации менеджера местоположений.

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

2) Я добавил NSLocationAlwaysUsageDescription в список и установил его встрока и добавил сообщение.3) В моей цели я нажал на вкладку «Возможности», а затем включил фоновые режимы и проверил «Обновления местоположения» и «Использование аксессуаров Bluetooth LE»

Это сработало для меня

0 голосов
/ 22 марта 2015

В моем случае это было из-за того, что мое устройство не смогло определить местоположение - во время пребывания в помещении GPS-сигнал был недоступен, и Wi-Fi также был отключен, поэтому диспетчер местоположения просто не смог получить данные о местоположении, а делегат никогда не вызывался ,

Как только я подключился к Wi-Fi, это сработало (я думаю, что переход на улицу тоже должен помочь, но иногда это не очень удобно :))

0 голосов
/ 30 января 2013

// проверить это //...CLLocationManager не вызывает метод делегата должным образом

// ... после серии исследований я использую сторожевой методон называет "

https://stackoverflow.com/questions/7156920/didupdatetolocation-doesnt-gets-called-immediately/14605889#14605889

...