Weatherling雨の日が、いちばん好き

ブログ · · 更新日: · 著者:Matt Senter

画面収録なしで、ウインドウの向こうに雨を

Weatherling は、画面収録を含め特別な権限なしでウインドウの背後に雨を描きます。画面の内容を見ることはありません。macOS がすべてのアプリに公開する各ウインドウの輪郭を使い、ネットワーク接続のない Apple の App Sandbox 内で動きます。

出来すぎた話に聞こえるかもしれません。雨粒がタイトルバーに落ち、側面を流れ、手前のウインドウの後ろに消えるのを見ると、画面の内容をどう把握しているのか気になるでしょう。答えは、内容を把握していない、です。場所だけを知っており、雨にはそれだけで十分なのです。

ウインドウの内容ではなく、形状を使う

すべての Mac アプリは、画面上のウインドウ一覧を macOS に問い合わせられます。Weatherling が使うのは、CGWindowListCopyWindowInfoという公開 API です。ウインドウ管理アプリやスクリーンショットツールも最初に使うもので、各ウインドウについて次の五つだけを読みます:

  • 境界。 ウインドウの位置と大きさ。
  • レイヤー。 通常のウインドウ、メニュー、システム UI のどれに属するか。
  • アルファ値。 見えているか、完全に透明か。
  • ウインドウ番号。 移動するウインドウを追跡するための ID。
  • 所有プロセス ID。 Weatherling 自身のウインドウとほかのウインドウを区別するためだけの数値。

一覧は手前から奥への順番で返されます。これが仕組みのもう半分です。手前のウインドウを通り過ぎ、奥に落ちる雨粒は、一覧の次の輪郭と照合しているだけです。どちらの画素も見ずに、あるウインドウの前、別のウインドウの後ろに雨を描けます。

同じ一覧にはタイトル、所有アプリ名、共有状態もありますが、Weatherling はこれらを読みません。雨に必要なく、触れないことが権限を不要にしている理由の一つです。

タイトルの取得に画面収録の権限が必要な理由

macOS Catalina 以降、ほかのアプリのウインドウタイトルは画面内容として扱われます。メールの件名、文書名、読んでいるページなどが含まれるため、macOS は画面収録を許可したアプリにだけタイトルを渡します。権限がなければ、タイトル欄は空で返されます。

この境界を守ることが設計上の制約です。メールとコードエディターで動作を変えるなら、タイトルや画面取得が必要となり、許可を求める必要があります。Weatherling が知りたいのはウインドウの種類ではなく位置だけなので、許可が不要な側にとどまれます。ほかのアプリ内部を読んだり操作したりしないため、アクセシビリティも不要です。キーボード監視、入力アクセス、オートメーションもありません。

必要最小限のサンドボックス

Mac App Store のアプリは Apple の App Sandbox 内で動作し、ネットワーク、カメラ、コンテナー外のファイルなどへの追加アクセスをエンタイトルメントで宣言します。Weatherling が宣言するのは、com.apple.security.app-sandbox と、 com.apple.security.files.user-selected.read-writeです。後者は保存ダイアログで選んだファイルにスコアカードを保存するためのものです。(Apple のコード署名は、追加の権限を与えないアプリ ID とチーム ID も付与します。)

宣言しないことにも意味があります。ネットワーククライアントのエンタイトルメントがないサンドボックスアプリは外向きの接続を開けません。通信しないことは約束だけでなく、macOS によって強制されます。アカウント、アクセス解析、クラッシュ報告サービスはありません。雨の強さや風などの設定は、Mac 内のアプリ専用領域に保存します。

雨音も同様です。録音はアプリに同梱され、通話中はフェードアウトします。Weatherling は、どれかのアプリがマイクを使用中かを、macOS が知らせる真偽値で確認します。マイクを開いたり、録音したり、マイクの権限を求めたりはしません。

自分で確認する

説明を信じるだけでなく、約1分で三つの確認ができます:

  1. 「システム設定」>「プライバシーとセキュリティ」>「画面収録」(新しい macOS では「画面とシステムオーディオ録音」)を開いてください。Weatherling は一度も権限を求めていないため、一覧にありません。
  2. 同じ場所で「アクセシビリティ」と「マイク」も確認してください。どちらにもありません。
  3. ターミナルで次を実行します:codesign -d --entitlements - /Applications/Weatherling.app。Apple の署名が付与するアプリ ID とチーム ID を除くと、App Sandbox とスコアカード保存用のユーザー選択ファイルへのアクセスだけです。ネットワークの権限はありません。

将来のバージョンで追加の権限が必要になれば、先に確認画面が出ます。macOS は、これらをアプリが黙って取得することを認めません。

ウインドウを追跡する負荷

ウインドウ一覧の取得は軽い処理です。静止中は毎秒約10回、移動中は短時間だけ頻度を上げ、ドラッグしたウインドウに水が遅れずついていくようにします。確認の間に保存するのは輪郭だけで、ウインドウを閉じるとすぐに消えます。

デスクトップの飾りのために、プライバシーを差し出す必要はありません。雨をオンにして気分に合わせたら、元の作業に戻りましょう。Weatherling は、その作業を知る必要がありません。

インストールせずに動きを試すなら、ホームページへ。動かせるウインドウで同じ考えをブラウザー上に再現しています。保存するもの、しないものの詳細は、プライバシーポリシーで説明しています。雨を楽しむ理由については、デスクトップの雨が心を落ち着かせる理由.