惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
量子位
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
博客园_首页
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC

Все публикации подряд на Хабре

Космическая линза помогла Уэббу увидеть древнейшую галактику Вселенной Как я сократил рутину QA до пары кликов: генератор API-тестов и тест-кейсов на LLM, которым хочу поделиться ИИ‑спасатель в кармане: как мы сделали агента для помощи при ЧС, который работает без интернета QNAME minimisation на практике: RFC 7816, реализация, грабли Агенты, роботы и мы: как ИИ перекраивает рынок труда в Европе От боли к npm install: TDLib для React-Native, или как я делал проект, а получилась библиотека Написание консольного симулятора баттл-арены на языке С++ с реализацией «умных» ботов Очень много букв… Или кейс по специфической настройке рабочего окружения Segmentation Fault: как оно устроено? Python в enterprise: момент, когда пора открыть Java не только ради собеседований MonoGame — игровой движок для тех, кто любит изобретать велосипеды Спасти рядового Буридана Рефакторинг выпадающих списков: от enum к конфигу-константе Free Porn Storage: передаём мемы в TLS-трафике, не привлекая внимания санитаров Мониторинг цен на Авито: MikroTik RouterOS Script Венесуэльская нефть после января 2026 Разговоры с ИИ Хотел упростить мониторинг проектов и в отпуск — пришлось обучать свой LLM. Часть 4. Тестирование Как вытащить ИТ из кризиса перегрузки, если найм запрещён Как мы подключили LLM к поддержке, а получили идеального лжеца Zero — новый agent-first язык программирования от Vercel, который изменит все (нет) Запускаем рекламу в дачной нише: какие креативы и форматы работают, на что смотреть в аналитике Паттерны организационного дизайна: практическое руководство Почему алгоритмы сливают твой депозит? 3 причины, о которых молчат «успешные» бэктесты Как «спят» вкладки в браузере Приоритет задач определяется не только ощущением срочности [Перевод] Махинации с прибылью Anthropic Project Loom: Virtual Threads, Scoped Values и preview #7 Structured Concurrency Мнения математиков о том, как ИИ опроверг гипотезу Эрдёша Слабоумие и отвага: как я за выходные сделала прототип ИИ-помощника для UX-дизайнера ИИ учит нас писать лучше. Или хуже? Как проектировать ИИ-инструменты, которые делают пользователей лучше «Раньше хотел каждый, сейчас и бесплатно не надо»: гаджеты, про которые мы все забыли ИИ-агенты в бизнесе: почему 80% компаний увольняют людей, но не получают ROI Как я строил ИИ-стартап, или Новые архитектурные риски 2026 4 интересных парадокса, рождающих жаркие дискуссии Рабочее место не-вайбкодера: настраиваем harness Когнитивный инжиниринг Feature Based Clean Architecture. Часть 1: Эволюция NestJS-приложения в неподдерживаемое состояние Как мы перестали бояться «пустых охватов» и сделали инфлюенс-маркетинг управляемым каналом роста Подключили B2B email-платформу к голосовым ассистентам через MCP. Архитектура, код, где ломается [Перевод] Почему AI-агенты ломаются на длинных задачах — и как обвязка помогает им дописывать приложения Облачно, возможны нейросети: кризис датасетов и ахиллесова пята систем машинного зрения — DIY-чтение на выходные Спустя 5 лет и $5 миллионов: почему создание нового языка для веб-разработки оказалось ошибкой Безопасная песочница Облачная LLM на 16 ГБ VRAM — часть 2: LangGraph Server, LangSmith и SDK Современный SSH-клиент для MS-DOS Как продвигать агентство недвижимости: от вывески до прямых эфиров MCP для GitHub + GitLab: инженерный гайд 2026 Вы платите OpenAI $20 в месяц, а он зарабатывает на вас ещё $100 млн за полтора месяца. И это только начало ИИ забирает работу «белых воротничков»: чему учить детей, чтобы выжить в будущем Практический ИИ-агент Python: LangGraph + Qdrant Как я делал ping и traceroute на iOS без entitlements — и почему это оказалось проще, чем UMP-консент для AdMob 4 MVP за 4 месяца, 30 холодных DM, 1 регистрация: building in public по-русски VPS-бастион: доступ к домашнему серверу без белого IP Kampus AI — нейросеть для генерации учебных работ для студентов и школьников Игры, помогающие продавать — примеры интересных рекламных акций с видеоиграми €500 в Telegram Ads принесли сделку на 350 000 ₽. Разбор B2B-кампании Чтение на выходные: «Разработка игр и теория развлечений» Рафа Костера Личный архив: сбор, бэкап, таймлайн фотографий INFOSTART TECH EVENT или INFOSTART A&PM EVENT — как понять, куда вам нужнее? Peer testing на основе Закона Линуса Релиз GitLab 19.0: ИИ-оркестрация, которая наконец-то догнала темп написания кода Как бизнесу оценить готовность к аттестации по новому Приказу ФСТЭК № 117 Технический гайд по сторис – часть 4: как мы добавили видео формат Представительство в арбитражном процессе: правовые различия между внешним защитником и инхаусом «Где новые фичи?» — Как AI-миграция легаси вернет IT-бюджет бизнесу Что нужно знать работнику про увольнение Новые требования Москвы к ЦИМ для АГР: готовый инструмент для проектировщиков в nanoCAD BIM Строительство WireGuard: простота и надёжность современного VPN-туннеля или секретное рукопожатие в тёмной комнате Выйдет ли GTA 6 в 2026 году, и чего ждать от игры Как меня назвали «невовлечённым», а я нашёл офшоры на Кипре Как LLM научила рекомендательную модель видеть больше, чем историю взаимодействий От хаоса к экосистеме: Модель зрелости комьюнити в бизнесе Свет, тьма, VEML7700 и Python Сказ о том, как мы процессы разработки в GRI меняли. Часть 2 Майский «В тренде VM»: громкие уязвимости в Linux, ActiveMQ, SharePoint и Acrobat Reader Статический анализ, заряженный ИИ: как LLM ищут уязвимости в коде и где их границы Блок “Процессы” и почему мы называем его нашим мини-n8n Как поменялся рынок интернет-рекламы: сравнение первых кварталов 2025 и 2026 годов: исследование click.ru Мониторинг Kerio Connect через Zabbix 7: разбор шаблона без агентов и regex по DAT 671 Allow в Claude Code за день: как родился сетап Spec-build 3 известные интересные задачи на логику Как айтишнику позаботиться о менталке и не перерабатывать OpenAI vs Anthropic: битва экс-коллег за корпоративного клиента и $1 трлн на IPO SEO для интернет-магазина в 2026: что поменялось и как с этим работать Сможете ли вы спроектировать Maven‑монорепозиторий для 5 микросервисов? 6 неудобных вопросов про американское произношение, которые айтишники боятся задать Неожиданная встреча: теория графов вновь помогла решить проблему в анализе Фурье Иллюзия трансформации: почему компании платят за спектакль вместо изменений AMD представила Ryzen 9 PRO 9965X3D и еще 5 процессоров, которые пойдут далеко не всем История IDE в Google Первые отзывы на новинки о System Design Влияние параметра planner_upper_limit_estimation на планы выполнения и профиль нагрузки PostgreSQL при использовании 1C Границы 100% разработки с агентами Быстрый OCR на основе Paddle Дооснащение любительской электровакуумной мастерской. Вакуумметр, течеискатель, полярископ Mythos: модель, о которой Anthropic не говорит. Реверс по жертвам — от 27-летней дыры в OpenBSD до побега из песочницы Как использовать Qwen3.7-Max и Grok Build 0.1 для ИИ-агентов в России Suricata IPS NFQueue with nDPI. Часть VI
Почему custom URI schemes в Telegram Mini Apps ведут себя по-разному на Android, iOS и Desktop
Venc0707 · 2026-05-23 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение4 мин

