Приложение GPS перестало работать на iOS 5 - Location Manager не обновляется - PullRequest
3 голосов
/ 22 октября 2011

Я разработал приложение для iOS 4.3. Работало нормально. Но с тех пор, как я перешел на iOS 5.0, приложение начало показывать странное поведение. Менеджер местоположений не показывает обновления при изменении позиции. Кто-нибудь сталкивался с такой проблемой?

Спасибо за любую помощь.

Ответы [ 4 ]

4 голосов
/ 24 ноября 2011

У меня была моя доля оплаты за проезд с менеджером CLLocation, странные проблемы с обновлением при переходе с iOS 4.x на 5:

  1. Подклассифицировали ли вы объект CLLocationManager?

    • проблема : в этом случае когда-нибудь методы-делегаты иногда не вызывают (например, didUpdateLocation).

    • исправление : не создавать подкласс CLLocationManager

  2. Является ли экземпляр CLLocationManager из Singleton?
    • проблема : использование объекта CLLocationManager в качестве свойства одноэлементного объекта работало нормально в 4.x, но было несовместимо в iOS5
    • fix :переместите объект в объект, не являющийся единичным
  3. Если что-то из перечисленного помогает, или вы пытались, и это не удалось
    • проблема : по какой-то причине CLLocationManager все еще не запускается из основного потока , и поэтому вы испытываете странное поведение.
    • fix # 1 : создайте объект CLLocationManager каксвойство в appDelegate без его подкласса.( это решение доказало свою эффективность даже на взломанных iphone ).вы по-прежнему можете использовать динамическое свойство, указывающее на его экземпляр из синглтона, если ваш дизайн аналогичен случаю 2.
    • fix # 2 : более грязное решение - убедиться, что оно запускается изосновной цикл запуска, используя executeSelectorOnMainThread или другим способом

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

1 голос
/ 25 октября 2011

Способ управления памятью в iOS 5 может быть одним из способов.Если вы объявляете переменную в своем файле .h и не ссылаетесь на нее правильно или неявно [self.myVar doSomething];это может свалиться на тебя без твоего ведома.Он все равно будет хорошо скомпилирован, но в основном будет проигнорирован и пропущен.

Не 100% без просмотра кода, но я заметил эту проблему также с некоторыми старыми программами нашей компании, когда вышла iOS 5.Удачи.

0 голосов
/ 23 ноября 2011

В приложении, где местоположение было кэшировано, возникла временная проблема.Иногда службы определения местоположения возвращают местоположение дольше, чем ожидалось, и вместо этого оно возвращает последнее кэшированное местоположение.См. этот документация по iOS пример, в котором используется переменная howRecent для фильтрации местоположений, которые, вероятно, кэшируются.

На всякий случай, если Apple изменит свой URL, соответствующий метод делегата будет указан здесь:

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
  // If it's a relatively recent event, turn off updates to save power
  NSDate* eventDate = newLocation.timestamp;
  NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
  if (abs(howRecent) < 15.0)
  {
    NSLog(@"latitude %+.6f, longitude %+.6f\n",
          newLocation.coordinate.latitude,
          newLocation.coordinate.longitude);
  }
  // else skip the event and process the next one.
}

Это эффективно игнорирует любые местоположения старше 15 секунд.В нашем приложении мы установили интервал 5.0, но вам придется поэкспериментировать, чтобы увидеть, что вам подходит.

0 голосов
/ 20 ноября 2011

Ключевые классы, содержащиеся в платформе Core Location: CLLocationManager и CLLocation. Экземпляр CLLocationManager класс создается внутри приложения и набор свойств для указания уровень точности определения местоположения, требуемый приложением. Затем диспетчер местоположения получает указание начать отслеживание местоположения информация:

CLLocationManager *locationMgr = 
      [[CLLocationManager alloc] init];
locationMgr.desiredAccuracy = kCLLocationAccuracyBest;
locationMgr.delegate = self;

[locationMgr startUpdatingLocation];

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

Также, если вам было интересно, я получил эту информацию отсюда, и она сделана специально для iOS 5: http://www.techotopia.com/index.php/Getting_iPhone_Location_Information_using_the_iOS_5_Core_Location_Framework

...