Как-то мы получили жалобу от игрока в ВК
добрый вечер. Все обновилось. Игра началась с самого начала. У меня были покупки и прокачка на макс. обидно как то.
Странно, подумали мы. Повезло, что к этому времени у нас уже были реализованы бэкапы сейвов на наш сервер, и, не без труда, но мы смогли восстановить игроку прогресс.
Потом мы получиили ещё одну аналогичную жалобу. И ещё. В какой-то момент, мы реализовали возможность восстановить сейв через промокод (загружаем сейв на сервер, игрок вводит промокод и игра затирает локальный сейв тем, что получила с сервера). Стало легче восстанавливать прогресс, но причину не удавалось обнаружить.
Чтобы найти причину, мы добавляли подробные дебаг логи работы системы сохранений, и в какой-то момент удалось поймать ошибку. Суть ошибки была, что сохранение «испорчено». Надо сказать, что сохранения у нас шифруются (спасибо автору видео), и было непонятно, как именно оно испорчено. Добавили логирование сохранения до шифрования, и спустя какое-то время и ещё одного несчастного игрока в ВК выяснилось, что:
В VKWebAppStorageSet
Сохраняются только первые 4096 символов, для сериализованной строки — 2236 символов.
Что я естественно не заметил при интеграции с ВК. Или может заметил, но не подумал на тот момент, что наши сейвы станут такими большими. Причем, страдали именно игроки с большим прогрессом, так как сейв разрастается по мере получения игроком новых портретов, скинов и апгрейдов.
Технически проблема решается не очень сложно, при сейве надо просто делить строку на части по 4096 символов, и отдельным ключом сохранять количество частей. При чтении сейва сначала запрашиваешь количество частей, потом все нужные части. Плюс можно сделать оптимизацию, и первым запросом к VKWebAppStorageGet сразу запрашивать количество частей и первую часть - с высокой вероятностью, весь сейв поместится в первую часть.
Но у меня есть ряд риторических вопросов к ВК:
1) Почему вообще есть такое ограничение? Яндекс разрешает 200 КБ, и это выглядит разумной экономией места, но 4096 символов, серьезно?
2) Почему длина сериализованной строки должна быть ещё меньше, всего 2236 символов? В чем для вас разница?
3) Что вообще такое сериализованная строка? В документации про это ни слова. Как я должен понять, чем они отличаются?
4) Пока искал, что такое сериализованная строка, наткнулся на этот пост. Серьезно? До 2023 года данные хранились всего год?
#игры_вконтакте