Telegram для iOS 13.1.1 по открытому коду перестал отправлять отметку о прочтении незнакомцу, который написал первым. Пока над чатом висит панель с кнопками «Пожаловаться» и «Заблокировать», клиент не читает его сообщения, не показывает его кнопки, открывает его ссылки как обычный текст и прячет его эмодзи-статус. Режим снимается, когда вы убираете панель, а при ответе снимается локально, и авторы правки сами оговаривают, что сервер может его вернуть. Правка лежит в репозитории Telegram-iOS коммитом 007fb3f1 от 22 октября, он вошёл в тег release-13.1.1, а сама версия в тот же вечер вышла в App Store. Касается это всех, кому пишут незнакомцы, и тех, кто пишет первым: если вы написали человеку с iPhone, две галочки появятся только после того, как он решит, что с вами делать.
Что клиент считает подозрительным собеседником
Когда человек не из контактов пишет первым, сервер присылает клиенту настройки этого чата, peerSettings в схеме API. Среди флагов там report_spam и block_contact: показать ли кнопки «Пожаловаться» и «Заблокировать». Отдельного флага «подозрительный» в схеме нет. В коде Telegram для iOS чат считается подозрительным, пока хотя бы один из этих двух флагов стоит, это и есть предикат isSuspiciousPeer. Те же настройки несут страну номера, месяц регистрации и даты смены имени и фото, которые с марта 2025 года показываются в карточке незнакомца над первым сообщением.
До 13.1.1 подозрительность меняла немногое: в тексте такого собеседника ссылки, упоминания, хештеги, адреса почты, номера карт и адреса TON показывались как обычный текст, нажать на них было нельзя, а нажатие по карточке превью ничего не делало. Кнопки под сообщениями, кнопка и ссылки в тексте превью, ссылки в сообщениях на HTML и его эмодзи-статус работали как у любого другого, а сообщения отмечались прочитанными сразу при открытии чата.
Что изменилось в 13.1.1
Коммит 007fb3f1 меняет 16 файлов, 491 строка добавлена и 29 удалены. Пока панель жалобы на месте:
| Что | Было | Стало |
|---|---|---|
| Отметка о прочтении | уходит при открытии чата | не уходит |
| Кнопки под сообщением | показываются и работают | не показываются |
| Ссылки в тексте | обычный текст | обычный текст, как раньше |
| Превью ссылки | карточка не открывается, но кнопка под ней и ссылки в её тексте работают | кнопки нет, ссылки в тексте превью сняты, медиа не открывается |
| Сообщения на HTML | ссылки и кнопки работают | ссылки стали текстом, кнопки убраны |
| Эмодзи-статус собеседника | виден в заголовке чата и в профиле | скрыт, у подписчика Premium вместо него звезда |
Прочтение. Отметка о прочтении в Telegram и сброс счётчика непрочитанных у чата — одно и то же действие: клиент сообщает серверу номер последнего прочитанного сообщения, а сервер показывает отправителю вторую галочку. Теперь клиент держит это действие, пока собеседник подозрительный, и ещё в одном случае: когда чат с не-контактом открыт впервые и настройки ещё не пришли с сервера. Отменить отправленное прочтение нельзя, поэтому клиент ждёт решения, а не читает «на всякий случай». В комментарии к проверке правки сказано, что на симуляторе решения о прочтении откладывались и применялись после закрытия панели и после отправки сообщения.
Кнопки. Ряды кнопок под сообщениями убраны у обычных пузырей, стикеров и кружков. Для сообщений на HTML добавлено отдельное преобразование: ссылки, адреса почты, упоминания, хештеги, номера карт и адреса TON становятся текстом, встроенные кнопки исчезают, у кнопки, оформленной как ссылка, остаётся только надпись, а картинка теряет ссылку. Телефонные номера, команды ботов, даты, якоря и кастомные эмодзи остаются. Каждый блок сохраняет свой номер, чтобы цитаты по таким сообщениям продолжали ссылаться на те же места.
Превью ссылок. У карточки превью такого сообщения больше нет кнопки, медиа из неё не открывается, а из текста превью сняты те же ссылки, что и из текста сообщения.
Эмодзи-статус. Статус не показывается в заголовке чата, в приписке панели про Premium и в шапке профиля, включая обложку и цвета коллекционного статуса.
Правило действует только в личных чатах. Строки в списке чатов, поиск, а также группы и каналы с панелью жалобы не меняются.
Как выйти из этого режима
Панель убирают четыре действия, но режим в коде клиента снимают не все:
- Закрыть панель крестиком. Клиент вызывает
messages.hidePeerSettingsBarи сам обнуляет флаги чата, не дожидаясь сервера. Так же локально флаги снимает жалоба на спам. - Заблокировать собеседника или добавить его в контакты. Клиент при этом меняет только блокировку или статус контакта, флаги
report_spamиblock_contactне трогает: режим кончится, когда сервер пришлёт новые настройки чата. - Ответить. При отправке любого сообщения, кроме отложенного, клиент сам убирает у чата эти два флага, предложение «Добавить в контакты» остаётся. Отложенное сообщение до назначенного часа никому не приходит и режим не снимает.
Третий путь описан в репозитории с оговоркой: флаги при ответе снимаются только локально, а users.getFullUser при каждом обновлении переписывает настройки чата тем, что прислал сервер. Если сервер после вашего ответа флаги не снимает, режим вернётся при следующем обновлении. На 21 октября авторы правки это не проверяли, у них не было второго аккаунта для теста. Запасной вариант, который они называют, — вызывать hidePeerSettingsBar при отправке, но тогда исчезнет и «Добавить в контакты».
Что известно о сборке
Коммит лёг в основную ветку 22 октября в 11:20 UTC. Через 51 минуту, в 12:11 UTC, номер версии в versions.json сменился на 13.1.1, тег release-13.1.1 стоит на этом коммите с номером, и 007fb3f1 входит в него тремя коммитами раньше. В App Store версия 13.1.1 вышла в тот же день в 18:45 UTC с описанием «Bug fixes, minor improvements, and more». Сборка из App Store с открытым кодом не сверялась. Та же версия перекладывает интерфейс под складной iPhone Duo.
Проверка правки шла на симуляторе с временным переключателем, который принудительно включал режим, в коммит он не вошёл. Обычные клавиатуры и кнопки-ссылки на симуляторе проверили, а преобразование сообщений на HTML покрыто только тестами, живого HTML-сообщения от незнакомца в проверке не было. Подпись под коммитом общая у человека и Claude Opus 5.5.
Страна номера и новая строка CanadaVoIP
Страну номера карточка незнакомца берёт не из самого номера, а из поля phone_country тех же настроек чата: сервер присылает двухбуквенный код, клиент ищет его в списке стран help.getCountriesList, подставляет название и рисует флаг по коду. Для кода FT iOS пишет «Анонимный» (это номера +888), для TS — «Test».
24 октября в этом списке появилась новая запись: код CP, название CanadaVoIP, телефонный код +1, без префиксов и шаблонов номера. Сначала её получил тестовый сервер, к 09:33 UTC, затем основной, к 12:18 UTC. Запись помечена как скрытая. До неё скрытых записей в списке было три: XG «Global Mobile Satellite System» (+881), XV «International Networks» (+882, +883) и YL «Y-land» (+42). Всего в списке 236 записей.
Скрытые записи iOS не показывает в выборе страны при входе, но хранит и находит по коду. С набором номера запись тоже не встретится: при сопоставлении её перекрывают США, они идут в списке позже с тем же кодом +1. Остаётся одно место, где клиент её прочитает, — код phone_country, пришедший от сервера. Сервер, по этой логике, собирается отличать канадские номера виртуальных операторов от остальных номеров с кодом +1, и в карточке незнакомца на iPhone вместо «Канада» появится слово CanadaVoIP. Это вывод из списка и кода клиента, живого чата с таким кодом не наблюдалось.
Telegram Desktop скрытые записи при загрузке списка выбрасывает целиком, поэтому для кода CP он нарисует флаг без названия. Флаг у обоих клиентов один и тот же, по двум буквам: в ISO 3166-1 код CP зарезервирован за островом Клиппертон, необитаемой французской территорией в Тихом океане.




