O Telegram para iOS 13.1.1, de acordo com seu código aberto, parou de enviar o recibo de leitura a um estranho que enviou a primeira mensagem. Enquanto o painel com os botões "Denunciar Spam" e "Bloquear" estiver visível acima do chat, o cliente não lê as mensagens do estranho, não exibe seus botões, abre seus links como texto comum e oculta seu emoji-status. O modo é desativado quando você remove o painel, e ao responder, é desativado localmente, embora os autores da alteração observem que o servidor pode reativá-lo. A alteração está no repositório Telegram-iOS no commit 007fb3f1 de 22 de outubro, foi incluída na tag release-13.1.1, e a própria versão foi lançada na App Store na mesma noite. Isso afeta todos que recebem mensagens de estranhos e aqueles que enviam a primeira mensagem: se você escreveu para alguém com um iPhone, as duas marcas de seleção só aparecerão depois que a pessoa decidir o que fazer com você.

O que o cliente considera um interlocutor suspeito

Quando uma pessoa que não está nos seus contatos envia a primeira mensagem, o servidor envia ao cliente as configurações desse chat, peerSettings no esquema da API. Entre os sinalizadores, estão report_spam e block_contact: se os botões "Denunciar Spam" e "Bloquear" devem ser exibidos. Não há um sinalizador "suspeito" separado no esquema. No código do Telegram para iOS, um chat é considerado suspeito enquanto pelo menos um desses dois sinalizadores estiver ativo, e este é o predicado isSuspiciousPeer. As mesmas configurações incluem o país do número, o mês de registro e as datas de alteração de nome e foto, que a partir de março de 2025 são exibidas no cartão do estranho acima da primeira mensagem.

Antes da versão 13.1.1, a suspeita mudava pouca coisa: no texto de tal interlocutor, links, menções, hashtags, endereços de e-mail, números de cartão e endereços TON eram exibidos como texto comum, não podiam ser clicados, e clicar no cartão de prévia não fazia nada. Os botões abaixo das mensagens, o botão e os links no texto da prévia, os links em mensagens HTML e seu emoji-status funcionavam como em qualquer outro, e as mensagens eram marcadas como lidas imediatamente ao abrir o chat.

O que mudou na 13.1.1

O commit 007fb3f1 altera 16 arquivos, com 491 linhas adicionadas e 29 removidas. Enquanto o painel de denúncia estiver presente:

O queEraTornou-se
Recibo de leituraenviado ao abrir o chatnão é enviado
Botões abaixo da mensagemexibidos e funcionaisnão são exibidos
Links no textotexto comumtexto comum, como antes
Prévia de linko cartão não abria, mas o botão abaixo e os links no texto funcionavamnão há botão, os links no texto da prévia são removidos, a mídia não abre
Mensagens HTMLlinks e botões funcionavamlinks viraram texto, botões removidos
Emoji-status do interlocutorvisível no cabeçalho do chat e no perfiloculto, para assinantes Premium, uma estrela no lugar

Leitura. O recibo de leitura no Telegram e a redefinição do contador de mensagens não lidas de um chat são a mesma ação: o cliente informa ao servidor o número da última mensagem lida, e o servidor mostra ao remetente a segunda marca de seleção. Agora, o cliente retém essa ação enquanto o interlocutor for suspeito, e em mais um caso: quando o chat com um não-contato é aberto pela primeira vez e as configurações ainda não chegaram do servidor. Não é possível cancelar um recibo de leitura enviado, então o cliente aguarda uma decisão, em vez de ler "por precaução". No comentário à verificação da alteração, é dito que no simulador as decisões de leitura eram adiadas e aplicadas após o fechamento do painel e após o envio da mensagem.

Botões. As fileiras de botões abaixo das mensagens foram removidas de bolhas comuns, figurinhas e vídeos redondos. Para mensagens HTML, uma transformação separada foi adicionada: links, endereços de e-mail, menções, hashtags, números de cartão e endereços TON tornam-se texto, botões incorporados desaparecem, de um botão formatado como link, apenas o texto permanece, e a imagem perde o link. Números de telefone, comandos de bot, datas, âncoras e custom emoji permanecem. Cada bloco mantém seu número, para que as citações a essas mensagens continuem a se referir aos mesmos locais.

Prévia de links. O cartão de prévia de tal mensagem não tem mais um botão, a mídia dele não abre, e do texto da prévia foram removidos os mesmos links que do texto da mensagem.

Emoji-status. O status não é exibido no cabeçalho do chat, na nota do painel sobre Premium e no cabeçalho do perfil, incluindo a capa e as cores do status colecionável.

