2013-11-22 5 views
0

Я играю с Corelocation и iBeacons. У меня есть уведомления, вызванные при входе и выходе из региона, и я могу варьировать маяки и т. Д. Это все хорошо.Контролирующий вид с близостью iBeacon

Однако я попадаю в беспорядок. Я хочу загрузить второй вид рядом с конкретным маяком, а затем закрыть этот вид, когда мы отодвинемся от этого маяка, промойте и повторим для второго маяка.

я борюсь с:

  • как остановить вызывая изменение зрения, поскольку в пределах не останавливается. Если я вручную остановлюсь на ранжировании или использую bool для проверки, если я уже нахожусь во втором представлении, это нормально, но кажется беспорядочным.

  • Как закрыть вид, если я уйду от маяка. Для этого я думаю, что я не могу остановить ранжирование, иначе я не знал бы, если я уйду.

Мой код приведен ниже.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

} 

- (void)viewDidAppear:(BOOL)animated { 

    // Setup Beacon Manager 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    NSUUID *uuid = [[NSUUID alloc]initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"]; 
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"Beacon Region"]; 
    [self.locationManager startMonitoringForRegion:self.beaconRegion]; 
    [self.locationManager requestStateForRegion:self.beaconRegion]; 
    self.beaconStatLabel.text = @"StartLocationServices"; 



    //check to see if this is the first time we've run the app 
    if ([[NSUserDefaults standardUserDefaults] floatForKey:@"tBHasRun"] == 0) { 
     [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"tBHasRun"]; //set the time run to 1 
     [self performSegueWithIdentifier:@"firstRunSegue" sender:self]; 
     self.beaconStatLabel.text = @"FIRST RUN"; //set the label text 
    } else { 
     self.beaconStatLabel.text = @"REPEAT RUN"; //set the label text 
    } 

} 


    //Looking for and dealing with regions 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    //looking for a region means looking for a beacon or set of beacons that share a UUID 
    [self.locationManager requestStateForRegion:self.beaconRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    //if we found a region we start ranging (looking for beaocns) 
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; 
    self.regionState.text = @"Region Entered"; 

    //we'll also test sending a notification 
    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"Welcome! Go upstairs, bring beer."; 
    notification.soundName = UILocalNotificationDefaultSoundName; 
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    //we have left the region so we'll stop ranging 
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion]; 
    self.regionState.text = @"Region Exited"; 

    //we'll also test sending a notification 
    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"Thankyou for coming. For information on our next MeetUp check our MeetUp page."; 
    notification.soundName = UILocalNotificationDefaultSoundName; 
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
} 

    //dealing with individual beacons 

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
    //once beacons are ranged we enter this method 

    //we'll grab and log the signal strength of the beacons 
    for (int i = 0; i < [beacons count]; i++) { 
     CLBeacon *singleBeacon = [[CLBeacon alloc]init]; 
     singleBeacon = [beacons objectAtIndex:i]; 
    } 


    //we get the latest beacon in the array - the closest beacon (strongest signal) 
    CLBeacon *beacon = [[CLBeacon alloc] init]; 
    beacon = [beacons lastObject]; 

    //update the info labels 
    self.uuidLabel.text = beacon.proximityUUID.UUIDString; 
    self.majorLabel.text = [NSString stringWithFormat:@"%@", beacon.major]; 
    self.minorLabel.text = [NSString stringWithFormat:@"%@", beacon.minor]; 

    //we store some information about that beacon 
    NSNumber *beaconMajor = beacon.major; //it's major (group) number 
    NSNumber *beaconMinor = beacon.minor; //it's minor (individual) number 

    //we then call the manageBeacon method and pass through the minor, major, and proximity values 
    [self manageBeaconWithMinor:beaconMinor AndMajor:beaconMajor AtRange:beacon.proximity]; 

} 

- (void)manageBeaconWithMinor:(NSNumber *)minorNumber AndMajor:(NSNumber *)majorNumber AtRange:(CLProximity)proximity { 
    //in this method we work out what do do based upon the beacon we are connected to and the range 

    //for this test we'll look for the mint beacon and call a view 
    if (([minorNumber floatValue] == 59204) && ([majorNumber floatValue] == 33995) && (proximity == CLProximityNear)) { 
     //we are going to open up content 
     [[tBGlobalStore sharedInstance]setInContentTrue]; 
     NSLog([[tBGlobalStore sharedInstance] getInContent] ? @"Yes" : @"No"); 
     //the beacon numbers match the beacon we are expecting so we'll call the next screen 
     [self performSegueWithIdentifier:@"mainToContent" sender:self]; 
    } 
} 

