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, чем в офисе.