** в head.\n\n7. **Тест:** Inline-кнопка → WebView? `tg.initDataUnsafe.user` есть?\n\n[Полный чеклист из DEV.to](https://dev.to/simplr_sh/telegram-mini-apps-creation-handbook-58em). После — initData работает, sendData шлет.\n\nГотово. Ваш WebApp в Telegram.\n\n---\n\n## Источники {#sources}\n\n1. [Init Data | Telegram Mini Apps](https://docs.telegram-mini-apps.com/platform/init-data)\n2. [Telegram Mini Apps Creation Handbook - DEV Community](https://dev.to/simplr_sh/telegram-mini-apps-creation-handbook-58em)\n3. [Telegram WebApps. Как встроить веб-приложения в чат-бота? / Хабр](https://habr.com/ru/articles/706446/)\n4. [Интеграция Mini Apps в боты Telegram: пошаговое руководство для начинающих](https://aglamov.biz/marketing/telegram/integracija-mini-apps-v-boty-telegram-poshagovoe-rukovodstvo-dlja-nachinajushhih)\n5. [Что такое Telegram Web App (Mini App) и как создать свое мини приложение](https://timeweb.cloud/tutorials/react/telegram-web-app-kak-sozdat-mini-prilozhenie-v-telegram)\n6. [Telegram Web App. Всё о Mini Apps / Хабр](https://habr.com/ru/companies/amvera/articles/935718/)\n7. [Telegram Mini Apps | core.telegram.org](https://core.telegram.org/bots/webapps)\n\n---\n\n## Заключение {#conclusion}\n\nTelegram WebApp в Safari вместо WebView — типичная засада на HTTPS, BotFather whitelist, редиректах или хедерах вроде X-Frame-Options/CSP. Диагностика через curl и DevTools занимает минуты, фикс — час. После правок initData заполнится, \"TEST MODE\" исчезнет, и ваше мини-приложение заработает везде, включая iOS. Главное — точный матч домена и чистый HTTPS. Тестируйте на реальном production-боте — и вперед!"},{"name":"Как исправить открытие Telegram WebApp в Safari вместо WebView","step":[{"name":"Проверьте HTTPS-сертификат: используйте curl -I и убедитесь в 200 OK без ошибок","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":1},{"name":"Добавьте точный домен в BotFather: /mybots → Web App → без www и пути","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":2},{"name":"Удалите редиректы на другой домен: проверьте в DevTools Network","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":3},{"name":"Настройте заголовки: X-Frame-Options SAMEORIGIN, CSP frame-ancestors t.me","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":4},{"name":"Выключите test mode в BotFather и уберите ?test=1 из URL","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":5},{"name":"Протестируйте на iOS и Android: проверьте initData в консоли","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","position":6}],"@type":"HowTo","@context":"https://schema.org","description":"Пошаговая диагностика и исправление проблем с Telegram WebApp: HTTPS, BotFather, редиректы, заголовки, test mode для получения initData.","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview"},"inLanguage":"ru","dateCreated":"2026-01-03T13:41:11.731Z","datePublished":"2026-01-03T13:41:11.731Z","dateModified":"2026-01-03T13:41:11.731Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview"},{"@type":"CollectionPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview/#related-questions","name":"Почему Telegram WebApp открывается в Safari вместо WebView?","description":"Узнайте, почему Telegram WebApp открывается в Safari вместо встроенного WebView: initData null, TEST MODE, window.Telegram false. Причины — HTTPS, BotFather домен, редиректы, X-Frame-Options, CSP. Диагностика и шаги исправления для iOS и Android.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview","inLanguage":"ru","mainEntity":{"@type":"ItemList","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-telegram-webapp-opens-in-safari-instead-of-webview/#related-questions","itemListElement":[{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-mini-app-fullscreen-menu-button","name":"Telegram Mini App на весь экран с Menu Button","position":1,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-mini-app-fullscreen-menu-button","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-mini-app-fullscreen-menu-button"},"inLanguage":"ru","dateCreated":"2026-01-31T07:35:35.558Z","datePublished":"2026-01-31T07:35:35.558Z","dateModified":"2026-01-31T17:16:15.453Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Telegram Mini App на весь экран с Menu Button","description":"Настройка полноэкранного режима для мини приложение telegram при запуске через menu button telegram. Используйте Telegram.WebApp.requestFullscreen() и disableVerticalSwipes(), серверные параметры MTProto. Решение для BotFather без сворачивания свайпом в v8.0+.","keywords":["мини приложение telegram","telegram mini app","menu button telegram","полноэкранный telegram","botfather telegram","requestFullscreen","disableVerticalSwipes","telegram mini app весь экран menu button","отключить свайп telegram mini app"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/protection-from-scammers-in-telegram","name":"Защита от мошенников в Telegram: что делать при угрозах и блокировке","position":2,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/protection-from-scammers-in-telegram","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/protection-from-scammers-in-telegram"},"inLanguage":"ru","dateCreated":"2026-02-02T11:01:24.944Z","datePublished":"2026-02-02T11:01:24.944Z","dateModified":"2026-02-02T11:01:24.944Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Защита от мошенников в Telegram: что делать при угрозах и блокировке","description":"Пошаговая инструкция по защите от мошенников в Telegram. Что делать при угрозах, блокировке чата и случайном посещении запрещенных сайтов.","keywords":["защита от мошенников в telegram","мошенники telegram","мошенники угрожают что делать","блокировка чата телеграм","защита аккаунта telegram","угрозы детям в телеграм","защита от мошенников на телефон","двухфакторная аутентификация telegram","фишинг в телеграм","шантаж в телеграм"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/clear-cache-telegram-web-app","name":"Как обновить Telegram Web App без кеша — надёжные способы","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/clear-cache-telegram-web-app","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/clear-cache-telegram-web-app"},"inLanguage":"ru","dateCreated":"2026-01-04T06:42:02.420Z","datePublished":"2026-01-04T06:42:02.420Z","dateModified":"2026-01-04T06:42:02.420Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как обновить Telegram Web App без кеша — надёжные способы","description":"Простые и надежные способы очистки кэша Telegram Web App: версионирование URL, хеширование файлов, Cache-Control, CDN-инвалидация и in-app проверка версий.","keywords":["telegram web app","telegram кэш","мини-приложение telegram","как очистить кэш в telegram","версионирование URL","хеширование файлов","Cache-Control","CDN инвалидация","service worker telegram","initData кеш"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-bot-mailing-spam-monetization-rules","name":"Рассылка в Telegram боте: спам, правила и монетизация","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-bot-mailing-spam-monetization-rules","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/telegram-bot-mailing-spam-monetization-rules"},"inLanguage":"ru","dateCreated":"2026-01-13T06:54:37.663Z","datePublished":"2026-01-13T06:54:37.663Z","dateModified":"2026-01-21T17:29:40.684Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Рассылка в Telegram боте: спам, правила и монетизация","description":"Можно ли рассылать рекламу всем пользователям Telegram-бота после 'Старт'? Риски спама, санкции Telegram (блокировка, ограничения), юридические нормы (152-ФЗ, GDPR) и практические советы: согласие, отписка, частота, партнерские офферы для безопасной монетизации.","keywords":["рассылка в телеграмм","telegram bot","спам в телеграм","монетизация телеграм бота","правила телеграм","блокировка бота","согласие пользователей","рассылка telegram бота","спам телеграм","telegram bot api","правила рассылки"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/auto-link-user-telegram-mini-app-chat-id","name":"Привязка пользователя в Telegram Mini App к chat_id без действий","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/auto-link-user-telegram-mini-app-chat-id","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/auto-link-user-telegram-mini-app-chat-id"},"inLanguage":"ru","dateCreated":"2025-12-28T09:06:40.474Z","datePublished":"2025-12-28T09:06:40.474Z","dateModified":"2025-12-28T09:06:40.474Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Привязка пользователя в Telegram Mini App к chat_id без действий","description":"Автоматическая привязка аккаунта в Telegram Mini App к сайту по chat_id: deep linking с токенами, валидация initData (HMAC, auth_date). Пошаговый гайд с кодом Node.js/Python, безопасность и альтернативы для telegram web app.","keywords":["telegram mini app","telegram web app","привяжи аккаунт telegram","telegram initdata","telegram bot авторизация","telegram mini app initdata","deep linking telegram","telegram mini apps api","initdata telegram","telegram bot mini app"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix","name":"iOS: как заставить Safari менять viewport при фокусе","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix"},"inLanguage":"ru","dateCreated":"2026-01-03T09:28:44.223Z","datePublished":"2026-01-03T09:28:44.223Z","dateModified":"2026-01-03T09:28:44.223Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"iOS: как заставить Safari менять viewport при фокусе","description":"Почему iOS‑клавиатура в Safari на iPhone не ресайзит layout‑viewport и как это исправить: Visual Viewport API, вычисление --vh, padding‑bottom, scrollIntoView и fallback‑паттерны.","keywords":["ios клавиатура","safari iphone","visual viewport api","visualViewport","--vh","100vh","fixed панель","scrollIntoView","высота клавиатуры","padding-bottom"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/where-to-find-child-nutrition-in-telegram","name":"Где найти детское питание в Telegram: каналы, группы, боты","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/where-to-find-child-nutrition-in-telegram","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/where-to-find-child-nutrition-in-telegram"},"inLanguage":"ru","dateCreated":"2025-12-13T11:39:24.312Z","datePublished":"2025-12-13T11:39:24.312Z","dateModified":"2025-12-13T11:39:24.312Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Где найти детское питание в Telegram: каналы, группы, боты","description":"Узнайте, как быстро найти каналы, группы и ботов в Telegram, посвящённые детскому питанию, и как проверить их достоверность и безопасность для родителей.","keywords":["детское питание Telegram","каналы детского питания","группы детского питания","боты детского питания","поиск детского питания Telegram","проверка достоверности ботов","питание для детей","питание новорожденных Telegram","детское питание онлайн","детское питание малышей"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-bot-deep-link-login-hash","name":"Ссылка на чат-бота ВКонтакте с предзаполненным login|hash","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-bot-deep-link-login-hash","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-bot-deep-link-login-hash"},"inLanguage":"ru","dateCreated":"2026-01-07T06:33:55.003Z","datePublished":"2026-01-07T06:33:55.003Z","dateModified":"2026-01-07T06:33:55.003Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Ссылка на чат-бота ВКонтакте с предзаполненным login|hash","description":"Как создать ссылку vk.me/your_group#start=login|hash для чат-бота ВК: бот получает payload, парсит login и hash и сразу отвечает пользователю без ручного ввода.","keywords":["бот вк","чат бот вк","ссылка бот вк","глубокие ссылки вк","vk.me#start","payload вк","login|hash","реферальная ссылка вк","обработка payload","настройка бота вк"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","name":"Кросс-доменный POST-запрос в JS: Fetch без обновления","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors"},"inLanguage":"ru","dateCreated":"2026-02-24T10:35:27.960Z","datePublished":"2026-02-24T10:35:27.960Z","dateModified":"2026-02-24T18:28:00.024Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","jobTitle":"Технический писатель","description":"Коллектив авторов и вкладчиков MDN Web Docs, создающих официальную документацию веб-технологий"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Официальная документация веб-технологий от Mozilla, предоставляющая информацию о HTML, CSS, API и других открытых веб-технологиях","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/developer-mozilla-org/logo.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","name":"Илья Кантор","givenName":"Илья","familyName":"Кантор","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/iliakan/avatar.png","width":"72","height":"72"},"jobTitle":"Автор учебника по JavaScript","description":"Разработчик из Амстердама, автор популярного онлайн-учебника javascript.ru (ранее javascript.info), эксперт по современному JavaScript и веб-технологиям"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","name":"Иван Гришаев","givenName":"Иван","familyName":"Гришаев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","jobTitle":"Backend-инженер","description":"Удалённый IT-инженер, backend-разработчик в европейской fintech-компании, специалист по Clojure, SQL, Postgres, функциональному программированию (Lisp), автор двух книг по Clojure, спикер сообщества, отец троих детей, интересуется книгами, переговорами и образованием"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Кросс-доменный POST-запрос в JS: Fetch без обновления","description":"Как отправить кросс-доменный POST-запрос с помощью JavaScript (Fetch или XHR) без обновления страницы. Решение ошибок CORS, blocked by cors policy, разбор ответа response.json() и настройки Access-Control-Allow-Origin.","keywords":["cors","fetch post","blocked by cors policy","кросс-доменный запрос","javascript fetch","xhr post","cors preflight","access-control-allow-origin","fetch cors","ошибка cors","ajax post"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/outbound-call-telfin-api-nestjs-typescript","name":"Исходящий звонок Телфин API в NestJS TypeScript","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/outbound-call-telfin-api-nestjs-typescript","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/outbound-call-telfin-api-nestjs-typescript"},"inLanguage":"ru","dateCreated":"2026-01-17T06:42:23.878Z","datePublished":"2026-01-17T06:42:23.878Z","dateModified":"2026-01-17T12:09:17.594Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Исходящий звонок Телфин API в NestJS TypeScript","description":"Реализация инициализации исходящего звонка через Телфин API в админ-панели на NestJS + TypeScript. Решение ошибки extension_id: тип 'phone' вместо 'ivr'. Пошаговый гайд без библиотек с примерами кода.","keywords":["телфин api","nestjs typescript","исходящий звонок api","extension_id phone","nest js тelfin","телефонный звонок api"],"image":[],"articleBody":""}}]}}]}
Веб

Почему Telegram WebApp открывается в Safari вместо WebView?

Узнайте, почему Telegram WebApp открывается в Safari вместо встроенного WebView: initData null, TEST MODE, window.Telegram false. Причины — HTTPS, BotFather домен, редиректы, X-Frame-Options, CSP. Диагностика и шаги исправления для iOS и Android.

1 ответ 1 просмотр

Почему WebApp открывается в обычном браузере (Safari) вместо встроенного WebApp в Telegram?

Описание проблемы:

  • Кнопка создаётся через web_app=types.WebAppInfo(url=WEB_APP_URL)
  • Домен добавлен в BotFather
  • Всё открывается через инлайн-кнопку в боте

Наблюдаемые симптомы:

  • WebApp загружается в Safari (не в приложении Telegram)
  • window.Telegram = false
  • tg.sendData = false
  • initData = null
  • Появляется “TEST MODE”

Вопрос: при правильных настройках почему Telegram игнорирует свою встроенную WebApp-оболочку и открывает ссылку в браузере? Какие наиболее вероятные причины (например, HTTP/HTTPS, редиректы на другой домен, заголовки X-Frame-Options или CSP, некорректный whitelist доменов в BotFather, особенности iOS/конкретного клиента Telegram и т.д.), как это диагностировать и какие шаги нужно выполнить, чтобы WebApp открывался внутри Telegram и корректно получал initData?

Telegram WebApp открывается в Safari вместо встроенного WebView в Telegram чаще всего из-за проблем с HTTPS-сертификатом, редиректами на другой домен, заголовками X-Frame-Options или CSP, либо некорректным whitelist-доменом в BotFather. Симптомы вроде window.Telegram = false, tg.sendData = false, initData = null и баннера “TEST MODE” — классика таких сбоев. Быстро диагностируйте через DevTools браузера и curl, а потом поправьте серверные настройки — и initData прилетит корректно.


Содержание


Что происходит с initData и почему оно null

InitData — это сердце Telegram Mini Apps. Telegram передает набор параметров при запуске: данные пользователя, чата, подпись HMAC-SHA256 от бота. Без нее initData = null, window.Telegram не инициализируется, tg.sendData молчит. Почему? Telegram проверяет безопасность перед встраиванием в WebView. Если что-то не так — кидает в Safari.

Представьте: вы кликаете inline-кнопку с web_app=types.WebAppInfo(url=WEB_APP_URL). Telegram смотрит: домен ок? HTTPS чист? Нет фрейм-блоков? Все зашибись — загружает в свой WebView, подсовывает initData. Иначе — браузер, и привет, пустые руки.

Согласно официальной документации по initData, парсите пары ключ-значение (кроме hash), сортируйте, склеивайте \n, хэшируйте с ключом “WebAppData” + токен бота. Если null — Telegram даже не пытался.

Это не баг iOS. Просто Telegram строг: лучше открыть в Safari, чем рисковать подделкой данных.


Основные причины: почему Telegram сбрасывает в Safari

Telegram игнорирует WebView по четким правилам. Топ-5 причин из практики:

  1. HTTPS фейлит — self-signed, expired, HTTP.
  2. Домен не в BotFather — whitelist пуст или mismatch.
  3. Редиректы — 301/302 на другой хост.
  4. Заголовки блокеры — X-Frame-Options: DENY, CSP без frame-ancestors.
  5. Test Mode — бот в тесте или ?test=1.

Плюс iOS-фишки: Safari агрессивнее проверяет сертификаты. На Android реже срабатывает.

Хабр-статья бьет в точку: “Неверный HTTPS? Откройте URL в браузере — увидите предупреждение?” Именно. А core.telegram.org добавляет: Telegram видит только первый URL, игнорирует редиректы на чужой домен.

Часто комбо: домен ок, но редирект + CSP = Safari. Статистика из туториалов — 80% случаев на HTTPS/headers.

Коротко: Telegram защищает initData. Не прошел чек — браузер.


Проблема №1: HTTPS невалидный или отсутствует

Без HTTPS Telegram даже не моргнет. HTTP? Забудьте. Self-signed для dev ок, но в проде — Let’s Encrypt или Cloudflare.

Симптомы: В Safari предупреждение о cert, initData null.

Почему iOS? Safari строже: блокирует mixed content, expired certs.

Timeweb-туториал советует: откройте URL в браузере. Зеленый замок? Нет — фиксите.

Быстрый тест: curl -I https://your-domain.com. Должен 200 OK, без ошибок cert.

Исправление? Nginx/Apache: вкрутите cert. Dev: mkcert для local.

И да, Telegram принимает self-signed для теста, но домен должен совпадать.


Проблема №2: домен не в whitelist BotFather

Домен добавил? Проверьте точно: без www, без пути, с https://? Нет — Safari.

BotFather → /mybots → ваш бот → Web App → домен. Точный матч с WEB_APP_URL.

DEV Community гайд предупреждает: “Добавьте exact domain (no www, no path)”. myapp.com, не www.myapp.com/path.

Ошибка: добавили http://, а кнопка https://. Или subdomain не указан.

В консоли: “TEST MODE” + Safari. Фикс: /setwebappdomain в BotFather, перезапустите бота.

Core.telegram: “Whitelist mismatch — opens in browser”.

Просто, но ловит 40% новичков.


Проблема №3: редиректы меняют домен

Сервер редиректит your-domain.com на www.your-domain.com? Telegram видит первый URL, но контент с другого — бам, Safari.

Диагностика: DevTools → Network. Цепочка 301/302 меняет host? Удалите.

Aglamov.biz: “В DevTools следите за редиректами. Удалите, чтобы URL оставался тем же”.

Nginx-пример:

server {
 listen 443 ssl;
 server_name your-domain.com;
 # NO redirect here
}

iOS Safari любит такие ловушки — редирект на мобильный хост.

После фикса: тот же домен везде.


Проблема №4: X-Frame-Options и CSP блокируют фрейм

Telegram WebView — это iframe. X-Frame-Options: DENY или SAMEORIGIN (если домены разные) — блок.

CSP без frame-ancestors https://t.me https://telegram.org — то же.

Консоль Safari: “Refused to display in a frame because it set ‘X-Frame-Options’ to ‘deny’”.

Habr Amvera: Установите X-Frame-Options: SAMEORIGIN или удалите. CSP: frame-ancestors 'self' https://t.me;.

Nginx:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self' https://t.me https://telegram.org;" always;

Habr 706446: curl -I, ищите эти хедеры.

Фикс — и WebView оживет.


TEST MODE: как убрать тестовый режим

Баннер “TEST MODE” в углу? Бот в test mode (BotFather → Test mode off) или URL с ?test=1.

DEV.to: “TEST MODE” = test bot или ?test=1. Выключите.

Плюс: dev-боты всегда test. Сделайте production-бота.

После: баннер уйдет, initData придет.

Просто, но пугает.


Особенности iOS и клиента Telegram

iOS Safari — король паранойи. Блокирует self-signed строже Android Chrome. Telegram iOS (17+) усилил проверки WebView.

Симптомы только на iPhone? Проверьте Android — работает? Значит, cert или CSP.

Timeweb: iOS открывает в Safari при CSP-блоке чаще.

Фикс: валидный cert (не self-signed в проде), CSP с t.me.

Обновите Telegram app — старые версии глючат.


Диагностика шаг за шагом

  1. Консоль браузера: Откройте Safari → URL → Console/Network. Ищите: X-Frame, CSP errors, редиректы, HTTPS warnings.

  2. curl -I https://your-domain.com — 200? Хедеры ок?

  3. BotFather: /mybots → Web App domain — матч?

  4. JS-чек: В консоли: window.Telegram.WebApp.initData. Null? Причина выше.

  5. Test mode: Баннер? Выкл.

  6. iOS vs Android: Тестируйте оба.

Документация initData: Если hash не verifies — подделка, но для вас null = не запустилось.

10 минут — и причина ясна.


Шаги исправления для запуска внутри Telegram

  1. HTTPS: Установите cert. certbot или Cloudflare.

  2. BotFather: Добавьте exact домен: /setwebappdomain.

  3. Сервер: Уберите редиректы на другой host.

  4. Хедеры:

X-Frame-Options: SAMEORIGIN
CSP: frame-ancestors 'self' https://t.me https://telegram.org;
  1. Test off: BotFather → production.

  2. в head.

  3. Тест: Inline-кнопка → WebView? tg.initDataUnsafe.user есть?

Полный чеклист из DEV.to. После — initData работает, sendData шлет.

Готово. Ваш WebApp в Telegram.


Источники

  1. Init Data | Telegram Mini Apps
  2. Telegram Mini Apps Creation Handbook - DEV Community
  3. Telegram WebApps. Как встроить веб-приложения в чат-бота? / Хабр
  4. Интеграция Mini Apps в боты Telegram: пошаговое руководство для начинающих
  5. Что такое Telegram Web App (Mini App) и как создать свое мини приложение
  6. Telegram Web App. Всё о Mini Apps / Хабр
  7. Telegram Mini Apps | core.telegram.org

Заключение

Telegram WebApp в Safari вместо WebView — типичная засада на HTTPS, BotFather whitelist, редиректах или хедерах вроде X-Frame-Options/CSP. Диагностика через curl и DevTools занимает минуты, фикс — час. После правок initData заполнится, “TEST MODE” исчезнет, и ваше мини-приложение заработает везде, включая iOS. Главное — точный матч домена и чистый HTTPS. Тестируйте на реальном production-боте — и вперед!

Авторы
Проверено модерацией
Модерация
Почему Telegram WebApp открывается в Safari вместо WebView?