Дополнительная информация с консоли показывает, что она пытается вызвать просмотр более одного раза.

2013-11-22 15: 24: 56,487 testingBeacons [670: 60b] --- 2013-11-22 15: 24: 56.489 testingBeacons [670: 60b] ----- 2013-11- 22 15: 24: 56.490 testBeacons [670: 60b] Beacon at: 2013-11-22 15: 24: 56.490 testBeacons [670: 60b] 0 2013-11-22 15: 24: 56.491 testingBeacons [670: 60b] имеет RSSI из: 2013-11-22 15: 24: 56.492 тестированиеБиконы [670: 60b] -75 2013-11-22 15: 24: 56.492 тестированиеБаконы [670: 60b] ----- 2013-11- 22 15: 24: 56.493 testBeacons [670: 60b] --- 2013-11-22 15: 24: 56.495 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 24: 56.497 тестированиеБиконы [670: 60b] --- 2013-11-22 15: 24: 56.498 тестированиеБиконы [670: 60b] ----- 2013-11-22 15: 24: 56,498 Испытание на изгиб [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 56.499 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 56.499 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 56.500 испытанияБиконы [670: 60b] -75 2013-11-22 15: 24: 56.500 испытанияБиконы [670: 60b] ----- 2013-11-22 15: Испытание 24: 56.501Биконы [670: 60b] --- 2013-11-22 15: 24: 57.487 ТестированиеБиконы [670: 60b] --- 2013-11-22 15: 24: 57.489 тестированиеБиконы [670: 60b] - ---- 2013-11-22 15: 24: 57.489 testingBeacons [670: 60b] Маяк по адресу: 2013-11-22 15:24: 57.490 ТестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 57.490 ИспытаниеБаконы [670: 60b] имеет RSSI: 2013-11-22 15: 24: 57.491 тестированиеБиконы [670: 60b] -75 2013 -11-22 15: 24: 57.491 Испытание на изгиб [670: 60b] ----- 2013-11-22 15: 24: 57.492 тестированиеБиконы [670: 60b] --- 2013-11-22 15:24: 57.493 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чья точка зрения отсутствует в иерархии окон! 2013-11-22 15: 24: 57.495 ИспытаниеБеконов [670: 60b] --- 2013-11-22 15: 24: 57.495 тестированиеБиконы [670: 60b] ----- 2013-11-22 15: 24: 57.496 Тестирование бегемонов [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 57.496 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 57.497 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 57.497 testBeacons [670: 60b] -75 2013-11-22 15:24:57.498 испытанийБиконы [670: 60b] ----- 2013-11-22 15: 24: 57.499 тестированиеБиконы [670: 60b] --- 2013-11-22 15: 24: 57.500 testBeacons [670: 60b] Предупреждение : Попытка представить, чья точка зрения отсутствует в иерархии окон! 2013-11-22 15: 24: 58.488 испытанияБиконы [670: 60b] --- 2013-11-22 15: 24: 58.489 испытанияБиконы [670: 60b] ----- 2013-11-22 15: 24: 58.490 ТестированиеБиконы [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 58.490 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 58.491 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 58.491 испытаниеИзоны [670: 60b] -76 2013-11-22 15: 24: 58.492 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 24: 58.492 testBeacons [670: 60b] --- 2013-11-22 15: 24: 58.493 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 24: 58.494 испытанияБиконы [670: 60b] --- 2013-11-22 15: 24: 58.495 испытанияБаконы [670: 60b] ----- 2013-11-22 15: 24: 58.496 ТестированиеБаконы [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 58.496 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 58.497 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 58.497 испытанияБиконы [670: 60b] -76 2013-11-22 15: 24: 58.498 испытанияБиконы [670: 60b] ----- 2013-11-22 15: 24: 58.499 testBeacons [670: 60b] --- 2013-11-22 15: 24: 58.500 testBeacons [670: 60b] Предупреждение: попытайтесь представить, чей взгляд не в иерархии окон! 2013-11-22 15: 24: 59.488 испытанияБиконы [670: 60b] --- 2013-11-22 15: 24: 59.489 испытанияБаконы [670: 60b] ----- 2013-11-22 15: 24: 59.489 ТестированиеБаконы [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 59.490 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 59.490 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 59.491 испытаниеБиконы [670: 60b] -75 2013-11-22 15: 24: 59.491 тестированиеБиконы [670: 60b] ----- 2013-11-22 15: 24: 59.492 testBeacons [670: 60b] --- 2013-11-22 15: 24: 59.493 testingBeacons [670: 60b] Предупреждение: попытайтесь представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 24: 59.494 Испытание на изгиб [670: 60b] --- 2013-11-22 15: 24: 59.495 ИспытаниеБаконы [670: 60b] ----- 2013-11-22 15: 24: 59.495 ТестированиеБаконы [670: 60b] Маяк по адресу: 2013-11-22 15: 24: 59.496 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 24: 59.496 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 24: 59.497 испытанияИзоны [670: 60b] -75 2013-11-22 15: 24: 59.498 тестированиеБиконы [670: 60b] ----- 2013-11-22 15: 24: 59.498 testingBeacons [670: 60b] --- 2013-11-22 15: 24: 59.500 testingBeacons [670: 60b] Предупреждение: попытка представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 25: 00.487 испытанияБиконы [670: 60b] --- 2013-11-22 15: 25: 00.488 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 25: 00.489 ТестированиеБаконы [670: 60b] Маяк по адресу: 2013-11-22 15: 25: 00.489 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 25: 00.490 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 25: 00.490 испытанияВиконы [670: 60b] -75 2013-11-22 15: 25: 00.491 testingBeacons [670: 60b] ----- 4444516410617451515053691061745151505369106174588 2013-11-22 15: 25: 00.491 testBeacons [670: 60b] --- 2013-11-22 15: 25: 00.492 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 25: 00.493 тестированиеБиконы [670: 60b] --- 2013-11-22 15: 25: 00.494 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 25: 00.494 ТестированиеБаконы [670: 60b] Маяк по адресу: 2013-11-22 15: 25: 00.495 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 25: 00.495 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15:25:00.496 Испытания на изгиб [670: 60b] -75 2013-11-22 15: 25: 00.496 тестированиеБиконы [670: 60b] ----- 2013-11-22 15: 25: 00.497 тестированиеБиконы [670: 60b] - - 2013-11-22 15: 25: 00.498 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чей взгляд не в иерархии окон! 2013-11-22 15: 25: 01.488 испытанияВаконы [670: 60b] --- 2013-11-22 15: 25: 01.489 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 25: 01.489 ТестированиеБеконов [670: 60b] Маяк по адресу: 2013-11-22 15: 25: 01.490 testBeacons [670: 60b] 0 2013-11-22 15: 25: 01.490 testBeacons [670: 60b] имеет RSSI : 2013-11-22 15: 25: 01.491 испытаниеБиконы [670: 60b] -72 2013-11-22 15: 25: 01.492 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 25: 01.492 testBeacons [670: 60b] --- 2013-11-22 15: 25: 01.493 testingBeacons [670: 60b] Предупреждение: попытка представить, чья точка зрения не находится в иерархии окон! 2013-11-22 15: 25: 01.494 испытанияБиконы [670: 60b] --- 2013-11-22 15: 25: 01.495 тестированиеБаконы [670: 60b] ----- 2013-11-22 15: 25: 01.495 ТестированиеБиконы [670: 60b] Маяк по адресу: 2013-11-22 15: 25: 01.496 тестированиеБиконы [670: 60b] 0 2013-11-22 15: 25: 01.497 тестированиеБиконы [670: 60b] имеют RSSI : 2013-11-22 15: 25: 01.497 испытанияБиконы [670: 60b] -72 2013-11-22 15: 25: 01.498 тестированиеБиконы [670: 60b] ----- 444451641061745151505369106174588 2013-11-22 15: 25: 01.498 testingBeacons [670: 60b] --- 2013-11-22 15: 25: 01.499 testingBeacons [670: 60b] Предупреждение. Попытайтесь представить, чья точка зрения не находится в иерархии окон!

+0

Не могли бы вы пояснить, «потому что ранжирование не останавливается»? Вы имеете в виду, что вы в основном видите «мерцание», потому что диапазон Near iBeacon может стать довольно нервным, когда вы на краю? –

+0

Я имею в виду, что даже если вы рядом с маяком, внутри CLProximityNear метод didRangeBeacons является непрерывным. В журнале вы можете увидеть, как он пытается загрузить UIView снова и снова. – mrEmpty

+0

Интересно, поэтому ваши призывы к didEnterRegion и didExitRegion не «сбалансированы»? @mrEmpty –

ответ

1

didRangeBeacons: вызывается один раз в секунду для каждого маяка и не отслеживает изменения в близости для вас.

CLLocationManagerDelegate Reference

То, что я рекомендовал бы делать это encapsultating отслеживание радиомаяка в его собственном классе, который отвечает за:

  1. Управление мониторинга радиомаяка
  2. Держа хэш конкретных iBeacons и их тока диапазоны.
  3. Вызов метода протокола, уведомляющий делегата (ваш контроллер представления) или даже NSNotificationCenter, когда произошел сбой в определенном iBeacon (который вы знаете, потому что вы поддерживаете хэш недавних маяков/близость).
+0

Это интересно, я рассмотрю методы протокола. Спасибо. Я буду держать вопрос открытым в настоящее время на тот случай, если кто-то еще хочет прослушивать. – mrEmpty

+0

NSNotificationCenter выглядит как простое решение, перестраивающее приложение сейчас. Благодарю. – mrEmpty

4

Мы столкнулись с подобной проблемой. Но проблема в любом решении: есть ошибка в том, как Apple обрабатывает диапазон и близость, и вы получите случайные переключения и вызовы didExitRegion.

Смотрите здесь:

http://beekn.net/2013/11/ibeacon-tutorial-dealing-with-errors/

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

Мы обработали идею viewController, остановившись после того, как вы нажмете viewController и перезапустите его, как только пользователь закроет viewController.

  1. После: [себе performSegueWithIdentifier: @ "mainToContent" Отправитель: само];

Добавить:

[self.locationManager stopRangingBeaconsInRegion: self.beaconRegion];

  1. Для того, чтобы перезапустить начиная после того, как пользователь закрывает ViewController, добавьте:

// ViewWillAppear перезапускает stopRanging когда OutsideViewController выталкивается - (Недействительными) viewWillAppear: (BOOL) анимированный { [сам .locationManager startRangingBeaconsInRegion: self.beaconRegion]; }

ПРИМЕЧАНИЕ. Если вы хотите автоматически закрыть viewController в зависимости от изменения региона, у вас возникнет проблема быстрого нажатия и выталкивания: вы нажмете viewController, а затем быстро закроете, откройте, закройте .... проблема заключается не в коде, а в том, что Apple API не всегда может решить, в каком регионе он находится.

ВОЗМОЖНОЕ РЕШЕНИЕ? «Хэком» может быть добавить счетчик: мы обнаружили, что вы будете держать телефон близко к маяку, и он будет быстро переключаться между ближайшим/немедленным, даже если вы НЕ перемещаете свой телефон и сигнал маяка фактически не меняется. Это «ошибка» Apple! Но это будет делать только один или два раза.

Один из вариантов, чтобы добавить счетчик: эквивалент «только если вы Обнаружен изменить регион три или четыре раза, вы должны инициировать событие»

Другой вариант заключается в добавлении времени: «Только инициировать событие, основанное на изменении области, если его было 4 секунды, когда область изменилась »

Опять же - проблема заключается не в том, что вы получите внезапные переключения (нажатие VC или вытаскивание его из стека), потому что вы «re» между зонами »- проблема заключается в следующем:

A. API Apple API не всегда может правильно определить, будете ли вы немедленно/рядом/далеко и будете шудить nly изменить его разум

B. Apple иногда отключает службы определения местоположения, казалось бы, случайным образом и менее чем за секунду, заставляя ваше приложение снова войти в регион и снова начать колебаться.

+0

Здравствуйте, @BEEKn - Кажется, у Apple все еще есть работа, это довольно новый и неясный API, поэтому я не удивлен. Я решил создать своего собственного маякового менеджера и обработать сообщение с NSNotificationCenter. Я напишу свой код, когда он работает. – mrEmpty

+0

Awesome - вы также можете проверить ibeacon-utils на GitHub. На самом деле я не могу заставить его дать разрешение на LocationServices, но есть хорошее представление о том, как он настроен. – BEEKn

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