Что не так с камерой
Вместо блокнотов наши официанты оформляют заказы в своём мобильном приложении. Быстро и удобно. Но порой случаются сбои. Не так давно во время сканирования QR-кода гостя в ресторане. При включении сканера в приложении картинка замирала (при этом сканирование не останавливалось), и оживала только во время касания экрана телефона.
Начали искать и выяснили, что причина возникновения бага с фризом в том, что в WebView по-умолчанию включено управление жестами (которые телефон получает с камеры). Некоторые телефоны просто не могли понять, куда им передавать видео поток — в <video> или в обработчике жестов.
Причина связана с особенностью параметров (settings) этой WebView. Нашли её путём сравнивания работы в обычном браузере и WebView. Там, оказывается, есть свойство, которое по умолчанию запрещало воспроизведение любого медиаконтента без вмешательства (нажатия и удержания пальца) пользователя.
Так пришли к выводу, что проблема именно в элементе <video>. Потом локально создали отдельное андроид приложение с этим WebView и начали копаться в его документации, там и нашли свойство, которое попробовали локально и бинго оно заработало. После всех проверок, команда А добавила это свойство в текущее приложение ПОСа.
Аббревиатура POS с английского переводится как точка продаж (Point of sale). Этот модуль в нашей Единой системе автоматизации (ЕСА) — основной канал приёма и обработки заказов в кафе, ресторанах и на фудкорте. А для наших кассиров и официантов он является главным рабочим модулем.
Ещё одна сложность была в том, что баг плавающий и проявлялся далеко не на каждом устройстве. Необходимо было ещё найти устройство с возможностью воспроизведения этого бага.
Эту проблему устранили и тут «прилетел» следующий баг со сменой id при тестировании решения с отключённым управлением жестами.
Новый баг
Официант в приложении включает камеру, а там вместо основной камеры включается фронтальная. Переключив на нужную камеру, можно продолжать с ней работать, оставаясь в приложении. Но как только приложение сворачивается, при новом запуске проблема с включением фронтальной камеры повторяется. Этот баг был замечен только в приложении на андроид.
О причинах
Стали искать причину. На телефонах, где баг воспроизводился в приложении, он не воспроизводился в браузере. Следовательно, проблема в приложении, но в чём она может заключаться, если приложение просто воспроизводит сайт через WebView?
Причины были в особенностях оболочки WebView (по сути отдельный браузер внутри приложения).
Причину нашли благодаря логическому анализу цепочек кода. Она заключалась в том, что в ней id устройства камеры менялся каждый раз при перезагрузке приложения. А поскольку в реализации фронта ПОСа при открытии сканера QR-кода и наличии id устройства камеры в localstore просто выбиралась камера с этим id, то при смене id камеры после перезагрузки страницы, камера оказывалась несуществующей.
Решением стало сохранение порядкового номера камеры и, при несовпадении deviceID с инициализированным значением из localStore, брать значение с сохранённым индексом из списка устройств.
Команда А оптимизировала мобильное приложение для официантов. Устранив причины зависания камеры при попытках отсканировать QR-код. После обкатки на предприятиях розницы приложение вскоре растиражируют на всю сеть.