didDetermineStateForRegion и didExitRegion, возвращающие ложные ответы

Я показываю пользователю локальное уведомление, когда он входит в область маяка и когда он выходит из области маяка. Выход является наиболее важным, потому что я говорю пользователю, как долго они жили в этом месте. Я использую мониторинг региона, потому что он позволяет мне отслеживать маяки, даже когда приложение находится в фоновом режиме или приостановлено. Я наблюдаю ошибку, когда наблюдаю за 3 маяками (это происходит с 2 и 1, но реже). Мой телефон будет спать, и я буду продолжать следить за маяками. Затем мое приложение будет работать из-за didExitRegion для одного из маяков, хотя все 3 маяка лежат на том же столе, что и мой телефон, лицом вверх. Каждый раз это разные маяки, поэтому я определил уровень сигнала. Затем, как только приложение проснется, оно повторно открывает маяк и сразу же снова входит (потому что оно никогда не оставляло сигнал в первую очередь). Я одновременно обнаруживаю сигналы на устройстве Android, и маяки вещают все время, поэтому iPhone не должен терять эти сигналы, особенно в течение достаточно длительного времени, чтобы считать его выходом.

Я попытался исправить это с помощью

[self.locationManager requestStateForRegion:region];

Тем не менее, в этих ситуациях это вернет состояние 2, которое является CLRegionStateOutside.

Как мне обойти это? У кого-нибудь был подобный опыт. Я должен быть в состоянии находиться в районе маяка в течение 1 минуты или 1 часа и получить выход только тогда, когда маяк не обнаружен в течение 30 секунд.

1 ответ

Решение

Несколько вещей, чтобы проверить:

  • Убедитесь, что это происходит с несколькими устройствами iOS. Возможно, что у устройства iOS есть аппаратная проблема, из-за которой у него слабый прием Bluetooth LE, или он принимает больше радиошума. Я никогда не видел это сам, но я слышал сообщения других, которые настаивают, что они видели это на некоторых устройствах iOS.

  • Проверьте уровень сигнала, принимаемого устройством iOS и устройством Android, путем определения радиомаяка с помощью приложения, такого как Locate для iOS и Android. Уровни сигнала должны быть одинаковыми на обоих устройствах. Сильный сигнал будет иметь RSSI около -60 или менее отрицательным. Слабый сигнал будет иметь RSSI около -100 или более отрицательным. Если у вас слабый сигнал, это может привести к прерывистым потерям при обнаружении, поскольку радиошум иногда препятствует правильному приему пакетов. Если вы можете настроить свои маяки для увеличения уровня мощности передатчика, сделайте это.

  • С приложением "Найти" на переднем плане установите маяк, чтобы проверить уровень сигнала и поверните его под разными углами. Некоторые маяки имеют диаграммы направленности антенны, которые намного слабее с одной стороны. Вы можете обнаружить, что ориентация дает гораздо более слабый сигнал, и, опять же, слабый сигнал может вызвать выпадение.

  • Проверьте спецификации или настройки конфигурации вашего маяка, чтобы увидеть, как часто ваши маяки передают. Маяки, которые настроены на редкую передачу для экономии заряда батареи (например, раз в 5 секунд), с большей вероятностью будут вызывать эту ситуацию, поскольку для выхода из региона требуется всего 6 пропущенных пакетов подряд (редко, но возможно).

Еще одна возможность заключается в том, что в вашем диапазоне частот Bluetooth периодически возникает необычное количество радиошума. Это маловероятно, но я видел это раньше. Я живу через дорогу от установки морской пехоты США с мощными антеннами, и дома я часто получаю гораздо более высокий уровень ошибок CRC, чем в офисе.

Другие вопросы по тегам