倒數第二天回頭稍微看看另一個有實作 device activity 的專案 (by Tarık Ayberk Yılıkoğlu)。
在第一次進入 app 的時候,這個專案一樣使用了 AuthorizationCenter.shared.requestAuthorization 去請求授權,而專案也在最外層的 Screen_TimeApp 和 MonitorExtension 中都標示了 @Main。
中間關於幾個 struct 的交互看起來有點小複雜,首先 MonitorExtension 是 DeviceActivityReportExtension,這可以顯示自定義的使用時間報告,不過裡面需要實現 DeviceActivityReportScene。而當接收到 totalActivity 時,會把它傳遞給 TotalActivityReport。
TotalActivityReport 裡面的 content 是 closure,接收一個 ActivityReport 為參數,然後返回 TotalActivityView。而 TotalActivityView 在拿到 ActivityReport 之後,其實做的事情很簡單,只是單純的拿取裡面的的資料並用特定的 UI 格式去渲染出來而已。
TotalActivityReport 裡面還有一個重要的 function:makeConfiguration,被用來生成需要的 ActivityReport 數據。這個函示會接收 DeviceActivityResults<DeviceActivityData> 做為參數,然後對裡面的內容經過處理後再傳遞下去。
最後,翻的時候意外在這個 repo 的 issue 中看到有人留言說 simulator 上跑不出資料,而作者回應說模擬器上面本來就無法正常顯示,要跑在實體機上才會收到結果,這樣好像得想個辦法把 iphone 和 mac 串起來啊。