Web開発
Blueskyはスクリーンショットにロゴを描画する
Bluesky draws its logo on screenshots (timmarinin.net)
要約
Blueskyアプリがスクリーンショット時にのみ表示されるロゴの描画方法について解説しています。これは、iOSの`isSecureTextEntry`プロパティを持つ`UITextField`を利用し、通常はボタンを隠してロゴを表示させる巧妙な手法です。このトリックは、プライバシー保護APIの悪用とも見なされますが、TelegramやSignalでも類似の実装が見られます。
全文翻訳
スクリーンショットにロゴを描画する方法
時々、気に入った投稿のスクリーンショットを撮ることがあります。友人やミームチャンネルに送ったり、永続的なコピーとして保存したりするためです。
この投稿の右隅にあるBlueskyのロゴに気づき、アプリを使用しているときはロゴが気にならないのが奇妙だと思いました。
アプリで投稿を再度確認すると、ロゴはなく、「フォロー」ボタンに置き換わっていました。
一部のアプリは、iPhoneのノッチ部分にロゴを隠し、スクリーンショットを撮るまで目立たないようにしていることを思い出しました。
しかし、ここではロゴはむき出しの場所に配置されています。どうやってやっているのでしょうか?
別のアプリに切り替え中のスクリーンショットを撮ってみました。
アプリ切り替え中にスクリーンショットを撮ると、「フォロー」ボタンが表示されます。
スクリーンショットを撮るボタンとアプリ切り替えボタンを同時に押すリスナーを設定し、最後の瞬間に切り替えているのでしょうか?
私はiOS開発者ではないので、そこで何が可能で何が不可能か分かりません。
この時点で、私はかすかに興味をそそられました。
幸いなことに、Blueskyアプリはオープンソース(少なくともコードは閲覧可能)であることを思い出しました。
答えは、mozziusによって2026年1月に導入された、文字通りGrowthHack.tsxと呼ばれるファイルにありました。
しかし、それは単に依存関係を使用していただけなので、理解するために、同じく彼によって作成されたpackage expo-privacy-sensitiveを調べました。
このパッケージは、isSecureTextEntryプロパティをtrueに設定したUITextFieldを作成し、実際のコンテンツ(ボタン)をそのフィールドの.layerにレンダリングします。
スクリーンショットを撮ると、iOSはこのUITextFieldをレイヤーを空白にすることで非表示にし、Blueskyのロゴが羽を広げることを可能にします(ロゴは最初からそこにありました)。
他のプラットフォームでは、マスクせずにコンテンツをそのままレンダリングします。
なぜアプリを切り替えているときに機能しないのでしょうか?
iOSはジェスチャーの開始時にスナップショット自体を(空白化をトリガーせずに)取得し、スクリーンショットを撮るときには、反応するライブUITextFieldインスタンスがなく、不活性なスナップショットだけがあるためだと思います。
しかし、繰り返しになりますが、私はiOS開発者ではありません。
プライバシー目的のAPIの悪用か、気の利いたトリックか?
スレッドに追加された人々は、スレッドがロックされる前に、ほとんどその挙動を好んでいませんでした。
私はそれが可愛いと思います。
少しグーグルで調べたところ、このトリックはよく知られています。
Telegramは「秘密」チャットで同様のことを実装しており、Signalも同様なので、Appleによってすぐに修正されるとは思えません。
2026年8月16日日曜日、mtによって公開