Охват и читатели0

Кейс

Разбираю неожиданные проблемы cross-platform onboarding между Telegram Mini Apps и native apps.

Недавно я столкнулся с неожиданной проблемой при разработке Telegram Mini App onboarding flow для native networking клиента.

На старте мне казалось, что весь onboarding займет буквально пару часов:
открыть deeplink → импортировать подписку → подключиться.

Но на практике именно эта часть оказалась самой нестабильной во всем проекте.

На первый взгляд задача выглядела довольно простой:

Telegram Mini App
↓
happ://...
↓
native app
↓
import subscription
↓
connect

Но на практике оказалось, что custom URI schemes внутри Telegram Mini Apps ведут себя совершенно по-разному:

  • Android открывает deeplink стабильно;

  • iOS блокирует часть сценариев;

  • Windows имеет собственные ограничения;

  • Linux Desktop ведет себя нестабильно и пока остается самой непредсказуемой платформой.

В итоге самой сложной частью проекта оказался вовсе не backend, а cross-platform onboarding UX.

Архитектура flow

Текущая схема выглядит так:

Telegram Bot
↓
Mini App (Vue 3 + Telegram WebApp API)
↓
FastAPI Backend
↓
crypto API → encrypted deeplink
↓
happ://...
↓
Happ Client
↓
subscription import
↓
connect

