Все начинается с простой идеи: давайте измерим сколько пользователь проводит времени в приложении при каждом визите.
И вроде бы формула проста: необходимо из времени конца визита вычесть время начала. И если с началом проблем нет, то вот как измерить окончание — непонятно. Можно попытаться отловить событие закрытия вкладки и после уже отправить запрос. Но нет гарантии, что запрос дойдет до сервера, ведь браузер при закрытии вкладки старается подчистить все используемые ресурсы, а также отменяет еще невыполненные запросы. Если мы успели отправить — супер, нам повезло. Но если нет — что делать?
Можно в память устройства класть эти данные и тогда доотправлять при следующем визите. Однако, если пользователь зайдет к нам только через месяц, то эта память уже может быть очищена (привет, Safari), да и такой подход не совсем реал-тайм и больше походит на танцы с бубнами.
Если просто начать гуглить эту проблему, то вы быстро наткнетесь на Beacon API, поддержка которого просто отличная.
Технология позволяет делать маячки. То есть запросы, не требующие ответа. Примечательно в Beacon API то, что запрос отправляет не вкладка браузера, а сам браузер (!), причем согласно спецификации, если запрос был поставлен в очередь на отправку, то браузер гарантировано его отправит. Именно поэтому нам уже не важно, что происходит с вкладкой браузера, ведь сам браузер теперь является отправителем.
Выделю в Beacon API две вещи:
1️⃣Оффлайн. Если свернуть браузер, то сеть для вкладок замораживается. Что логично: зачем приложению тратить ресурсы на то, что пользователь уже не использует. Однако маячки все равно будут доставлены как только сеть восстановится. Опять же, Г - гарантия.
2️⃣Маячки не участвуют в гонке за ресурсы. Можно не стесняться и отправлять маячки на каждый чих. На производительность приложения это не повлияет, если верить спецификации (к Safari доверия нет, поэтому будьте осторожнее). Из воображения: можно слушать все события и отправлять через beacon скриншоты — так получится видос как пользователь работал с приложением (похоже на вебвизор яндекс метрики).
Beacon API отлично подойдет для аналитики и логирования. Других вариантов использования я пока не придумал.
Спецификация ☑️