Несколько локальных уведомлений сбой из didEnterRegion:

В настоящее время я отслеживаю несколько мест, которые подкреплены основными данными. Другими словами, я создал цикл for, который перебирает все сохраненные сущности в основных данных и создает контролируемую область для всех сущностей.

Проблема здесь заключается в том, что цикл for запускает несколько локальных уведомлений при входе в один из регионов. Количество уведомлений практически напрямую соответствует количеству отслеживаемых регионов. Так что я уверен, что это может быть причиной ошибки, но я не уверен на 100%.

Я заметил, что это похоже на общую проблему с мониторингом региона, но я не смог найти пример, включающий цикл for.

Как я могу остановить несколько уведомлений, вызываемых при вызове didEnterRegion?

Метод ниже вызывается в viewDidLoad. [DataSource sharedInstance].fetchedResultItems - это массив, который заполняется объектами fetchedObject из выбранного запроса.

-(void)startMonitoringRegions{
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [self.locationManager requestWhenInUseAuthorization];

        CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
        if (authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
            authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {
            self.locationManager.distanceFilter = 10;
            [self.locationManager startUpdatingLocation];

            for (POI *items in [DataSource sharedInstance].fetchResultItems){

                NSString *poiName = items.name;
                NSNumber *poiLatitude = items.yCoordinate;
                NSLog(@"value: %@", poiLatitude);
                NSNumber *poiLongitude = items.xCoordinate;
                NSLog(@"value: %@", poiLongitude);

                NSString *identifier = poiName;
                CLLocationDegrees latitude = [poiLatitude floatValue];
                CLLocationDegrees longitude = [poiLongitude floatValue];
                CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
                self.regionRadius = 10;

                self.region =  [[CLCircularRegion alloc] initWithCenter:centerCoordinate radius:400 identifier:identifier];
                [self.locationManager startMonitoringForRegion:self.region];
                NSLog(@"region: %@", self.region);
                NSLog(@"monitored regions %@", self.locationManager.monitoredRegions);

            }
        }
    }
}

Вот метод didEnterRegion

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"entered region!!");
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    if (localNotification) {
        localNotification.fireDate = nil;
        localNotification.alertBody = [NSString stringWithFormat:@"You are near %@", self.region.identifier];
        localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];
        localNotification.timeZone = [NSTimeZone defaultTimeZone];
    }
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//    [[UIApplication sharedApplication]presentLocalNotificationNow:localNotification];
}

2 ответа

Регионы действуют как общие ресурсы. Когда вы входите в любой регион, звонок будет переадресован всем менеджерам локаций. Я думаю, что где-то как-то вы создаете несколько объектов диспетчера местоположения. Это фактически вызывает многократный вызов didEnterRegion. Время вызова didEnterRegion в зависимости от количества зарегистрированных вами LocationManager. Вы должны написать код в AppDelegate, в этом методе

  • (BOOL) приложение:(UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {

// Поместите ваш код здесь

}

Просто совет по устранению неполадок. Вы можете использовать Obj-C, эквивалентный следующему, чтобы увидеть, какие регионы в настоящее время отслеживаются приложением. Возможно, проверка идентификаторов позволит пролить свет на проблему.

for region in locationManager.monitoredRegions {
            debugPrint(region.identifier)
}

И для чистого начала вы можете удалить все регионы с помощью этого:

for region in locationManager.monitoredRegions {
            locationManager.stopMonitoringForRegion(region)
}
Другие вопросы по тегам