В настоящее время я контролирую несколько местоположений, которые поддерживаются основными данными. Другими словами, я настроил цикл for, который проходит через все сохраненные объекты в основных данных и создает контролируемый регион для всех объектов.Несколько локальных уведомлений сбой из didEnterRegion:
Проблема заключается в том, что цикл for запускает множество локальных уведомлений при входе в один из регионов. Количество уведомлений почти напрямую соответствует количеству контролируемых регионов. Поэтому я уверен, что это может быть причиной ошибки, но я не уверен на 100 процентов.
Я заметил, что это, по-видимому, обычная проблема с мониторингом региона, но я не смог найти пример, который включает цикл for.
Как остановить множественные уведомления, вызванные при вызове didEnterRegion?
Метод, приведенный ниже, называется viewDidLoad. [DataSource sharedInstance] .fetchedResultItems - это массив, который заполняется с помощью fetchedObjects из запрошенного запроса.
-(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];
}
Я принимаю DebugPrint = NSLog. Я знаю только цель c. –
Точно. Извините за то, что вы не перевели это на Obj-C, я просто скопировал и вложил его в свой проект, надеясь, что смысл будет достаточно ясным. – MirekE