Я создаю приложение iOS 8, которое использует GeoFencing. У меня возникли проблемы, которые я объясню позже. Но во-первых, это то, как создать регион и контролировать его:район мониторинг не вызывает didExitRegion, если условия
Переменные в файле заголовка:
@property (nonatomic, strong) CLLocationManager *locationManager;
viewDidLoad:
// Initialize locationManager
self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager requestAlwaysAuthorization];
// Set the delegate
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLLocationAccuracyBest;
Создание региона:
- (CLRegion*)mapDictionaryToRegion:(NSDictionary*)dictionary
{
NSString *title = [dictionary valueForKey:@"title"];
CLLocationDegrees latitude = [[dictionary valueForKey:@"latitude"] doubleValue];
CLLocationDegrees longitude =[[dictionary valueForKey:@"longitude"] doubleValue];
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
CLLocationDistance regionRadius = [[dictionary valueForKey:@"radius"] doubleValue];
return [[CLRegion alloc] initCircularRegionWithCenter:centerCoordinate
radius:regionRadius
identifier:title];
}
Старт мониторинг его:
-(void)startMonitoringForDictionary:(NSDictionary *)dictionary
{
// Start monitoring for the supplied data
CLRegion *region = [self mapDictionaryToRegion:dictionary];
[self.locationManager startMonitoringForRegion:region];
}
Прослушивание области пересечения:
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"Error: %@", error);
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
NSLog(@"didEnterRegion");
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
NSLog(@"exited region");
}
Я запомнил эти ключи в моей целевой информации:
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
Проблема:
Иногда, когда я вхожу в регион, он работает безупречно. Оба didEnterRegion и didExitRegion называются ожидаемыми. Но похоже, что я добавляю область внутри нее, а затем выходим - она не будет вызывать didExitRegion. Только если он сначала вызывает didEnterRegion.
Что я спрашиваю:
Может кто-то пожалуйста, объясните «правила» для мониторинга области, и как устройство управляет ею, сообщает об этом, будит приложение, и т.д.? Кроме того, я прочитал в документации, что я не должен ожидать обновлений чаще, чем каждые 5 минут. (Эта вещь, которую я делаю на практике, вычисляет, как долго вы проводили внутри региона) - что, если пользователь входит, тогда существует быстро - тогда didExitRegion никогда не будет вызван, пока я не войду снова?
Спасибо! Erik
Hi @Erik, вы придумали решение для этого? –
@QuentinMalgaud Привет! Я не нашел конкретной проблемы или решения, но после многократного изменения и изменения кода я получил его на работу. Я недавно сделал свое приложение, чтобы иметь новый дизайн и более чистый код, и он работал безупречно, даже если я добавил область внутри нее. Просто пройдите каждый шаг и убедитесь, что вы сделали все. Там может быть что-то скрытое в точности и спецификации фильтра, хотя - взгляните на тех, кто, возможно, – Erik