Как установить время для интервала сканирования для 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; } } } 

Вы не можете изменить интервал сканирования маяка на 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, используя, например, таймер. Обратите внимание, что это решение не будет работать в фоновом режиме и не очень энергоэффективно.

  • locationManager: rangeBeaconsDidFailForRegion: withError: kCLErrorDomain 16
  • Запуск iPhone в качестве iBeacon в фоновом режиме
  • UILocalNotification Устанавливается только один раз в ios7
  • Могу ли я транслировать несколько сигналов ibeacon только из одного bluetooth? и как
  • CLRegionState UnKnown Когда я в регионе
  • CoreBluetooth для маяков
  • Понимание дистанции ibeacon
  • Как перезагрузить экземпляр менеджера CoreBluetooth с фиксированным интервалом в фоновом режиме
  • Множественные реализации CLLocationManager
  • Реклама CoreBluetooth в фоновом режиме на iOS 10
  • Возможно, что stopRangingBeaconsInRegion останавливает уведомления о контролируемой области?
  • Interesting Posts

    сохранить текущего пользователя в отношении в синтаксическом анализе с быстрым

    Как отправить электронную почту с помощью Gmail api в swift

    Использование амазонок Cognito Developer Identities

    Прозрачный (альфа) градиент с Core Graphic iPhone

    UIButton – какой цвет подсветки изображения по умолчанию

    Альтернатива методам автоопределения UIView, которые должны быть устаревшими

    NSNumberFormatter numberFromString добавляет небольшую долю при преобразовании определенных чисел

    Офлайн-приложение iOS: загружает мой манифест, но не работает в автономном режиме

    Делегировать для AVCaptureVideoDataOutput и AVCaptureAudioDataOutput

    Как получить ответ после интеграции UPI с помощью гиперссылки

    UIScrollview внутри UIpageviewcontroller

    Нажатие на <label> в Mobile Safari

    как я могу воспроизводить звуковой сигнал тревоги более 30 секунд, например, приложение для будильника?

    Общаться с устройством BTLE из фонового приложения iOS

    iOS Keychain Services: разрешены только определенные значения для ключа kSecAttrGeneric?

    Давайте будем гением компьютера.