Для разных платформ пришлось использовать разные форматы ссылок:

Android:
happ://crypt5/BASE64

iOS / Windows:
happ://add/https://sub.example.com/sub/TOKEN

Install redirect:
https://app.example.com/install?url=happ%3A%2F%2Fadd%2F...

Android: crypt5 работает, но не совсем

На Android изначально использовался encrypted deeplink формата:

happ://crypt5/BASE64

Ссылка генерируется через внешний crypto API.

Первой неожиданной проблемой стало то, что API возвращал два склеенных base64-блока.

Сначала казалось, что нужно обрезать ответ на backend стороне.

После нескольких тестов выяснилось, что Android-клиент Happ ожидает именно полный оригинальный ответ от crypto API.

То есть проблема была не в “лишних символах”, а в особенностях internal parser внутри Android-клиента.

iOS: Telegram WebView против custom schemes

Самой проблемной платформой оказался iOS.

Прямые варианты вроде:

window.open('happ://...')

или:

telegram.openLink('happ://...')

не работали внутри Telegram WebView.

iOS блокирует custom URI schemes, если вызов не проходит через корректный browser/user interaction flow.

В итоге рабочим решением оказался промежуточный install page:

telegram.openLink(
  'https://app.example.com/install?url=happ%3A%2F%2Fadd%2F...'
)

А внутри install page:

window.location.href = url

На удивление именно такой redirect-flow оказался наиболее стабильным.

Windows: crypt5 не поддерживается

Windows-версия Happ неожиданно отказалась принимать encrypted crypt5 ссылки.

Клиент возвращал ошибку:

Invalid subscription link format

При этом обычный deeplink работал нормально:

happ://add/https://sub.example.com/sub/TOKEN

В результате для Windows пришлось отказаться от crypt5 flow и использовать прямой subscription import.

Интересно, что браузер после открытия схемы автоматически закрывал вкладку, из-за чего UX на Windows даже оказался лучше, чем на iOS.

Linux: пока самая странная платформа

С Linux ситуация пока остается самой непредсказуемой.

На Arch Linux x64 deeplink flow через:

happ://add/...

не заработал даже после установки клиента.

Пока непонятно:
— это проблема Desktop Telegram,
— браузера,
— регистрации URI schemes
— или самого Linux desktop flow.

Предварительно проблема выглядит связанной либо:

  • с отсутствием регистрации custom URI scheme;

  • либо с особенностями Desktop Telegram/browser handoff на Linux.

Но полноценного стабильного решения для Linux пока нет.

Что пробовал

За последние дни было протестировано примерно всё:

window.open('happ://...')
telegram.openLink('happ://...')
window.location.href = 'happ://...'
hidden anchor click()
popup windows
setTimeout redirects
install pages

И самое забавное:
наиболее стабильным решением для iOS оказался обычный промежуточный install page с:

window.location.href = url

Хотя изначально это выглядело как временный workaround.

Что я в итоге понял

Telegram Mini Apps — это далеко не “просто WebView”.

Как только появляется:

  • native app handoff;

  • custom URI schemes;

  • cross-platform onboarding;

  • mobile browser behavior;

всё становится намного сложнее, чем кажется в начале.

Особенно если хочется сделать onboarding без:

  • инструкций на 10 шагов;

  • ручного копирования ссылок;

  • “откройте настройки → импортируйте вручную”.

Открытые вопросы

Несмотря на то что Android, iOS и Windows удалось привести к относительно стабильному состоянию, остаётся ещё много странного platform-specific поведения.

Пока больше всего вопросов вызывает Linux/Desktop flow.

Сейчас остаются открытыми несколько проблем:

  • почему Telegram Desktop настолько по-разному обрабатывает custom URI schemes между Windows и Linux;

  • связан ли Linux issue с отсутствием x-scheme-handler или проблема глубже;

  • влияет ли конкретный browser/desktop environment на handoff behavior;

  • можно ли сделать единый cross-platform onboarding flow без install redirect page;

  • существует ли более стабильный способ открытия native app из Telegram Mini Apps на iOS;

  • насколько вообще Telegram Mini Apps подходят для сложного native onboarding.

Особенно интересно:
сталкивался ли кто-то с похожими проблемами вокруг:

  • custom URI schemes;

  • Telegram WebView;

  • Desktop Telegram;

  • Electron/browser handoff;

  • native app onboarding.

Если у кого-то есть опыт с подобными сценариями — будет интересно обсудить подходы и решения.

Сейчас я продолжаю тестировать onboarding flow на разных устройствах и Telegram клиентах, поэтому если кому-то интересно покидать feedback или проверить behavior на своей платформе — можете написать в личку 🙌