2015-08-03 3 views
0

В настоящее время я контролирую несколько местоположений, которые поддерживаются основными данными. Другими словами, я настроил цикл 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]; 
} 

ответ

2

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

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

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

}

0

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

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

А для чистого запуска вы можете удалить все регионы с этим:

for region in locationManager.monitoredRegions { 
      locationManager.stopMonitoringForRegion(region) 
} 
+0

Я принимаю DebugPrint = NSLog. Я знаю только цель c. –

+0

Точно. Извините за то, что вы не перевели это на Obj-C, я просто скопировал и вложил его в свой проект, надеясь, что смысл будет достаточно ясным. – MirekE

Смежные вопросы