A regra se aplica apenas a chats privados. As linhas na lista de chats, a pesquisa, bem como grupos e canais com o painel de denúncia não são alterados.

Como sair deste modo

Quatro ações removem o painel, mas nem todas desativam o modo no código do cliente:

  1. Fechar o painel com o "X". O cliente chama messages.hidePeerSettingsBar e zera os sinalizadores do chat por conta própria, sem esperar pelo servidor. A denúncia de spam também remove os sinalizadores localmente.
  2. Bloquear o interlocutor ou adicioná-lo aos contatos. O cliente altera apenas o bloqueio ou o status do contato, não toca nos sinalizadores report_spam e block_contact: o modo terminará quando o servidor enviar novas configurações de chat.
  3. Responder. Ao enviar qualquer mensagem, exceto uma mensagem agendada, o cliente remove esses dois sinalizadores do chat por conta própria; a sugestão "Adicionar aos contatos" permanece. Uma mensagem agendada não chega a ninguém até a hora marcada e não desativa o modo.

O terceiro caminho é descrito no repositório com uma ressalva: os sinalizadores ao responder são removidos apenas localmente, e users.getFullUser sobrescreve as configurações do chat com o que o servidor enviou a cada atualização. Se o servidor não remover os sinalizadores após sua resposta, o modo retornará na próxima atualização. Em 21 de outubro, os autores da alteração não haviam verificado isso, pois não tinham uma segunda conta para teste. Uma opção alternativa que eles mencionam é chamar hidePeerSettingsBar ao enviar, mas então "Adicionar aos contatos" também desapareceria.

O que se sabe sobre a compilação

O commit foi para a main branch em 22 de outubro às 11:20 UTC. 51 minutos depois, às 12:11 UTC, o número da versão em versions.json mudou para 13.1.1, a tag release-13.1.1 está neste commit com o número, e 007fb3f1 está incluído nele três commits antes. Na App Store, a versão 13.1.1 foi lançada no mesmo dia às 18:45 UTC com a descrição "Bug fixes, minor improvements, and more". A compilação da App Store não foi verificada com o código aberto. A mesma versão adapta a interface para o iPhone Duo dobrável.

A verificação da alteração foi feita em um simulador com um interruptor temporário que ativava o modo forçadamente, mas não foi incluído no commit. Teclados comuns e botões de link foram verificados no simulador, e a transformação de mensagens HTML foi coberta apenas por testes; não houve uma mensagem HTML real de um estranho na verificação. A assinatura do commit é compartilhada por uma pessoa e Claude Opus 5.5.

País do número e nova entrada CanadaVoIP

O cartão do estranho obtém o país do número não do próprio número, mas do campo phone_country das mesmas configurações do chat: o servidor envia um código de duas letras, o cliente o procura na lista de países help.getCountriesList, insere o nome e desenha a bandeira de acordo com o código. Para o código FT, o iOS escreve "Anônimo" (são números +888), para TS – "Test".

Em 24 de outubro, uma nova entrada apareceu nesta lista: código CP, nome CanadaVoIP, código de telefone +1, sem prefixos ou padrões de número. Primeiro, ela foi recebida pelo servidor de teste, por volta das 09:33 UTC, depois pelo servidor principal, por volta das 12:18 UTC. A entrada é marcada como oculta. Antes dela, havia três entradas ocultas na lista: XG "Global Mobile Satellite System" (+881), XV "International Networks" (+882, +883) e YL "Y-land" (+42). No total, a lista contém 236 entradas.

As entradas ocultas não são exibidas pelo iOS na seleção de país ao fazer login, mas são armazenadas e encontradas pelo código. Ao discar, a entrada também não será encontrada: ao fazer a correspondência, ela é sobreposta pelos EUA, que vêm depois na lista com o mesmo código +1. Resta um lugar onde o cliente a lerá — o código phone_country vindo do servidor. O servidor, por essa lógica, pretende distinguir os números de operadoras virtuais canadenses dos demais números com código +1, e no cartão do estranho no iPhone, em vez de "Canadá", aparecerá a palavra CanadaVoIP. Esta é uma conclusão da lista e do código do cliente; nenhum chat real com tal código foi observado.

O Telegram Desktop descarta as entradas ocultas inteiramente ao carregar a lista, então para o código CP ele desenhará uma bandeira sem nome. A bandeira para ambos os clientes é a mesma, por duas letras: no ISO 3166-1, o código CP é reservado para a Ilha Clipperton, um território francês desabitado no Oceano Pacífico.