我希望 Apple 修好 Screen Time API 的 3 件事
我做了 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 現在會偵測這個錯誤,一步一步帶使用者處理,因為原始的錯誤訊息對一般人來說根本看不懂。
奇怪的地方在這裡:Apple 在 WWDC22 推出這種授權的時候,他們說過,跟家長監護用的授權不同,個人授權可以讓同一台裝置上任意數量的 App 使用。但現在實際上不是這樣,而且我在任何地方都找不到相關的文件說明。
為什麼這對使用者沒有好處:大家會混著用不同的工具。有人可能上班時用 Brick 來進入深度專注,晚上再用 HonorFit 賺滑手機的時間。Apple 其實已經有一套合併限制的規則:當好幾個 ManagedSettingsStore 設定了同一件事,用 Apple 的話來說就是「the most restrictive setting always wins」(最嚴格的設定永遠優先)。在不同 App 之間也照這樣做,大家就能同時使用兩個 App,而手機只會因此被鎖得更緊,絕對不會更鬆。
2. App 選擇器很難用,而且 App 沒辦法自訂
在 iPhone 上,要挑選封鎖哪些 App,就只能用 Apple 的 FamilyActivityPicker。它是一個 App 無法修改的系統畫面,頂多只能改一行標題和頁尾文字。它一打開是一串類別(社交、遊戲、娛樂……),你得點進類別裡才找得到真正的 App。在 Android 上,清單是我自己做的,所以 HonorFit 會把你裝的 App 依照過去 24 小時的使用時間排序。
iOS 的選擇器有兩件事讓我很困擾:
- 很容易一不小心就封鎖了整個類別。如果你點的是類別那一列,而不是把它展開,你就選了裡面所有的 App,包括你之後才安裝的。對很多 App 來說,這從來都不是你想要的。你要的是 Instagram 和 TikTok,不是整個「社交」。
- 你看不到哪些 App 真正吃掉了你的一天。會打開 App 封鎖工具的人,理由就是「我花太多時間在手機上了」。選擇器是他們決定要封鎖什麼的那一刻,但它完全沒告訴他們時間花到哪裡去了。你的 iPhone 明明清楚知道你在每個 App 花了多久(「設定」裡就看得到),選擇器卻不顯示。
這不會犧牲任何隱私。選擇器是 iOS 在它自己的程序裡畫出來的。App 永遠看不到裡面的內容,只會拿到你選的項目對應的不透明 token。HonorFit 真的沒辦法知道你選了哪些 App。所以 iOS 大可以直接在選擇器裡顯示使用時間,App 還是什麼都不會知道。Apple 其實已經用 DeviceActivityReport extension 做過類似的事:在一個 App 讀不到的沙盒裡顯示你的使用情況。
- 選擇器提供一個選項,可以設定成能選整個類別,或只能選 App,這樣 App 封鎖工具就能提供一份只有 App 的清單,不會不小心選到類別(如果用不到網站,也可以把網站藏起來)。
- 提供一個選項,可以依照實際的螢幕使用時間排序,並顯示出來,放在每個 App 旁邊,由 iOS 負責繪製,App 永遠看不到這些數字。
3. 你看不到剩餘時間的準確倒數
在 HonorFit 裡,你賺到的時間只有在你真的打開被封鎖的 App 時才會扣。所以最理所當然要顯示的,就是倒數計時:「剩 12:34」,你滑的時候往下跳,離開時就停住。
在 Android 上這很簡單。HonorFit 的背景服務每秒檢查一次畫面上是哪個 App,通知用的是 Android 內建的倒數計時器,所以通知欄每秒都會自己重畫。把通知欄拉下來,就能看到你還剩多少時間,精確到秒。
在 iPhone 上做不到,原因是這樣的:
- iOS 從來不會告訴 App 你什麼時候打開或離開被封鎖的 App。你只會收到「使用時間已經累積到這麼多」的事件。HonorFit 每 15 秒的使用設一個事件,這些事件會送到一個背景 extension,由它來更新通知。
- 一般的通知沒辦法自己倒數,所以 HonorFit 頂多只能在每次事件進來時換上新的文字。這就是為什麼 iPhone 上的通知會寫「大約剩 12:30」,前面加個「大約」:它是以 15 秒為單位跳動的。
- 這些事件也不一定會準時到。在 iOS 26 上,我看過它們晚到,或好幾個一起到。
- 即時動態(Live Activities)可以自己倒數,但不能暫停。沒有任何東西會告訴 App 你已經離開 Instagram 了,所以即時動態會在你的手機放在桌上時繼續倒數,這樣就錯了。
所以 iPhone 使用者拿到的是一個粗略的估計值,Android 使用者看到的則是真正的數字。
DeviceActivity 事件能驅動一個由 iOS 自己繪製的倒數計時:放在通知、即時動態或封鎖畫面上,只在被監控的 App 顯示在畫面上時才跑。iOS 本來就把這些使用時間記錄到秒,所以它可以直接顯示時間,不用交給 App 任何新的資料。就算只是給監控 extension 簡單的「被封鎖的 App 打開了/關閉了」回呼,也能解決大部分的問題。就這樣
說句公道話,Apple 在這裡的隱私模型真的很好。App 永遠不會知道你封鎖了什麼、用了多少,我也很不希望這點改變。上面這三件事都不會改變它。它們只是讓 iPhone App 能跟 Android 版一樣好用而已。
如果你也在用螢幕使用時間開發 App,也想要這些功能,請到意見回饋輔助程式(Feedback Assistant)提出回報。據我所知,重複的回報越多,越容易被注意到。如果你只是想試試這個 App,HonorFit 在 iPhone 和 Android 上都免費。也許你們有些人會喜歡它!