3 điều mình mong Apple sửa trong Screen Time API

Những gì mình gặp phải khi làm cùng một app chặn ứng dụng cho iPhone và Android. Bài của Thomas Willheim · 30 tháng 9, 2026

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.

Cảnh báo của HonorFit trên iPhone: một ứng dụng khác đang dùng Thời gian sử dụng. iOS chỉ cho phép một ứng dụng điều khiển Thời gian sử dụng tại một thời điểm, kèm các bước tắt ứng dụng kia trong Cài đặt
Người dùng iPhone thấy màn hình này trong HonorFit khi một app khác đã có quyền truy cập Thời gian sử dụng. Bản thân iOS chỉ đưa cho app một mã lỗi, nên phần giải thích này là của bọn mình.

Đ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.

Điều mình muốn xin: cho phép nhiều hơn một app giữ quyền Thời gian sử dụng cá nhân, đúng như WWDC22 đã mô tả, và gộp các shield của chúng theo cùng quy tắc “hạn chế nhất thắng”. Nếu giới hạn này có lý do thật sự, hãy ghi nó vào tài liệu và đưa cho app một mã lỗi đàng hoàng để app giải thích được cho người dùng.

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.

Bộ chọn ứng dụng Thời gian sử dụng của iOS: danh sách các danh mục ứng dụng, với danh mục Sức khỏe & Thể hình được mở ra để hiện các app bên trong
iPhone: bộ chọn của Apple. Danh mục trước tiên, không có số liệu sử dụng, app nào cũng giống app nào.
Bộ chọn ứng dụng của HonorFit trên Android: các app kèm thời gian đã dùng trong 24 giờ qua, app dùng nhiều nhất ở trên cùng
Android: danh sách riêng của HonorFit, sắp xếp theo thời gian sử dụng, nên những app tệ nhất nằm ngay trên cùng.

Có hai điều ở bộ chọn của iOS làm mình khó chịu:

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.

Điều mình muốn xin:
  1. 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).
  2. 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à:

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.

Điều mình muốn xin: cho một sự kiện 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ó!

Đọc tiếp