我希望 Apple 修好 Screen Time API 的 3 件事

同一個 App 封鎖工具做在 iPhone 和 Android 上,我遇到的事。作者:Thomas Willheim · 2026 年 9 月 30 日

我做了 HonorFit,一個靠做伏地挺身賺螢幕使用時間的 App 封鎖工具(誠實制,不用鏡頭)。iPhone 和 Android 上是同一個 App,同一個概念,大部分的程式碼也是同一套。老實說呢?Android 版比較好用。

這不是因為 Android 比較會封鎖 App。iOS 的 Screen Time API 在「封鎖」這件事上其實非常扎實。問題在於 iOS 在三件特定的事情上把你綁得死死的,而這三件事看起來都不是為了保護使用者。所以這是我的清單,附上我想跟 Apple 要求的東西。我盡量只挑那些不會讓任何人犧牲隱私的項目。

(如果你想看用這個 API 開發的實作細節,我另外寫了一篇:Apple 文件沒告訴你的事。)

1. 一次只能有一個螢幕使用時間 App

假設你已經在用 Brick、Opal 或 one sec,也想試試 HonorFit。在 iPhone 上辦不到。第二個 App 要求取用螢幕使用時間的時候,iOS 連權限提示都不會跳出來,只會丟出一個錯誤,意思是 Family Controls 一次只能給一個 App 使用。我自己就碰過這個錯誤,其他開發者也遇到了。

想換的話,你得到「設定」›「螢幕使用時間」›「可取用螢幕使用時間的 App」,把另一個 App 關掉,有時候還得重新開機。HonorFit 現在會偵測這個錯誤,一步一步帶使用者處理,因為原始的錯誤訊息對一般人來說根本看不懂。

iPhone 上的 HonorFit 提示:另一個 App 正在使用螢幕使用時間。iOS 一次只允許一個 App 控制螢幕使用時間,並列出到「設定」關閉另一個 App 的步驟
當另一個 App 已經取得螢幕使用時間權限時,iPhone 使用者在 HonorFit 裡看到的畫面。iOS 本身只會丟給 App 一個錯誤,這段說明是我們自己寫的。

奇怪的地方在這裡:Apple 在 WWDC22 推出這種授權的時候,他們說過,跟家長監護用的授權不同,個人授權可以讓同一台裝置上任意數量的 App 使用。但現在實際上不是這樣,而且我在任何地方都找不到相關的文件說明。

為什麼這對使用者沒有好處:大家會混著用不同的工具。有人可能上班時用 Brick 來進入深度專注,晚上再用 HonorFit 賺滑手機的時間。Apple 其實已經有一套合併限制的規則:當好幾個 ManagedSettingsStore 設定了同一件事,用 Apple 的話來說就是「the most restrictive setting always wins」(最嚴格的設定永遠優先)。在不同 App 之間也照這樣做,大家就能同時使用兩個 App,而手機只會因此被鎖得更緊,絕對不會更鬆。

我想要求的:讓不只一個 App 能取得個人的螢幕使用時間授權,就像 WWDC22 說的那樣,並用同樣的「最嚴格者優先」規則來合併它們的封鎖畫面。如果這個限制真的有理由,就把它寫進文件,再給 App 一個像樣的錯誤代碼,讓 App 能跟使用者解釋。

2. App 選擇器很難用,而且 App 沒辦法自訂

在 iPhone 上,要挑選封鎖哪些 App,就只能用 Apple 的 FamilyActivityPicker。它是一個 App 無法修改的系統畫面,頂多只能改一行標題和頁尾文字。它一打開是一串類別(社交、遊戲、娛樂……),你得點進類別裡才找得到真正的 App。在 Android 上,清單是我自己做的,所以 HonorFit 會把你裝的 App 依照過去 24 小時的使用時間排序。

iOS 的螢幕使用時間 App 選擇器:一串 App 類別,其中「健康與健身」展開顯示裡面的 App
iPhone:Apple 的選擇器。先看到類別,沒有使用時間,每個 App 看到的都一樣。
HonorFit 的 Android App 選擇器:列出每個 App 過去 24 小時的使用時間,用最多的排最前面
Android:HonorFit 自己的清單,依使用時間排序,最殺時間的 App 就在最上面。

iOS 的選擇器有兩件事讓我很困擾:

這不會犧牲任何隱私。選擇器是 iOS 在它自己的程序裡畫出來的。App 永遠看不到裡面的內容,只會拿到你選的項目對應的不透明 token。HonorFit 真的沒辦法知道你選了哪些 App。所以 iOS 大可以直接在選擇器裡顯示使用時間,App 還是什麼都不會知道。Apple 其實已經用 DeviceActivityReport extension 做過類似的事:在一個 App 讀不到的沙盒裡顯示你的使用情況。

我想要求的:
  1. 選擇器提供一個選項,可以設定成能選整個類別,或只能選 App,這樣 App 封鎖工具就能提供一份只有 App 的清單,不會不小心選到類別(如果用不到網站,也可以把網站藏起來)。
  2. 提供一個選項,可以依照實際的螢幕使用時間排序,並顯示出來,放在每個 App 旁邊,由 iOS 負責繪製,App 永遠看不到這些數字。

3. 你看不到剩餘時間的準確倒數

在 HonorFit 裡,你賺到的時間只有在你真的打開被封鎖的 App 時才會扣。所以最理所當然要顯示的,就是倒數計時:「剩 12:34」,你滑的時候往下跳,離開時就停住。

在 Android 上這很簡單。HonorFit 的背景服務每秒檢查一次畫面上是哪個 App,通知用的是 Android 內建的倒數計時器,所以通知欄每秒都會自己重畫。把通知欄拉下來,就能看到你還剩多少時間,精確到秒。

在 iPhone 上做不到,原因是這樣的:

所以 iPhone 使用者拿到的是一個粗略的估計值,Android 使用者看到的則是真正的數字。

我想要求的:讓 DeviceActivity 事件能驅動一個由 iOS 自己繪製的倒數計時:放在通知、即時動態或封鎖畫面上,只在被監控的 App 顯示在畫面上時才跑。iOS 本來就把這些使用時間記錄到秒,所以它可以直接顯示時間,不用交給 App 任何新的資料。就算只是給監控 extension 簡單的「被封鎖的 App 打開了/關閉了」回呼,也能解決大部分的問題。

就這樣

說句公道話,Apple 在這裡的隱私模型真的很好。App 永遠不會知道你封鎖了什麼、用了多少,我也很不希望這點改變。上面這三件事都不會改變它。它們只是讓 iPhone App 能跟 Android 版一樣好用而已。

如果你也在用螢幕使用時間開發 App,也想要這些功能,請到意見回饋輔助程式(Feedback Assistant)提出回報。據我所知,重複的回報越多,越容易被注意到。如果你只是想試試這個 App,HonorFit 在 iPhone 和 Android 上都免費。也許你們有些人會喜歡它!

延伸閱讀