Чтобы помочь другим, кто столкнулся с такой же проблемой, я хотел бы поделиться с вами ответом отличной команды Google.
Возможная причина
В прошлом , некоторые производители мобильных устройств провели чрезмерно агрессивную оптимизацию, чтобы снизить энергопотребление, и сломали стек местоположения. Такая оптимизация обычно срабатывала, когда устройство оставалось неподвижным, и вызывала получение Geofencer неправильного местоположения, что затем приводило к ложному событию EXIT. А позже результат правильного местоположения приведет к другому результату ENTER. Такие скачки местоположения и рассылка спама по событиям Geofencer нарушили многие важные сценарии использования Geofencer.
Итак, мы добавили некоторый защитный механизм на стороне Geofencer для защиты Geofencer от получения ложных результатов определения местоположения. Когда устройство неподвижно и у него есть активное соединение Wi-Fi, мы останавливаем запросы местоположения и игнорируем любые результаты определения местоположения, если точность была недостаточно высокой. При изменении подключения к Wi-Fi, либо устанавливается новое подключение Wi-Fi, либо устройство теряет подключение к Wi-Fi, либо устройство перемещается между разными точками доступа в одной сети Wi-Fi, Geofencer немедленно отправляет запрос местоположения. для определения того, вошло ли устройство в геозону или вышло из нее.
Чего ожидать
Потому что, когда устройство подключено к Wi-Fi, мы не проверяем местоположение устройства, когда оно неподвижно. Это означает, что если мы добавим новую геозону вокруг текущего местоположения пользователя, мы не сможем получить событие ENTER до тех пор, пока пользователь не начнет ходить с устройством (больше не будет), или пока не изменится подключение к Wi-Fi (либо отключено, либо или в роуминге). Если пользователь остается на одном месте в течение длительного времени, мы ожидаем, что начальное событие ENTER будет отложено.
Обычно такой недостаток не является проблемой для реальных случаев использования. Потому что, когда пользователь входит или выходит из Geofence, устройство всегда должно находиться в «движущемся» состоянии. Другими словами, мы не должны ожидать, что событие Geofencing сработает, когда устройство еще не работает. Если мы хотим принудительно запускать событие Geofencing, когда устройство еще не работает, выключение и повторное включение Wi-Fi было бы обходным решением для целей отладки.
Почему устройства Samsung становятся хуже?
Подводя итог, когда устройство неподвижно и имеет активное подключение к Wi-Fi, Geofencer прекратит активную выборку местоположения устройства, и мы ожидаем, что недавно добавленные Geofences будут иметь гораздо более длительную задержку для начального события. Однако, по данным вашей компании, некоторые устройства все еще могут получать события Geofencing. Причина в том, что у нас могут быть другие приложения, работающие на устройстве, которые также время от времени запрашивают местоположение. Хотя Geofencer не запрашивает местоположение, он все равно может использовать результаты пассивного определения местоположения, запрошенные другими приложениями, если результаты определения местоположения считаются «достаточно точными».
Мы ожидаем, что поведение будет одинаковым для всех телефонов модели. Однако, по данным вашей компании, у устройств Samsung больше проблем, чем у других мобильных устройств. Мы запросили отчет об ошибке от вашей компании. Из отчета об ошибке мы заметили, что когда устройство двигалось, результаты определения местоположения FLP были довольно точными. Круг точности обычно был ниже 15 метров:
08-17 14:29:39 location=Location[fused lat,lng hAcc=13 ]
08-17 14:30:01 location=Location[fused lat,lng hAcc=15 ]
08-17 14:31:39 location=Location[fused lat,lng hAcc=14 ]
08-17 14:32:07 location=Location[fused lat,lng hAcc=14 ]
08-17 14:33:39 location=Location[fused lat,lng hAcc=14 ]
08-17 14:34:02 location=Location[fused lat,lng hAcc=14 ]
08-17 14:34:23 location=Location[fused lat,lng hAcc=14 ]
08-17 14:34:43 location=Location[fused lat,lng hAcc=13 ]
08-17 14:35:39 location=Location[fused lat,lng hAcc=14 ]
08-17 14:36:02 location=Location[fused lat,lng hAcc=13 ]
Но когда устройство на некоторое время стало неподвижным и когда запрашивалось местоположение, круг точности стал намного больше. Обычно более 30 метров, иногда более 40 метров:
08-17 17:14:18 location=Location[fused lat,lng hAcc=43 ]
08-17 17:15:13 location=Location[fused lat,lng hAcc=43 ]
08-17 17:15:18 location=Location[fused lat,lng hAcc=43 ]
08-17 17:17:18 location=Location[fused lat,lng hAcc=43 ]
08-17 17:19:18 location=Location[fused lat,lng hAcc=43 ]
08-17 17:21:24 location=Location[fused lat,lng hAcc=43 ]
08-17 17:21:56 location=Location[fused lat,lng hAcc=43 ]
И:
08-17 17:24:45 location=Location[fused lat,lng hAcc=39 ]
08-17 17:27:27 location=Location[fused lat,lng hAcc=39 ]
08-17 17:28:11 location=Location[fused lat,lng hAcc=39 ]
08-17 17:32:03 location=Location[fused lat,lng hAcc=39 ]
08-17 17:34:10 location=Location[fused lat,lng hAcc=39 ]
08-17 17:38:11 location=Location[fused lat,lng hAcc=39 ]
Когда пассивные местоположения недостаточно точны, Geofencer просто их бросает и выигрывает ' t использовать их для расчета событий Geofencing. Мы не наблюдаем подобного поведения на устройствах других производителей.
Как обойти проблему?
Как мы описали ранее, обычно это не проблема для реальных случаев использования. Когда пользователь входит или выходит из Geofence, устройство всегда должно двигаться. Кроме того, когда пользователь входит или выходит из дома или На рабочем месте вполне вероятно, что произойдет изменение подключения к Wi-Fi, что может привести к немедленному запросу местоположения и в ближайшее время вызвать соответствующую геозону. Так что нам не нужно делать ничего особенного, чтобы обойти эту проблему на производственных устройствах, даже на Samsung. Единственная проблема - это начальные события для вновь добавленных геозон. Если клиентское приложение заботится об этих событиях и не может терпеть начальную задержку, клиентское приложение может запросить местоположение, чтобы определить, находится ли оно внутри каких-либо недавно добавленных геозон.
При выполнении отладки весьма вероятно, что устройство отладки по-прежнему имеет активное соединение Wi-Fi. Так что трюк с переключением Wi-Fi может очень помочь. Еще одно преимущество этого трюка заключается в том, что при использовании фиктивного местоположения для отладки клиентских приложений Geofencer Geofencer обычно отклоняет фиктивное местоположение. Использование трюка с переключением Wi-Fi и принудительное использование Geofencer фиктивного местоположения.
Возможные будущие изменения на стороне Geofencer
Невозможность инициировать начальные события Geofencer может быть проблемой для некоторых случаев использования . Мы можем обновить Geofencer, чтобы обеспечить правильную активацию начальных событий Geofencing, даже если устройство все еще работает. Таким образом, в будущем нам, возможно, больше не потребуется запрашивать местоположение на стороне клиентского приложения для расчета начальных событий.
Однако возможность запускать начальные события Geofencing не означает, что начальные события Geofencing всегда будут запускаться немедленно . Чтобы избежать чрезмерного запроса местоположения, мы никогда не будем запрашивать местоположение сразу после добавления новой геозоны. Вместо этого мы будем планировать только запросы местоположения с заданной скоростью. Таким образом, даже после нашего будущего обновления можно ожидать задержки в несколько минут до начальных событий Geofencing.