2011-01-13 2 views
0

У меня возникла странная проблема с расположением на iPhone. Он выглядит просто сумасшедшим, но он кажется воспроизводимым. В моем приложении я использую Core Location для получения данных о местоположении для некоторых действий пользователя. Обычно это работает. Но в самом первом запуске после того, как приложение было развернуто на устройстве без предыдущей версии (не имеет значения с XCode или через iTunes), оно вообще не работает. Ни
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
ни
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
называются. Я даже не получаю координаты сотовых вышек. Единственный знак, который работает GPS, - это всплывающее окно, которое просит разрешить доступ к данным о местоположении. Если я уйду из приложения (и, бросив, я имею в виду, что я действительно убиваю его, а не просто помещаю в фоновый режим), при следующем запуске все обычно начинает работать нормально.iPhone Location Данные не работают при первом запуске

Дополнительная информация. Как мне нужно получить местоположение, где пользователь делает определенные действия, я использую следующий подход:

  • я использую тот же общий CLLocationManager объект (с kCLLocationAccuracyBest) и тем же общим объект делегата.
  • Когда пользователь выполняет действие, я вызываю startUpdatingLocation и создаю фоновый поток, в основном таймер, но есть что-то еще не связанное. Он просыпается один раз каждые 15 секунд.
  • Я аккумулирую исправления, полученные - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
  • Когда фоновый поток пробуждается, он проверяет исправления и время. Если есть достаточно хорошее исправление, оно перестает ждать. Если интервал времени в 1 минуту превышен, он также перестает ждать.
  • «Остановка ожидания» = вызов какого-либо метода. Этот метод ищет лучшее исправление среди полученных (если есть) и обрабатывает его. Также он называет stopUpdatingLocation

Я не вижу никаких очевидных недостатков таким образом. И более того, тот же самый двоичный файл обычно начинает работать во втором запуске. Любые идеи почему? Я сошел с ума?

+0

Когда вы запускаете приложение во второй раз, есть ли всплывающее окно? Если нет, в вашем коде может возникнуть какое-то состояние гонки, которое будет вызвано этим всплывающим окном. –

+0

Я подумал об этом, но это, похоже, не связано. iPhone запоминает реакцию пользователей на разрешениях и сохраняет их по умолчанию после нескольких одинаковых ответов. Исправления не получаются даже без такого всплывающего окна (при первом запуске). – SergGr

ответ

2

Кажется, что я нашел ответ сам. Мое приложение требует некоторых начальных приготовлений. Разница заключалась в том, что при первом запуске я делаю небольшую одноразовую работу (некоторая большая синхронизация по сети). Эта длинная задача выполняется в фоновом потоке. Тот же поток затем выполняет «общую инициализацию», включая создание объекта CLLocationManager. Конечно, фоновый поток затем быстро умирает, оставляя CLLocationManager без RunLoop. На втором запуске нет необходимости в большой синхронизации, и «обычная инициализация» выполняется в потоке пользовательского интерфейса. Поэтому CLLocationManager работает на основном RunLoop и с радостью доставляет исправления.

Подводя итог: при создании объекта CLLocationManager жизненно важно сделать это на правой нити (или, скорее, на NSRunLoop/CFRunLoop).

Смежные вопросы