Только в Telegram
Что работает лишь внутри клиента, чего не будет никогда и почему, и как приложение ведёт себя в обычном браузере.
Работает только в клиенте Telegram
| Возможность | Что происходит вне Telegram |
|---|---|
| Подтверждения и сообщения | Вместо системного диалога Telegram — обычный диалог браузера |
| Кнопка «назад» внутри шторок и вложенных экранов | Её просто нет |
| Тактильная отдача | Ничего не происходит |
| Ярлык на главный экран | Кнопки в настройках нет — вместо неё установка приложения средствами браузера, см. ниже |
| Сохранение обоев в «Фото» | Работает обычное скачивание файла |
Приложение не ломается без Telegram: обёртка над клиентом проверяет наличие каждой возможности отдельно и молча возвращает заглушку. Именно поэтому его можно открыть в браузере и пользоваться им всерьёз, а не только посмотреть.
Что работает и в браузере тоже
Всё остальное. Приложение полноценно и без Telegram: история пишется в IndexedDB, вход не требуется и не предлагается до настроек.
Синхронизация между устройствами — если войти. Кнопка «Войти через Telegram» живёт в настройках; вход идёт через Telegram OAuth, и дальше история едет журналом операций на сервер. Не входить — тоже рабочий сценарий, просто устройства друг о друге не знают.
Установка на телефон. У приложения есть манифест, иконки и офлайновый кэш, поэтому браузер предлагает «Установить приложение» (Android) или «На экран „Домой“» (iOS). Установленное открывается на весь экран, без адресной строки, и работает без сети — данные и так локальные, сеть нужна только синхронизации.
Внутри Telegram кэш намеренно не ставится: клиент кэширует и сам, а второй слой поверх него сделал бы вопрос «доехала ли новая сборка» неотвечаемым.
Чего нет и не будет
Системного виджета не будет
Виджет на домашнем экране iOS, macOS или Android требует нативного приложения из App Store или APK. Веб-страница внутри Telegram доступа к WidgetKit и AppWidget не имеет — это ограничение платформы, а не недоделка.
Эту роль закрывают три вещи: ярлык Telegram на главном экране, установка приложения из браузера и обои с состоянием заряда.
Уведомлений не будет
Web Push внутри Telegram недоступен. Единственный путь — сообщения от бота, а для них нужен планировщик и chat_id пользователя, который сам нажал Start.
Сервер у приложения теперь есть — он занят синхронизацией, — но рассылка это не «дописать маршрут», а отдельная обязанность: согласие, расписание, отписка, и молчание, когда человек приложением не пользуется. Пока её нет.
Настоящего «поделиться» не будет
Ссылку на достижение некому обслуживать: страница-визитка означала бы публичный адрес с чужими данными, а сервер существует ради обратного — чтобы данные доезжали только до ваших устройств. Поэтому «поделиться» означает «получить картинку и отправить её самому».
Как приложение узнаёт, где оно
По трём признакам сразу: объект Telegram.WebApp существует, поле initData определено, и платформа не unknown. Последнее отсекает шум в обычном браузере, где какое-нибудь расширение могло подсунуть пустышку.
Версию клиента спрашивать бесполезно
Облако включается по признаку реального клиента, а не по версии вебвью. Проверка isVersionAtLeast('6.9') была ошибкой: клиенты занижают заявленную версию — Telegram Desktop сообщает старую, хотя CloudStorage у него есть. Проверка отсекала облако целиком, приложение молча уходило в localStorage, и тот же аккаунт на компьютере открывался онбордингом.
Что именно определилось, видно в настройках — строки «Клиент» и «Где хранятся».
Что нельзя проверить автоматически
Скриншоты в этой документации сняты в настоящем браузере — см. «Скриншоты». Всё, что рисует сам клиент Telegram, туда не попадает и проверяется только руками:
- системные подтверждения и сообщения;
- кнопка «назад» клиента;
- тактильная отдача;
- системный диалог добавления ярлыка;
- меню «Поделиться»;
- настоящая синхронизация между двумя устройствами.
Ручной список — в чек-листе проверки.
Рядом
Данные и синхронизация · Обои с зарядом · Настройки · Чек-лист проверки
Как это работает внутри
- Обёртка —
src/telegram/sdk.ts. Каждый вызов проверяет наличие возможности, поэтому в остальном коде нет ни одногоif (webApp). isTelegram = webApp && initData !== undefined && platform !== 'unknown'.confirmDialog/alertDialog— системные при Bot API 6.2+, иначеwindow.confirm/window.alert.- Кнопка «назад» реализована стеком (
backStack): подписчиков может быть несколько, но обработчик в каждый момент ровно один, а прячется кнопка только когда стек опустел. homeScreen.status()имеет собственный предел ожидания 2,5 секунды: часть клиентов объявляет метод и не зовёт колбэк.files.downloadUrl()в приложении не используется: он требует публичный HTTPS-адрес, а не blob.initTelegram()при старте выключает вертикальные свайпы (Bot API 7.7+): иначе жест «потянуть вниз, чтобы закрыть» отбирал бы перетаскивание приоритетов.