Как установить время для интервала сканирования для iBeacon на iOS?

Я разрабатываю приложение с поддержкой iBeacon. В принципе, у меня есть одно представление, которое обновляет его содержимое в соответствии с ближайшим маяком и сканирует маяки, я не использую фреймворк (только CoreLocation от Apple) , хотя я использую «Оценочные маяки».

Проблема в том, что мое приложение не обнаруживает маяки мгновенно, мне нужно подождать около 5 секунд перед маяком, чтобы обновить контент, в то время как приложение Estimote обнаруживает маяки в течение 1-2 секунд. Мои маяки оценки настроены на рекламу каждые 960 мс.

Как это возможно? Могу ли я установить временной интервал для сканирования маяков? Как улучшить мое приложение, чтобы обновить представление быстрее?

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

// ViewController.h ================= @property (strong, nonatomic) CLLocationManager *locationManager; // ViewController.m ================= -(void)initBeaconMonitor { NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:estimoteBeaconUUID]; _region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID major:estimoteBeaconMajor identifier:beaconRegionIdentifier]; self.locationManager = [[CLLocationManager alloc] init]; // For iOS 8 if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [self.locationManager requestAlwaysAuthorization]; } self.locationManager.delegate = self; self.locationManager.pausesLocationUpdatesAutomatically = NO; [self.locationManager startMonitoringForRegion:_region]; [self.locationManager startRangingBeaconsInRegion:_region]; [self.locationManager startUpdatingLocation]; } -(void)locationManager:(CLLocationManager *)manager didRangeBeacons: (NSArray *)beacons inRegion:(CLBeaconRegion *)region { if(beacons.count > 0) { CLBeacon *nearestBeacon = beacons.firstObject; if(nearestBeacon == _lastBeacon) { return; } _lastBeacon = [nearestBeacon copy]; switch(nearestBeacon.proximity) { case CLProximityFar: break; case CLProximityNear: [self updateViewWithBeacon:nearestBeacon]; break; case CLProximityImmediate: [self updateViewWithBeacon:nearestBeacon]; break; case CLProximityUnknown: return; } } } 

3 Solutions collect form web for “Как установить время для интервала сканирования для iBeacon на iOS?”

Вы не можете изменить интервал сканирования маяка на iOS. Когда вы находитесь на переднем плане, iOS будет постоянно сканировать маяки, так что это не то, что вызывает задержки.

Проблема в том, что логика приложения будет обновлять интерфейс только после того, как CoreLocation определит, что маяк находится в близости / немедленной близости, а маяк ближе всего к сортированной позиции в массиве маяков. Как сортировка, так и значение поля proximity основаны на CoreLocation расстояния CoreLocation до маяка (поле accuracy ), и это основано на 20-секундном среднем CoreLocation уровня сигнала между мобильным устройством и маяком. Именно это 20-секундное среднее значение вызывает задержки, о которых вы упоминаете, потому что оценка расстояния медленно обновляется и не достигает устойчивого состояния, пока мобильное устройство не находится в одном и том же месте относительно всех маяков в течение 20 секунд. К сожалению, эти 20 секунд фиксированы и не настраиваются.

Для более быстрого реагирования вы можете прекратить использование поля accuracy и отсортированного порядка маяка в массиве. Несколько альтернатив:

  1. Измените свою логику, чтобы не основываться на расстоянии вообще, возможно, на основе времени и того, какие маяки были замечены раньше.

  2. Переключитесь на использование поля rssi в качестве прокси для расстояния. Это поле усредняется только за 1 с, но имейте в виду, что он имеет столько же, сколько изменчивость из-за радиошумов. Менее отрицательные значения для этого поля указывают более близкие маяки. Увеличение частоты передачи маяка, как предлагает @heypiotr в его ответе, поможет дать более стабильные номера RSSI.

  3. Вручную рассчитывайте собственное среднее значение RSSI за более короткий интервал времени (2-5 секунд) для лучшего компромисса между быстрыми обновлениями в оценке расстояния и стабильности.

Вы можете узнать больше о том, как работает iBeacon range:

http://developer.radiusnetworks.com/2014/12/04/fundamentals-of-beacon-ranging.html

Уменьшение рекламного интервала вашего маяка должно улучшить отзывчивость, просто имейте в виду, что это происходит за счет срока службы батареи. Что-то около 300-400 мс обычно является хорошим компромиссом между первым и последним. Вы можете использовать приложение iOS Estimote для настройки вашего маяка.

iOS использует рекламные пакеты маяка, чтобы оценить расстояние до маяка, и, таким образом, определить зону близости (дальний / ближний / немедленный). Обычно требуется собрать хотя бы несколько пакетов, чтобы убедиться, что оценка более или менее правильная. Вот почему реклама с более высокой частотой должна помочь.

Вы также можете включить CoreBluetooth и сканировать ваш маяк, как для обычного устройства BLE. При этом вы можете принудительно обновить сканирование bluetooth, используя, например, таймер. Обратите внимание, что это решение не будет работать в фоновом режиме и не очень энергоэффективно.

  • Правильный способ найти ближайший маяк
  • Можно ли обнаружить радиомаяки Gimbal со стандартными iOS-библиотеками
  • iOS - событие триггера при близости с помощью iBeacons
  • почему мой делегат didEnterRegion не звонил?
  • Userlocation с маяками Trilateration
  • locationManager: метод didRangeBeacons не обнаруживает устройство BLE
  • iBeacon на переднем плане со статической библиотекой
  • Невозможно обнаружить Beacon, когда устройство уже находится в диапазоне Beacon, и затем мы включаем Bluetooth и приложение убито
  • Можем ли мы обнаружить маяки iBeacon на iOS?
  • iPhone OS не соответствует версии развертывания приложения
  • CoreBluetooth для маяков
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.