didEnterRegion вызывается с большим радиусом (iOS)

Я хочу, чтобы didEnterRegion вызывался с большой точностью, но я не смог этого сделать. Вот что я сделал: я использовал лучшие значения distanceFilter и требуемой точности (наиболее точные настройки GPS в соответствии с Apple) и получил пункт назначения CLCircularRegion (подкласс CLRegion).

self.locationManager.distanceFilter = kCLLocationAccuracyBestForNavigation;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

@property (nonatomic, strong) CLCircularRegion *Destination;
self.Destination = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(43.907691, -69.963158) radius:5 identifier:@"Destination"];

[self.locationManager startMonitoringForRegion:self.Destination];

Проблема в том, что когда я нахожусь в 150 метрах от этого места назначения, вызывается didEnterRegion. Также на таком же расстоянии вызывается didExitRegion. Я хочу, чтобы didEnter и didExit регион вызывались, когда я на расстоянии 5 м, а не 150 м, как я указал при запуске CLCircularRegion. у кого-нибудь есть решение? Точность - это то, что мне нужно, и 150м вместо 5м для меня слишком неточно. Спасибо тонна -

(Я использовал iPhone 4S для тестирования)

1 ответ

Решение

В то время как теоретически возможна точность 5 м с текущим техническим оборудованием GPS+, возможно, Apple по разным причинам препятствует такой точности для мониторинга региона.

Во-первых, они всегда хотят хорошего пользовательского опыта, а 5-метровая точность, которую вы хотите, находится в пределах диапазона точности, который вы часто получаете из показаний GPS. Таким образом, выход из такой маленькой области также может происходить из-за более низких показаний точности, пока пользователь все еще находится в этой области. Apple действительно скрывает такие ошибки, устанавливая пороги для отправки уведомлений regionEnter или regionExit. Из документации Apple:

При тестировании кода мониторинга вашего региона в iOS Simulator или на устройстве следует понимать, что события региона могут происходить не сразу после пересечения границы региона. Чтобы предотвратить ложные уведомления, iOS не доставляет уведомления региона, пока не будут выполнены определенные пороговые условия. В частности, местоположение пользователя должно пересекать границу региона, отойти от границы на минимальное расстояние и оставаться на этом минимальном расстоянии не менее 20 секунд, прежде чем будут отправлены уведомления.

Конкретные пороговые расстояния определяются аппаратным обеспечением и технологиями определения местоположения, которые в настоящее время доступны. Например, если Wi-Fi отключен, мониторинг региона будет значительно менее точным. Однако для целей тестирования вы можете предположить, что минимальное расстояние составляет приблизительно 200 метров.

Тем не менее, поскольку вы можете запросить показания с высокой точностью, Apple также должна принять это во внимание. Альтернативой может быть - как вы прокомментировали - использовать didUpdateLocation: и определить, находится ли внутри или за пределами региона. Таким образом, вы можете включить тест на точность определения местоположения и принимать выход / вход только тогда, когда горизонтальная точность достаточно высока.

Другие вопросы по тегам