3 điều mình mong Apple sửa trong Screen Time API
Mình làm HonorFit, một app chặn ứng dụng mà bạn kiếm thời gian sử dụng màn hình bằng cách hít đất (cơ chế tự giác, không camera). Trên iPhone và Android đều là cùng một app, cùng ý tưởng, phần lớn code cũng dùng chung. Và nói thật nhé? Bản Android dùng sướng hơn.
Không phải vì Android chặn ứng dụng giỏi hơn. Ở khâu chặn, Screen Time API của iOS thật ra rất chắc chắn. Lý do là iOS bó tay bạn ở ba chỗ cụ thể, và chẳng chỗ nào có vẻ là để bảo vệ người dùng. Nên đây là danh sách của mình, kèm điều mình muốn xin Apple. Mình cố chỉ nêu những thứ không bắt ai phải đánh đổi chút quyền riêng tư nào.
(Nếu bạn muốn bản chi tiết từng ốc vít về việc làm app với API này, mình đã viết riêng ở đây: những điều tài liệu của Apple không nói.)
1. Mỗi lúc chỉ có một app được dùng Thời gian sử dụng
Giả sử bạn đang dùng Brick, Opal hoặc one sec, và muốn thử thêm HonorFit. Trên iPhone thì không được. Khi app thứ hai xin quyền truy cập Thời gian sử dụng, iOS thậm chí không hiện hộp thoại xin quyền. Nó chỉ trả về một lỗi nói rằng Family Controls chỉ dùng được cho một ứng dụng tại một thời điểm. Chính mình đã gặp lỗi này, và các lập trình viên khác cũng đang gặp.
Muốn đổi, bạn phải vào Cài đặt › Thời gian sử dụng › Ứng dụng có quyền truy cập Thời gian sử dụng, tắt app kia đi, và đôi khi phải khởi động lại điện thoại. Giờ HonorFit đã tự phát hiện lỗi này và hướng dẫn người dùng làm từng bước, vì thông báo lỗi gốc chẳng có nghĩa gì với người bình thường.
Điều kỳ lạ là: khi Apple giới thiệu kiểu cấp quyền này ở WWDC22, họ đã nói rằng khác với cấp quyền kiểu kiểm soát của phụ huynh, cấp quyền cá nhân (individual) có thể được bao nhiêu app trên một thiết bị dùng cũng được. Thực tế hiện nay không như vậy, và mình không tìm thấy chỗ nào ghi lại điều này.
Vì sao điều này không có lợi cho người dùng: người ta hay kết hợp nhiều công cụ. Có người dùng Brick cho những phiên tập trung cao độ ở chỗ làm, và HonorFit để kiếm thời gian lướt buổi tối. Apple vốn đã có quy tắc để gộp các giới hạn: khi nhiều ManagedSettingsStore cùng đặt một thứ, theo lời Apple thì “the most restrictive setting always wins” (cài đặt hạn chế nhất luôn thắng). Áp dụng y như vậy giữa các app sẽ cho người dùng dùng cả hai, và theo cách đó điện thoại chỉ có thể bị khóa chặt hơn, không bao giờ lỏng hơn.
2. Bộ chọn ứng dụng khó dùng, và app không tùy chỉnh được
Trên iPhone, chọn app để chặn nghĩa là dùng FamilyActivityPicker của Apple. Đó là một bảng hệ thống mà app không thay đổi được gì, ngoại trừ một dòng chữ ở đầu và cuối. Nó mở ra với danh sách các danh mục (Mạng xã hội, Trò chơi, Giải trí...), và bạn phải chạm vào từng danh mục mới tìm thấy các app thật sự. Trên Android, mình tự dựng danh sách, nên HonorFit hiển thị các app đã cài, sắp xếp theo thời gian bạn dùng mỗi app trong 24 giờ qua.
Có hai điều ở bộ chọn của iOS làm mình khó chịu:
- Rất dễ lỡ tay chặn cả một danh mục. Chạm vào dòng danh mục thay vì mở nó ra là bạn vừa chọn mọi app trong đó, kể cả những app bạn cài sau này. Với rất nhiều app, đó không bao giờ là điều bạn muốn. Bạn muốn chặn Instagram và TikTok, chứ không phải cả “Mạng xã hội”.
- Bạn không thấy được app nào thật sự đang ngốn thời gian của mình. Lý do duy nhất người ta mở một app chặn ứng dụng là “mình dùng điện thoại quá nhiều”. Bộ chọn là đúng khoảnh khắc họ quyết định chặn gì, vậy mà nó không cho họ chút thông tin nào về việc thời gian của họ đi đâu. iPhone của bạn biết chính xác bạn đã ở trong từng app bao lâu (nó nằm ngay trong Cài đặt), nhưng bộ chọn lại không hiển thị.
Việc này không tốn chút quyền riêng tư nào. Bộ chọn do iOS vẽ trong tiến trình riêng của nó. App không bao giờ thấy bên trong có gì, chỉ nhận được các token mờ (opaque) cho những gì bạn đã chọn. HonorFit đúng nghĩa đen là không biết bạn đã chọn những app nào. Nên iOS hoàn toàn có thể hiện thời gian sử dụng ngay trong bộ chọn, mà app vẫn không biết thêm được gì. Apple vốn đã làm điều tương tự với các extension DeviceActivityReport, vốn hiển thị mức sử dụng của bạn bên trong một sandbox mà app không đọc được.
- Một tùy chọn cho bộ chọn để chọn cả danh mục hay chỉ từng app, để một app chặn ứng dụng có thể đưa ra danh sách chỉ gồm app, không lỡ tay chọn nhầm danh mục (và ẩn luôn trang web nếu app không dùng tới).
- Một tùy chọn để sắp xếp theo, và hiển thị, thời gian sử dụng màn hình đo được bên cạnh từng app, do iOS hiển thị để app không bao giờ thấy các con số.
3. Bạn không xem được đồng hồ đếm ngược chính xác cho thời gian còn lại
Trong HonorFit, thời gian bạn kiếm được chỉ bị trừ khi bạn thật sự đang ở trong một app bị chặn. Nên thứ hiển nhiên cần hiện là một đồng hồ đếm ngược: “còn 12:34”, chạy lùi khi bạn lướt và dừng khi bạn rời app.
Trên Android thì dễ. Dịch vụ chạy nền của HonorFit kiểm tra app nào đang trên màn hình mỗi giây, và thông báo dùng bộ đếm ngược có sẵn của Android, nên ngăn thông báo tự vẽ lại nó mỗi giây. Bạn kéo ngăn thông báo xuống là thấy chính xác mình còn bao nhiêu thời gian, đến từng giây.
Trên iPhone thì không thể, và lý do là:
- iOS không bao giờ báo cho app biết khi bạn mở hay rời một app bị chặn. Tất cả những gì bạn nhận được là các sự kiện kiểu “mức sử dụng đã cộng dồn tới chừng này”. HonorFit đặt một sự kiện cho mỗi 15 giây sử dụng, và chúng được gửi tới một extension chạy nền để cập nhật thông báo.
- Một thông báo thông thường không tự đếm ngược được, nên điều tốt nhất HonorFit làm được là thay chữ mới mỗi khi có sự kiện tới. Đó là lý do thông báo trên iPhone ghi “còn ~12:30” với dấu ngã: nó nhảy theo từng bước 15 giây.
- Các sự kiện đó cũng không phải lúc nào cũng đến đúng giờ. Trên iOS 26, mình từng thấy chúng đến trễ, hoặc đến dồn mấy cái một lúc.
- Live Activities có thể tự đếm ngược, nhưng không tạm dừng được. Không có gì báo cho app biết bạn đã rời Instagram, nên một Live Activity sẽ cứ chạy tiếp trong khi điện thoại nằm trên bàn, và như vậy là sai.
Thế nên người dùng iPhone chỉ có con số ước lượng, còn người dùng Android có con số thật.
DeviceActivity điều khiển một đồng hồ đếm ngược do chính iOS hiển thị: trong thông báo, trong Live Activity hoặc trên shield, và chỉ chạy khi các app đang được theo dõi ở trên màn hình. iOS vốn đã theo dõi mức sử dụng đó đến từng giây, nên nó có thể hiện thời gian mà không phải giao thêm cho app bất cứ thứ gì. Chỉ cần những callback đơn giản kiểu “app bị chặn đã mở / đã đóng” gửi tới monitor extension thôi cũng đã giải quyết được phần lớn vấn đề.Vậy thôi
Công bằng mà nói, mô hình quyền riêng tư của Apple ở đây thật sự rất tốt. App không bao giờ biết bạn đã chặn gì hay bạn dùng nó bao nhiêu, và mình rất không muốn điều đó thay đổi. Không điều nào trong ba điều trên làm thay đổi nó cả. Chúng chỉ giúp app trên iPhone hữu ích được như các bản Android vốn đã làm được.
Nếu bạn cũng làm app với Screen Time API và muốn có những điều này, hãy gửi yêu cầu qua Feedback Assistant. Theo mình hiểu, càng nhiều báo cáo trùng nhau thì vấn đề càng dễ được chú ý. Còn nếu bạn chỉ muốn thử app, HonorFit miễn phí trên iPhone và Android. Biết đâu vài bạn sẽ thích nó!