2014-02-25 3 views
1

Я работаю над таким проектом, где приложения сделать следующие вещи:на основе текущего пользователя мониторинга местоположения области, Удалить Контролируемую область в iOS7

  1. Пользователя выбрать радиус (10 метров до 1000 метров) и перейти к next viewController, нажав кнопку «Перейти»
  2. Здесь приложения Захватите пользователей текущей позиции и запустите «мониторинг региона» на основе этой текущей позиции с выбранным радиусом
  3. Если пользователь пересекает эту определенную границу (от 10 метров до 1000 метров), то она выдает предупреждающее сообщение «ExitRegion». И снова начните «мониторинг региона», основываясь на новой новой позиции пользователей. И приложения продолжают делать это все время, как на переднем плане, так и в фоновом режиме. Мне это удается & работает отлично.

Но теперь для ограничения количества регионов, мониторинг «Мониторингом регионов», я хочу удалить каждый «контролируемый регион» после создания нового. Так что это должно произойти, как:

  • Начало области мониторинга на основе пользователей текущей позиции
  • Выход определенный регион & и получить «Выход Регион» предупредительное сообщение
  • Удалить «Контролируемые область» из stopMonitoringForRegion массива
  • Начать снова Регион Мониторинг на основе текущей позиции пользователей
  • Выход из определенного региона & и получение сообщения «Выход из региона»
  • Исключить этот «контролируемый регион» от stopMonitoringForRegion массив

И все должно продолжаться. Я пытаюсь это сделать, но он работает неправильно.

Вот мой код:

-(void)startLocationServices 
{ 
    if (self.locationManager == nil) 
    { 
     self.locationManager = [CLLocationManager new]; 
    } 
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [self.locationManager setDelegate:self]; 
    [self.locationManager setDistanceFilter:kCLDistanceFilterNone]; 
    //[self.locationManager startUpdatingLocation]; 
} 

-(void) monitoringRegion 
{ 
    if (flag == 0) 
    { 
     if (flagForRemovingRegion == 1) 
     { 
      // Remove monitored region from "monitoredRegions" array after monitor 5 regions 
      [self removingMonitoredRegion]; 
     } 

     CLLocationCoordinate2D center = CLLocationCoordinate2DMake(locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude); 

     CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:myval identifier:@"Test"]; 
     CLLocationDegrees radius = myval; 

     if (radius > self.locationManager.maximumRegionMonitoringDistance) 
     { 
      radius = self.locationManager.maximumRegionMonitoringDistance; 
     } 
     [self.locationManager startMonitoringForRegion:region]; 

     flag = 1; 
     flagForRemovingRegion = 1; 
     self.availabilityTextView.text = [@"Your selected Radius:" stringByAppendingFormat:@"%i", self.myval]; 
    } 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    flag = 0; 
    [self startLocationServices]; 
    [self monitoringRegion]; 
} 

