Я разрабатываю мониторинг региона с 4-5 месяцев, и раньше он работал нормально. Неделю назад, когда мы тестировали код на устройстве с IOS 7.1, мы обнаружили проблему:
- когда обнаружен один зарегистрированный регион, он никогда не будет обнаружен снова, пока пользователь не удалится от этого региона на расстояние 10 км, если пользователь никогда не пересечет этот диапазон в 10 км, для этого региона не будут вызываться события входа/выхода. Если пользователь перемещается на расстояние 10 км от обнаруженного региона, будет вызвано его событие Exit, а когда пользователь вернется рядом с зарегистрированным регионом, только тогда будет запущено событие Enter.
Вот мой код: - я сделал одноэлементный диспетчер местоположений и инициализировал его в диспетчере местоположений:
if (locationManager == nil)
{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
if ([locationManager respondsToSelector:@selector(activityType)])
{
[locationManager setActivityType:CLActivityTypeFitness];
}
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[locationManager requestAlwaysAuthorization];
}
}
Затем я получаю текущее местоположение пользователя и отправляю его на сервер, чтобы получить близлежащие регионы геозоны, и регистрирую их для мониторинга следующим образом:
- (void)startRegionMonitoring:(NSArray*)regions { [self unregisterRegionMonitoring]; if ([Helper isValidForRegionMonitoring]) { [locationManager setDelegate:self]; int MAX_REGION = regions.count > 20 ? 20 : regions.count; for (int index=0; index<MAX_REGION; index++) { NSString *identifier = [NSString stringWithFormat:@"Identfier %d", index+1]; CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake([[[regions objectAtIndex:index] valueForKey:@"lat"] doubleValue], [[[regions objectAtIndex:index] valueForKey:@"lon"] doubleValue]); CLRegion *region = nil; double radius = 200.0; if ([Helper isIOS7]) { region = [[[CLCircularRegion alloc] initWithCenter:centerCoordinate radius:radius identifier:identifier] autorelease]; } else { region = [[[CLRegion alloc] initCircularRegionWithCenter:centerCoordinate radius:radius identifier:identifier] autorelease]; } [locationManager startMonitoringForRegion:region]; } } }
Я пробовал разные значения «distanceFilter», «DesiredAccuracy», а также играл с разными значениями радиуса контролируемых областей, чтобы исправить ошибку. но это не сработало.