Screen Time APIでAppleに直してほしい3つのこと
僕はHonorFitというアプリブロッカーを作っています。腕立て伏せをするとスクリーンタイムを稼げるアプリです(自己申告制で、カメラは使いません)。iPhoneとAndroidで同じアプリ、同じコンセプトで、コードもほとんど共通です。で、正直に言うと、Android版のほうが使いやすいんです。
Androidのほうがアプリのブロックが得意だから、ではありません。ブロックすること自体については、iOSのScreen Time APIは実はかなりしっかりしています。理由は、iOSが3つの点で開発者を縛っていて、そのどれもユーザーを守るためにあるようには見えないことです。というわけで、Appleにお願いしたいことと合わせて、僕のリストを書いておきます。誰のプライバシーも犠牲にしないものに絞ったつもりです。
(このAPIで開発するときの具体的な話は、別の記事にまとめました:Appleのドキュメントに書かれていないこと)
1. スクリーンタイムを使えるアプリは一度に1つだけ
たとえば、すでにBrick、Opal、one secのどれかを使っていて、HonorFitも試してみたいとします。iPhoneではそれができません。2つめのアプリがスクリーンタイムへのアクセスを求めても、iOSは許可を求めるダイアログすら出しません。Family Controls is available for only one application at a time(Family Controlsは一度に1つのアプリでしか使えません)という趣旨のエラーを返すだけです。僕自身もこのエラーを見ていますし、ほかの開発者も同じ問題にぶつかっています。
切り替えるには、設定 › スクリーンタイム › スクリーンタイムにアクセスできるAppを開いてもう一方のアプリをオフにし、場合によってはスマホを再起動する必要があります。生のエラーメッセージは普通の人には何の意味もないので、HonorFitは今ではこのエラーを検出して、手順を案内するようにしています。
不思議なのはここです。AppleはWWDC22でこの種の認可を紹介したとき、保護者による管理のための認可とは違って、個人用の認可はデバイス上のいくつのアプリでも使える、と説明していました。今の挙動はそうなっていませんし、そのことが書かれたドキュメントも見つけられませんでした。
これがユーザーのためにならない理由:人はツールを組み合わせて使います。仕事中の集中セッションにはBrickを、夜のスクロール時間を稼ぐにはHonorFitを、という人もいるでしょう。Appleには、制限を組み合わせるためのルールがすでにあります。複数のManagedSettingsStoreが同じ項目を設定した場合、Appleの言葉を借りれば “the most restrictive setting always wins”(いちばん厳しい設定が常に優先される)です。同じことをアプリ間でもやれば両方使えるようになりますし、それならスマホの制限は強くなることはあっても、弱くなることはありません。
2. アプリ選択画面が使いにくく、アプリ側でカスタマイズもできない
iPhoneでブロックするアプリを選ぶには、AppleのFamilyActivityPickerを使うしかありません。システムのシートで、ヘッダーとフッターに1行ずつテキストを入れられる以外、アプリからは何も変えられません。開くとカテゴリの一覧(ソーシャル、ゲーム、エンターテインメント...)が表示され、カテゴリをタップして中に入らないと実際のアプリは出てきません。Androidでは一覧を自分で作れるので、HonorFitはインストール済みのアプリを、過去24時間の使用時間が長い順に表示しています。
iOS版で気になるのは2点です。
- うっかりカテゴリごとブロックしやすい。カテゴリを開くつもりが行そのものをタップすると、そのカテゴリのアプリが全部、しかもあとからインストールするアプリまで選択されてしまいます。多くのアプリにとって、それは決して望んでいる動きではありません。選びたいのはInstagramとTikTokであって、「ソーシャル」ではないんです。
- どのアプリに1日を食われているのかが見えない。そもそもアプリブロッカーを開く理由は「スマホを使いすぎている」からです。ピッカーは、何をブロックするかを決めるまさにその瞬間なのに、時間がどこに消えているのかの情報をまったく出してくれません。iPhoneは各アプリの使用時間を正確に把握していますが(設定にそのまま出ています)、ピッカーには表示されません。
これはプライバシーを一切犠牲にしません。ピッカーはiOSが自分のプロセスで描画しています。アプリにはその中身が見えず、受け取るのは選ばれたものを表す中身の見えないトークンだけです。HonorFitは、あなたがどのアプリを選んだのか文字通り分かりません。つまり、iOSがピッカーの中に使用時間を表示しても、アプリが知ることは何もありません。AppleはすでにDeviceActivityReport Extensionで似たことをやっています。アプリからは読めないサンドボックスの中で、使用状況を表示する仕組みです。
- ピッカーでカテゴリごと選べるようにするか、アプリだけにするかを指定できるオプション。アプリブロッカーが、うっかりカテゴリを選んでしまうことのない「アプリだけ」の一覧を出せるように(Webサイトを使わないならそれも非表示にできるように)。
- 各アプリの横に計測済みの使用時間を表示し、その順に並べるオプション。描画はiOSが行い、アプリには数値が一切渡らない形で。
3. 残り時間の正確なカウントダウンが見られない
HonorFitでは、稼いだ時間はブロック中のアプリを実際に使っているあいだだけ減ります。なので、当然表示したいのはカウントダウンです。「残り12:34」と表示され、スクロール中は減っていき、アプリを離れると止まる、というものです。
Androidでは簡単です。HonorFitのバックグラウンドサービスが毎秒どのアプリが画面に出ているかをチェックし、通知にはAndroid標準のカウントダウンタイマーを使っているので、通知パネルが毎秒勝手に描き直してくれます。通知パネルを下ろせば、残り時間が秒単位で正確に分かります。
iPhoneではそれができません。理由はこうです。
- iOSは、ユーザーがブロック中のアプリを開いたことも離れたことも、アプリに一切伝えません。届くのは「使用時間がこれだけたまりました」というイベントだけです。HonorFitは使用15秒ごとにイベントを設定していて、それが通知を更新するバックグラウンドのExtensionに届きます。
- 普通の通知は自分でカウントダウンできないので、HonorFitにできるのはイベントが届くたびに文言を差し替えることだけです。だからiPhoneの通知は「残り約12:30」のように「約」がついていて、15秒刻みで飛びます。
- そのイベントも、いつも時間どおりに届くとは限りません。iOS 26では、遅れて届いたり、いくつかまとめて届いたりするのを見ています。
- ライブアクティビティなら自分でカウントダウンできますが、一時停止ができません。Instagramを離れたことをアプリに伝える仕組みがないので、ライブアクティビティにするとスマホがテーブルに置かれたままでもカウントが進み続けてしまい、表示が間違ったものになります。
というわけで、Androidユーザーには本当の数字が見えるのに、iPhoneユーザーにはおおよその目安しか出せません。
DeviceActivityのイベントで、iOS自身が描画するカウントダウンを動かせるようにしてほしい。通知でも、ライブアクティビティでも、シールドでもいいので、監視対象のアプリが画面に出ているあいだだけ進むものを。iOSはすでにその使用時間を秒単位で追跡しているので、アプリに新しい情報を渡さなくても時間を表示できるはずです。モニターExtensionに「ブロック中のアプリが開かれた/閉じられた」という単純なコールバックがあるだけでも、ほとんど解決します。以上です
Appleの名誉のために言っておくと、ここのプライバシーモデルは本当によくできています。アプリは、あなたが何をブロックしたのかも、どれだけ使っているのかも知りません。ここが変わってほしくはありません。上の3つはどれも、それを変えるものではありません。iPhoneのアプリを、Android版がすでにそうであるのと同じくらい役に立つものにしてくれるだけです。
Screen Time APIで開発していて、どれかが欲しいと思った人は、ぜひフィードバックアシスタントで報告してください。僕の理解では、同じ内容の報告がたくさん届くことで気づいてもらえるようです。アプリを試してみたいだけなら、HonorFitはiPhoneとAndroidで無料です。気に入ってもらえたらうれしいです!