-(void) removingMonitoredRegion 
{ 
    [locationManager stopMonitoringForRegion:[[[locationManager monitoredRegions] allObjects] objectAtIndex:0]]; 


} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region 
{ 
// // regions are stored by system 
    self.threeTextView.text = [@"Regions: \n\n" stringByAppendingFormat:@"%@", [[self.locationManager monitoredRegions] allObjects]]; 

    UIAlertView *alertViewOne = [[UIAlertView alloc] initWithTitle:@"Status" message:@"Region Monitoring started." delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 

    [alertViewOne show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
{ 
    UIAlertView *alertViewTwo = [[UIAlertView alloc] initWithTitle:@"Status" message:@"You Enter the region" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 

    [alertViewTwo show]; 
    self.availabilityTextView.text = @"You enter the region!"; 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    UIAlertView *alertViewThree = [[UIAlertView alloc] initWithTitle:@"Status" message:@"You Exit the region" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 

    [alertViewThree show]; 
    flag = 0; 
    self.availabilityTextView.text = @"You exit the region!"; 
    [self monitoringRegion]; 
} 

- (void) locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error 
{ 
    self.availabilityTextView.text = [@"\nError:" stringByAppendingFormat:@"%@", [error localizedDescription]]; 
} 

Я поставил flagForRemovingRegion, так что он не будет пытаться удалить «Контролируемые область» в начале приложений. Потому что в начале это NULL. Если кто-нибудь может понять мою проблему или предложить какое-либо предложение, ответьте пожалуйста. Спасибо в Advanced. Хорошего дня.

ответ

1

Вы пытаетесь удалить первый регион из NSSet, но на самом деле NSSet является неупорядоченной коллекцией, поэтому в вашем случае это неверно.

[locationManager stopMonitoringForRegion:[[[locationManager monitoredRegions] allObjects] objectAtIndex:0]]; 

Вы должны перебирать этот набор, чтобы найти свой регион или фильтровать его с помощью NSPredicate, но почему бы не остановить его в didExitRegion методе?

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    // your code here 

    [manager stopMonitoringForRegion:region]; 
} 
+0

благодарит за комментарии. Я стараюсь. Поместите '[manager stopMonitoringForRegion: region];' в метод 'didExitRegion' непосредственно перед' [self monitoringRegion]; 'и отправился проверять это, но он не работает. :( – Tulon

1

В яблочного документации государств о отслеживаемые областях NSSet:

объекты в этом наборе не обязательно могут быть одни и те же объекты, которые вы указанные во время регистрации. Только данные региона - это , поддерживаемые системой. Поэтому единственный способ однозначно идентифицировать зарегистрированный регион - это свойство его идентификатора.

Смотрите образец, как зарегистрировать/управлять своими регионами в моем приложении:

- (void)registerRegionWithCircularOverlay:(MKCircle*)overlay andIdentifier:(NSString*)identifier { 

    // If the overlay's radius is too large, registration fails automatically, 
    // so clamp the radius to the max value. 
    CLLocationDegrees radius = overlay.radius; 
    if (radius > sharedInst.locationManager.maximumRegionMonitoringDistance) { 
     radius = sharedInst.locationManager.maximumRegionMonitoringDistance; 
    } 
    // Create the geographic region to be monitored. 
    CLCircularRegion *geoRegion = [[CLCircularRegion alloc] 
            initWithCenter:overlay.coordinate 
            radius:radius 
            identifier:identifier]; 
    if([CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) 
     if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized){ 
      NSLog(@"we can monitor"); 
      Region* reg = [[Region alloc] init]; 
      reg.myRegion = geoRegion; 
      [sharedInst.regionsDict setObject:reg forKey:identifier]; 
      [sharedInst.locationManager startMonitoringForRegion:geoRegion]; 

      CLGeocoder *coder = [[CLGeocoder alloc]init] ; 
      CLLocation *myLocation = [[CLLocation alloc]initWithLatitude:geoRegion.center.latitude longitude:geoRegion.center.longitude]; 

      [coder reverseGeocodeLocation:myLocation completionHandler: 
      ^(NSArray *placemarks, NSError *error){ 
       CLPlacemark *placemark= [placemarks objectAtIndex:0]; 
       reg.myName = [NSString stringWithFormat:@"%@, %@", placemark.locality, placemark.thoroughfare]; 
       NSLog(@"we did monitor: %@", reg.myName); 
       [sharedInst saveData]; 
      }]; 

     } 
} 

И добавить новую область:

NSString* locId = [NSString stringWithFormat:@"KCC: %@", [[NSUUID UUID] UUIDString]]; 
    [self registerRegionWithCircularOverlay:circleOverlay andIdentifier:locId]; 

Вы должны найти способ, чтобы управлять ими используя идентификатор.

+0

Извините за поздний ответ Спасибо за то, что я посмотрел на «контролируемые регионы NSSet:', я думаю, используя «уникальную идентификацию», мониторинг будет гораздо более конкретным и точным. Можете ли вы сказать мне, куда мне идти, или как я могу выполнить эту работу.Это будет очень полезно, если вы можете предоставить ссылку или руководство по этому вопросу. Потому что код, который вы указали выше, мне не совсем понятен. Еще раз спасибо. Оставайтесь в порядке. :) – Tulon

+0

Привет. Функция регистра из документации Apple, и это довольно просто, она начнет контролировать регион на основе двух аргументов, mkoverlay и идентификатора nsstring. Я использую UUID только для создания уникальной строки. У вас больше работы, чтобы отслеживать отслеживаемые идентификаторы, чтобы находить их в контролируемых регионах nsset и т. Д. –

+0

Хорошо, поймите. Из-за того, что вы работаете с ним, я просто хочу спросить вас, здесь, в моей перспективе (я говорю о тех моментах, которые я сделал над своим сообщением), возможно ли это сделать отлично? В настоящее время приложения, с которыми я поддерживаю, - это простой regionMonitoring, который основан на текущем местоположении пользователей. Но это не дает точное сообщение «ExitRegion». Спасибо. – Tulon