Как bluesky показывает логотип на скриншотах
Замечали когда-нибудь, что на скриншотах из Bluesky в углу экрана появляется логотип приложения? При этом в самом приложении его нет — там на его месте кнопка «Follow». Кто-то скажет: «Ну подумаешь, приделали watermark». Но механизм-то оказался гораздо изящнее.
Мне попалась статья Тимамаринина, где он разбирает этот фокус. Давайте разберёмся, как это устроено и почему это не баг, а фича.
Логотип, которого не было
Итак, картина: вы листаете ленту Bluesky, находите пост, делаете скриншот. Отправляете другу. Друг открывает — а в углу красуется логотип Bluesky. Но секунду: когда вы были в приложении, никакого логотипа там не было.
Пытливый автор статьи решил выяснить, в чём дело. Сначала он сделал скриншот:
┌─────────────────────────────────┐ │ Пост в ленте │ │ ┌─────────────────┐ │ │ │ Контент поста │ │ │ │ ... │ │ │ └─────────────────┘ │ │ [Follow]│ ← кнопка вместо логотипа └─────────────────────────────────┘
Потом сделал скриншот во время переключения между приложениями:
┌─────────────────────────────────┐ │ Пост в ленте │ │ ┌─────────────────┐ │ │ │ Контент поста │ │ │ │ ... │ │ │ └─────────────────┘ │ │ [Follow]│ ← кнопка видна └─────────────────────────────────┘
Интересно: в момент переключения логотип не появляется, а при обычном скриншоте — появляется. Значит, дело не в каком-то слушателе нажатий.
Как они это сделали
Bluesky — приложение с открытым исходным кодом. Автор статьи нашёл ответ в файле GrowthHack.tsx, который использует пакет expo-privacy-sensitive (тоже от команды Bluesky).
Суть трюка в том, как iOS обрабатывает так называемые «secure text fields» — поля ввода, предназначенные для паролей и другой чувствительной информации. Когда вы делаете скриншот, iOS автоматически скрывает содержимое таких полей (заменяет на пустой прямоугольник), чтобы пароль не попал на скриншот.
МЕХАНИЗМ «ЗАЩИТЫ» СКРИНШОТА
───────────────────────────
iOS определяет скриншот
│
▼
┌──────────────────────┐
│ Secure Text Field │
│ (кнопка Follow) │────────► Скрывается при скриншоте
└──────────────────────┘ │
│ │
▼ ▼
┌──────────────────────┐ ┌─────────────┐
│ Logo │ │ [blank] │
│ (логотип Bluesky) │ │ пустота │
└──────────────────────┘ └─────────────┘
│
▼
Логотип остаётся видимым!
Bluesky рендерит кнопку «Follow» внутри такого защищённого поля. Когда система фиксирует скриншот — она прячет поле, и логотип волшебным образом проступает на экран. Это не баг iOS — это фича, которую используют для защиты приватности. Telegram и Signal используют тот же приём для «секретных» чатов.
Почему не работает при переключении приложений
Когда вы делаете свайп для переключения между приложениями, iOS делает «слепок» экрана заранее, до того как вы отпустили палец. В этот момент защищённое поле ещё не «знает» о скриншоте — оно уже отрендерено как статичная картинка. Поэтому при переключении вы видите обычную кнопку, а не логотип.
РАЗНИЦА МЕЖДУ СКРИНШОТОМ И ПЕРЕКЛЮЧЕНИЕМ ──────────────────────────────────────── Скриншот: Переключение: ┌──────────────┐ ┌──────────────┐ │ iOS ловит │ │ iOS делает │ │ событие │ │ заранее │ ├──────────────┤ ├──────────────┤ │ поле скрыто │ │ поле видно │ └──────────────┘ └──────────────┘
Стоит ли ругать или хвалить?
В комментариях к оригинальному посту мнения разделились. Кто-то считает это наглым брендингом, кто-то — просто умным UX-хаком.
Моё мнение: с одной стороны, да, это накладывает водяной знак без явного согласия пользователя. С другой — это не вредоносное поведение, а просто маркетинг. Логотип никому не мешает и исчезает, стоит вам переслать картинку в мессенджере.
К тому же Apple вряд ли будет это исправлять: трюк с защищёнными полями используется легитимными приложениями для защиты данных. Заблокировать его — значит сломать приватность для всех.
Практический вывод
Если вы мобильный разработчик и хотите автоматически добавлять водяной знак на скриншоты — этот способ изящнее, чем перехватывать события или обрабатывать изображение постфактум. Достаточно одного системного поведения iOS. Минус: работает только на iOS и только при «честном» скриншоте, а не при переключении приложений.
А вообще, приятно, когда за внешне простым поведением скрывается такой уютный инженерный хак. Bluesky, конечно, не первые, но сделали чисто.
Ссылки
- How Bluesky draws its logo on screenshots — timmarinin.net — разбор механизма на iOS
- Bluesky на GitHub — исходный код и репозитории проекта
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.