Bloquear apps de redes sociais toda noite no iPhone com DeviceActivity (2026)
O minulo é um app para iPhone que, na hora de dormir, bloqueia automaticamente toda noite os apps oficiais do Instagram, do YouTube, do TikTok e de outras redes, e mantém os Reels e os Shorts ocultos sem perder as DMs. Ocultar Reels e Shorts é grátis, o bloqueio dos apps oficiais é grátis por até 2 horas de cada vez, e o Modo sono, que começa sozinho toda noite no horário escolhido, é do minulo Pro. Neste artigo eu mostro como fiz esse "bloquear toda noite" com a API do Tempo de Uso (DeviceActivity e ManagedSettings) e onde tropecei. (Este artigo foi escrito pelo desenvolvedor do minulo.)
Confira o comportamento exato da API na documentação da Apple para desenvolvedores. O que está aqui é a estrutura que uso de verdade no minulo e o que aconteceu em aparelhos reais. A base da extensão é o react-native-device-activity, do Robert Herber.
A estrutura
- O app principal (React Native) monta um DeviceActivitySchedule com a hora de dormir e a hora de acordar e começa o monitoramento com o DeviceActivityCenter.
- Na hora marcada, o sistema chama a extensão DeviceActivityMonitor com `intervalDidStart`. A extensão aplica um escudo (a tela de bloqueio) com o ManagedSettings.
- Na hora de acordar, `intervalDidEnd` é chamado e a extensão tira o escudo.
- A extensão é chamada pelo sistema mesmo com o app fechado.
A extensão não decide nada sozinha. O app principal grava no UserDefaults do App Group as ações de cada sinal, com a chave `actions_for_<nome do monitoramento>_<sinal>`, e a extensão só lê e executa. A extensão tem pouca memória e roda por pouco tempo em cada sinal, então a lógica pesada fica fora dela.
Desligar só esta noite
Se o botão "Desligar só esta noite" parasse o monitoramento, os horários das próximas noites também sumiriam. Por isso o monitoramento continua, e o app só grava uma marca dizendo "esta vez deste horário já foi encerrada".
- O app grava no App Group um JSON com o id do horário e o momento em que essa vez termina.
- A cada `intervalDidStart`, a extensão lê essa marca e, se for uma vez encerrada, não faz nada.
- Marcas vencidas são descartadas na leitura.
Tropeço 1: registrar de novo no meio do horário chama o "início" na hora
Quando o monitoramento é registrado de novo no meio do horário (ao editar o horário, por exemplo), o sistema chama `intervalDidStart` na mesma hora. No minulo, numa noite em que o bloqueio tinha sido liberado pela saída de emergência, o monitoramento foi registrado de novo, o sistema chamou o início e tudo voltou a ser bloqueado.
A correção foi olhar a mesma marca de "Desligar só esta noite" também nesse `intervalDidStart` do novo registro.
Tropeço 2: o fim de um monitoramento tira o escudo de outro
Os escudos do ManagedSettings não ficam em caixas separadas por monitoramento. Se o `intervalDidEnd` da noite tira o escudo, pode tirar também um escudo colocado por outro motivo no mesmo horário (um bloqueio manual de 2 horas, por exemplo).
Então, junto com o fim, registrei uma ação de "colocar de novo se alguém ainda precisa", com a informação de para quem é (o id do horário ou o momento em que o bloqueio manual termina). Se todos já terminaram, a extensão não coloca de novo.
Tropeço 3: o horário segue o relógio da região
O DeviceActivitySchedule segue o relógio da região do aparelho. Numa viagem, a marca gravada pelo app e a hora que a extensão vê podem não bater. No minulo, a marca guarda o nome do fuso horário; se o nome for diferente, a extensão não faz nada e o app corrige quando for aberto. Comparo pelo nome do fuso, e não pela diferença com o UTC, porque no dia da mudança do horário de verão a diferença enganou a extensão.
O que não dá para fazer
- Enquanto o app oficial está bloqueado, as notificações dele não chegam. O escudo é do iOS, e o app não muda isso.
- O escudo bloqueia o app oficial inteiro, então dentro dele não dá para "bloquear só os Reels e manter as DMs". No minulo, as DMs ficam na versão web aberta dentro do minulo.
Resumo
- O bloqueio automático toda noite sai com o monitoramento do DeviceActivity e uma "tabela de ações" que a extensão lê.
- "Desligar só esta noite" se faz com uma marca da vez encerrada, sem parar o monitoramento.
- O `intervalDidStart` do novo registro, o escudo compartilhado e o relógio da região aparecem em aparelho real.
Os ajustes da noite como um todo (Repouso, Tempo de Uso e as diferenças) estão nesta página:



