Мы испытываем некоторые странные проблемы в местах из CCLocationManager, начиная с iOS9. У iOS 7-8 проблем нет. Странные местоположения вызывают ошибки в приложении. Приложение используется во время вождения автомобиля, и у нас около 50 тестовых пользователей в TestFlight, и некоторые из них сообщают об этих проблемах.
Приложение реагирует на обновления местоположения, каждое обновление местоположения, каждые 25 м и каждые 50 м есть что-то делать. Для теста я сохранил все эти местоположения в массиве. У наших тестовых пользователей есть кнопка, которая отправит мне историю в формате GPX по почте.
Например, следующие 12 мест, куда высылаете мне:
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="flitsmeister-ios-app-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<wpt lat="51.28165091" lon="5.77329012">
<datetimegps>2015-09-29T04:36:55.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:55.460</datetimeprocessed>
<course>61.5</course>
<speed>13.3</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.1</altitude>
<sequencenr>0</sequencenr>
</wpt>
<wpt lat="51.28138654" lon="5.77244497">
<datetimegps>2015-09-29T04:36:55.506</datetimegps>
<datetimeprocessed>2015-09-29T04:36:55.523</datetimeprocessed>
<course>69.3</course>
<speed>13.5</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.7</altitude>
<sequencenr>1</sequencenr>
</wpt>
<wpt lat="51.28171319" lon="5.77345935">
<datetimegps>2015-09-29T04:36:56.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:56.441</datetimeprocessed>
<course>61.2</course>
<speed>13.2</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.0</altitude>
<sequencenr>2</sequencenr>
</wpt>
<wpt lat="51.28138654" lon="5.77244497">
<datetimegps>2015-09-29T04:36:56.562</datetimegps>
<datetimeprocessed>2015-09-29T04:36:56.571</datetimeprocessed>
<course>69.3</course>
<speed>13.5</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.7</altitude>
<sequencenr>3</sequencenr>
</wpt>
<wpt lat="51.28177064" lon="5.77362548">
<datetimegps>2015-09-29T04:36:57.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:57.440</datetimeprocessed>
<course>60.1</course>
<speed>13.4</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>32.9</altitude>
<sequencenr>4</sequencenr>
</wpt>
<wpt lat="51.28138654" lon="5.77244497">
<datetimegps>2015-09-29T04:36:57.541</datetimegps>
<datetimeprocessed>2015-09-29T04:36:57.558</datetimeprocessed>
<course>69.3</course>
<speed>13.5</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.7</altitude>
<sequencenr>5</sequencenr>
</wpt>
<wpt lat="51.28182383" lon="5.77380183">
<datetimegps>2015-09-29T04:36:58.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:58.438</datetimeprocessed>
<course>61.2</course>
<speed>13.7</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.3</altitude>
<sequencenr>6</sequencenr>
</wpt>
<wpt lat="51.28138654" lon="5.77244497">
<datetimegps>2015-09-29T04:36:58.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:58.491</datetimeprocessed>
<course>69.3</course>
<speed>13.5</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.7</altitude>
<sequencenr>7</sequencenr>
</wpt>
<wpt lat="51.28188803" lon="5.77398322">
<datetimegps>2015-09-29T04:36:59.371</datetimegps>
<datetimeprocessed>2015-09-29T04:36:59.431</datetimeprocessed>
<course>61.5</course>
<speed>14.4</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.4</altitude>
<sequencenr>8</sequencenr>
</wpt>
<wpt lat="51.28202386" lon="5.77435235">
<datetimegps>2015-09-29T04:37:01.371</datetimegps>
<datetimeprocessed>2015-09-29T04:37:01.432</datetimeprocessed>
<course>61.2</course>
<speed>14.9</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.5</altitude>
<sequencenr>9</sequencenr>
</wpt>
<wpt lat="51.28188803" lon="5.77398322">
<datetimegps>2015-09-29T04:37:01.444</datetimegps>
<datetimeprocessed>2015-09-29T04:37:01.454</datetimeprocessed>
<course>61.5</course>
<speed>14.4</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.4</altitude>
<sequencenr>10</sequencenr>
</wpt>
<wpt lat="51.28208027" lon="5.77454128">
<datetimegps>2015-09-29T04:37:02.371</datetimegps>
<datetimeprocessed>2015-09-29T04:37:02.430</datetimeprocessed>
<course>61.9</course>
<speed>15.1</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.3</altitude>
<sequencenr>11</sequencenr>
</wpt>
<wpt lat="51.28188803" lon="5.77398322">
<datetimegps>2015-09-29T04:37:02.513</datetimegps>
<datetimeprocessed>2015-09-29T04:37:02.521</datetimeprocessed>
<course>61.5</course>
<speed>14.4</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.4</altitude>
<sequencenr>12</sequencenr>
</wpt>
<wpt lat="51.28217918" lon="5.77472677">
<datetimegps>2015-09-29T04:37:03.371</datetimegps>
<datetimeprocessed>2015-09-29T04:37:03.434</datetimeprocessed>
<course>61.5</course>
<speed>15.2</speed>
<accuracyhorizontal>5.0</accuracyhorizontal>
<accuracyvertical>3.0</accuracyvertical>
<altitude>33.5</altitude>
<sequencenr>13</sequencenr>
</wpt>
</gpx>
Если я напечатаю это местоположение на карте (геопланетщик - мой друг), я увижу это:
Примечание: точки B D F H находятся в одном месте, но для иллюстрации проблемы я поместил их в одну строку рядом друг с другом.
Как вы можете видеть, следуете ли вы последовательности A, B, C, вы увидите, что точка B не находится в нужном месте.
Начиная с сборки iOS9 почти каждый испытуемый испытывает эту ситуацию один или два раза в неделю.
Следуя некоторому коду, мы используем:
CLLocationManager (в среднем потоке):
_manager = [[CLLocationManager alloc] init];
_manager.delegate = self;
_manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_manager.activityType = CLActivityTypeAutomotiveNavigation;
_manager.pausesLocationUpdatesAutomatically = TRUE;
if([_manager respondsToSelector:@selector(allowsBackgroundLocationUpdates)])
_manager.allowsBackgroundLocationUpdates = TRUE;
[_manager requestAlwaysAuthorization];
В другом методе я вызываю start (также когда приложение запускает и останавливает его, когда оно завершается). (основной поток)
[_manager startUpdatingLocation];
Код для работы с локациями (я удалил некоторый код, чтобы этот пример был чистым):
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *lastLocation = [locations lastObject];
// test that the horizontal accuracy does not indicate an invalid measurement
if (lastLocation.horizontalAccuracy < 0)
return;
// test the age of the location measurement to determine if the measurement is cached
// in most cases you will not want to rely on cached measurements
NSTimeInterval locationAge = -[lastLocation.timestamp timeIntervalSinceNow];
if (locationAge > 5.0)
return;
NSDate *dateLocationArrived = [NSDate date];
CLLocation *beforeLocationRealtime = [self.LastLocationRealtime copy];
CLLocation *newLocation = [lastLocation copy];
//Realtime location.
[self setSpeedForLocation:[newLocation copy] withOldRealtimeLocation:[beforeLocationRealtime copy]];
[_delegateKaart updatedRealtimeLocation:newLocation fromPreviousLocation:[self.PreviousCurrentLocation copy]];
self.BeforeLastLocationRealtime = [self.LastLocationRealtime copy];
self.LastLocationRealtime = [newLocation copy];
if([self.CurrentLocation distanceFromLocation:newLocation] < 50) //Less then 50m?
{
if([_locationEach25m distanceFromLocation:newLocation] > 25)
{
//Nieuwe last 25m.
_locationEach25m = [newLocation copy];
//Each 25m do
[_delegateDashboard updatedLocation:[newLocation copy]];
[_delegateSignalering locationUpdated:[newLocation copy]];
[self holdLast200LocationsAndAddLocation:[lastLocation copy] withLocationArray:locations AndArriveDate:dateLocationArrived AndVerwerkt:TRUE];
}
else
[self holdLast200LocationsAndAddLocation:[lastLocation copy] withLocationArray:locations AndArriveDate:dateLocationArrived AndVerwerkt:FALSE];
return;//Stop
}
//Each 50m
[self holdLast200LocationsAndAddLocation:[lastLocation copy] withLocationArray:locations AndArriveDate:dateLocationArrived AndVerwerkt:TRUE];
_locationEach25m = [newLocation copy]; //Also new last 25m .
self.PreviousCurrentLocation = [self.CurrentLocation copy];//50m back.
self.CurrentLocation = [newLocation copy];
[_delegateDashboard updatedLocation:[newLocation copy]];
[_delegateSignalering locationUpdated:[newLocation copy]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[_delegateCountryDetector locationUpdated:[newLocation copy]];
[self setHuidigeWegForLocation:[newLocation copy]];
});
[[SignaleringController sharedInstance] runSignaleringCheckForLocation:[newLocation copy]];
}
Это похоже на ошибку iOS9 в locationmanager, которая дает мне неправильные результаты о местонахождении пользователя. Если я ищу Stackoverflow.com, мне кажется, что это единственный.
→ Пример2:
<wpt lat="52.32835728" lon="5.05861943">
<datetimegps>2015-10-01T06:27:29.905</datetimegps>
<datetimearrivedincode>2015-10-01T06:27:30.196</datetimearrivedincode>
<datetimeprocessed>2015-10-01T06:27:30.205</datetimeprocessed>
<c>138.4</c>
<s>26.5</s>
<accuracyhorizontal>10.0</accuracyhorizontal>
<accuracyvertical>6.0</accuracyvertical>
<al>5.9</al>
<nr>95</nr>
</wpt>
<wpt lat="52.32813366" lon="5.05927501">
<datetimegps>2015-10-01T06:27:31.905</datetimegps>
<datetimearrivedincode>2015-10-01T06:27:32.275</datetimearrivedincode>
<datetimeprocessed>2015-10-01T06:27:32.301</datetimeprocessed>
<c>119.5</c>
<s>26.0</s>
<accuracyhorizontal>10.0</accuracyhorizontal>
<accuracyvertical>4.0</accuracyvertical>
<al>5.7</al>
<nr>96</nr>
</wpt>
<wpt lat="52.32835728" lon="5.05861943">
<datetimegps>2015-10-01T06:27:33.196</datetimegps>
<datetimearrivedincode>2015-10-01T06:27:33.203</datetimearrivedincode>
<datetimeprocessed>2015-10-01T06:27:33.275</datetimeprocessed>
<c>138.4</c>
<s>26.5</s>
<accuracyhorizontal>10.0</accuracyhorizontal>
<accuracyvertical>6.0</accuracyvertical>
<al>5.9</al>
<nr>97</nr>
</wpt>
<wpt lat="52.32802075" lon="5.05960610">
<datetimegps>2015-10-01T06:27:32.905</datetimegps>
<datetimearrivedincode>2015-10-01T06:27:33.246</datetimearrivedincode>
<datetimeprocessed>2015-10-01T06:27:33.283</datetimeprocessed>
<c>119.2</c>
<s>26.3</s>
<accuracyhorizontal>10.0</accuracyhorizontal>
<accuracyvertical>4.0</accuracyvertical>
<al>5.3</al>
<nr>98</nr>
</wpt>
На карте:
Примечание: A и C находятся в точном месте, я вручную их изменил, чтобы показать, что A находится за C.
Странно следующее:
- 4rd/D имеет более раннее время GPS, затем пункт 3/C
- Как-то я не получил место для 06:27:31, но получил два 06:27:33
- 1st/A и 3rd/C имеют одинаковые GPS-координаты. Это не может быть правильно, потому что автомобиль ведет по шоссе 26 м/с (93 км/ч).
Точка 3 означает, что я не могу исправить ее, удерживая последнюю дату GPS и пропустить все, что было раньше, чем последнее.
→ Пример 3:
Перемещали двойные и неправильные точки порядка рядом друг с другом:
Просто перезагрузите точки, которые интересуются примечаниями ABCD.
Файл GPX с приведенного выше снимка экрана:
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="flitsmeister-ios-app-test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<wpt lat="51.89792674" lon="4.54830456">
<tgps>2015-09-29T15:23:40.999</tgps>
<tv>2015-09-29T15:23:53.850</tv>
<c>131.8</c>
<s>13.1</s>
<ah>5.0</ah>
<av>3.0</av>
<al>2.0</al>
<nr>464</nr>
</wpt>
<wpt lat="51.89745789" lon="4.54927853">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:23:53.910</tv>
<c>125.9</c>
<s>8.6</s>
<ah>5.0</ah>
<av>6.0</av>
<al>5.4</al>
<nr>465</nr>
</wpt>
<wpt lat="51.89745789" lon="4.54927853">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:23:53.929</tv>
<c>125.9</c>
<s>8.6</s>
<ah>5.0</ah>
<av>6.0</av>
<al>5.4</al>
<nr>466</nr>
</wpt>
<wpt lat="51.89745789" lon="4.54927853">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:23:53.932</tv>
<c>125.9</c>
<s>8.6</s>
<ah>5.0</ah>
<av>6.0</av>
<al>5.4</al>
<nr>467</nr>
</wpt>
<wpt lat="51.89762654" lon="4.54890185">
<tgps>2015-09-29T15:23:44.999</tgps>
<tv>2015-09-29T15:23:53.933</tv>
<c>128.0</c>
<s>13.4</s>
<ah>5.0</ah>
<av>4.0</av>
<al>0.6</al>
<nr>468</nr>
</wpt>
<wpt lat="51.89745789" lon="4.54927853">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:23:53.965</tv>
<c>125.9</c>
<s>8.6</s>
<ah>5.0</ah>
<av>6.0</av>
<al>5.4</al>
<nr>469</nr>
</wpt>
<wpt lat="51.89755810" lon="4.54904694">
<tgps>2015-09-29T15:23:45.999</tgps>
<tv>2015-09-29T15:24:02.016</tv>
<c>126.9</c>
<s>12.5</s>
<ah>5.0</ah>
<av>4.0</av>
<al>0.2</al>
<nr>470</nr>
</wpt>
<wpt lat="51.89800163" lon="4.54815385">
<tgps>2015-09-29T15:23:47.731</tgps>
<tv>2015-09-29T15:24:02.068</tv>
<c>132.9</c>
<s>12.8</s>
<ah>5.0</ah>
<av>4.0</av>
<al>2.3</al>
<nr>471</nr>
</wpt>
<wpt lat="51.89800163" lon="4.54815385">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:24:05.832</tv>
<c>132.9</c>
<s>12.8</s>
<ah>5.0</ah>
<av>4.0</av>
<al>2.3</al>
<nr>472</nr>
</wpt>
<wpt lat="51.89749909" lon="4.54917803">
<tgps>2015-09-29T15:23:46.999</tgps>
<tv>2015-09-29T15:24:05.842</tv>
<c>126.9</c>
<s>10.8</s>
<ah>5.0</ah>
<av>4.0</av>
<al>8.4</al>
<nr>473</nr>
</wpt>
<wpt lat="51.89800163" lon="4.54815385">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:24:06.289</tv>
<c>132.9</c>
<s>12.8</s>
<ah>5.0</ah>
<av>4.0</av>
<al>2.3</al>
<nr>474</nr>
</wpt>
<wpt lat="51.89745789" lon="4.54927853">
<tgps>2015-09-29T15:23:47.999</tgps>
<tv>2015-09-29T15:24:06.307</tv>
<c>125.9</c>
<s>8.6</s>
<ah>5.0</ah>
<av>6.0</av>
<al>5.4</al>
<nr>475</nr>
</wpt>
<wpt lat="51.89732735" lon="4.54958171">
<tgps>2015-09-29T15:23:52.999</tgps>
<tv>2015-09-29T15:24:06.339</tv>
<c>121.6</c>
<s>2.9</s>
<ah>5.0</ah>
<av>4.0</av>
<al>-2.3</al>
<nr>476</nr>
</wpt>
</gpx>
В этом файле проблема возникла пару раз, но, похоже, находится в двух проблемных местах. После этого никаких проблем больше, кроме как пользователь убил приложение после некоторого KM.
→ Я пробовал:
- Настройка ActivityType на CLActivityTypeAutomotiveNavigation
- Настройка pauseLocationUpdatesAuto - YES
- Желаемая эффективность для kCLLocationAccuracyBestForNavigation
- Перемещение всего в основной поток и не изменяйте нити.
- Расширение ведения журнала, чтобы узнать, содержит ли мой массив Location более одного объекта location, но это не так.
- Регистрация местоположения HASH и Pointer, но все они по-разному.
→ Я узнал:
- Не устанавливайте pausesLocationUpdatesAutomatically в FALSE. По умолчанию TRUE и для навигационного приложения он должен оставаться TRUE. Вы получите гораздо больше мест, если вы установите для этого значение ЛОЖЬ, места, которые не отличаются от других.
-
Устанавливать свойства в CLLocationManager один раз, когда вы меняете свойства на часто странные, и больше делегаций прибудет в делегат. В примере: если вы установите эти свойства в методе делегирования didUpdateLocation, вы получите 4 местоположения на той же миллисекунде.
_manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; _manager.activityType = CLActivityTypeAutomotiveNavigation;