Today Widget é uma extensão do iOS que exibe informações interativas diretamente na Central de Notificações ou na tela “Hoje”. O usuário vê dados atualizados — clima, taxas de câmbio, calendário — sem abrir o aplicativo principal. De acordo com a Apple WWDC (2025), o uso do WidgetKit cresceu 40% após a introdução de widgets interativos no iOS 17. Today Widget resolve o problema de acesso rápido à informação: um olhar na tela — e o usuário obtém os dados necessários sem navegar pelo aplicativo.
Principais pontos
Today Widget (também conhecido como widget da Central de Notificações) é um elemento de interface do iOS que exibe informações resumidas de um aplicativo sem abri-lo. O usuário vê o widget deslizando para a esquerda na tela de bloqueio ou na tela inicial. O widget pode mostrar dados dinâmicos — taxas de câmbio, últimas notícias, status de tarefas, estado do dispositivo.
Historicamente, o Today Widget apareceu no iOS 8 como uma extensão da Central de Notificações implementada através do framework Central de Notificações. Com o iOS 14, a Apple apresentou o WidgetKit — uma arquitetura completamente redesenhada que permite colocar widgets diretamente na tela inicial. O Today Widget no sentido moderno é um widget WidgetKit localizado na seção “Hoje” (a seção de widgets à esquerda da primeira tela).
O objetivo principal é reduzir o tempo de acesso à informação. Em vez de abrir o aplicativo, navegar pelos menus e esperar o carregamento, o usuário vê imediatamente os dados necessários. De acordo com a Apple (2024), aplicativos com widgets mostram 27% mais engajamento dos usuários. Casos de uso adicionais: ações rápidas (marcar uma tarefa como concluída), monitoramento (frequência cardíaca, atividade) e status (carga da bateria, notificações).
Um desenvolvedor de Today Widget tem duas abordagens disponíveis: WidgetKit moderno (iOS 14+) e a extensão legada NCWidgetProviding (iOS 8–13). A escolha depende da versão mínima suportada do iOS. WidgetKit é recomendado para novos projetos, NCWidgetProviding para suportar dispositivos antigos.
| Característica | WidgetKit | NCWidgetProviding |
|---|---|---|
| iOS mínimo | iOS 14 | iOS 8 |
| Localização | Tela inicial + “Hoje” | Apenas “Hoje” |
| Tamanhos | Pequeno, Médio, Grande | Um tamanho fixo |
| Interatividade | Botões e interruptores iOS 17+ | Apenas abrir aplicativo |
| Atualização | Timeline Provider | widgetPerformUpdate |
| Linguagem | SwiftUI | UIKit |
Se seu aplicativo suporta iOS 14 e versões posteriores — use WidgetKit. Ele fornece capacidades enriquecidas: múltiplos tamanhos, configuração através de intents, redesign com iOS 17 e links profundos. A declaratividade do SwiftUI torna o código do widget compacto e legível. O Timeline Provider gerencia automaticamente o cronograma de atualizações considerando o consumo de energia.
Apenas se o suporte a iOS 9–13 for necessário. NCWidgetProviding é mais simples de implementar — é um UIViewController normal com um protocolo. No entanto, é limitado: um único tamanho, apenas UIKit, sem configuração. A Apple recomenda migrar para WidgetKit mesmo em projetos antigos usando availability check: WidgetKit no iOS 14+, NCWidgetProviding como fallback.
No iOS moderno, existem três tipos de widgets de acordo com a finalidade funcional. Cada tipo resolve seu próprio problema e requer uma abordagem diferente para o design de dados e interface. A classificação ajuda a escolher a arquitetura correta para seu aplicativo.
Exibem informações estáticas ou atualizadas periodicamente: clima, data, taxas de câmbio, status do servidor. Os dados são atualizados conforme uma programação através do Timeline Provider. O usuário não interage com o widget — apenas lê. Widgets informativos são os mais simples de implementar, não requerem manipulação de eventos de toque e funcionam em segundo plano sem permissões adicionais.
Com o iOS 17, o WidgetKit suporta botões, interruptores e controles deslizantes nos widgets. O usuário pode realizar uma ação — marcar uma tarefa, pausar música, acender uma luz — sem abrir o aplicativo. Widgets interativos usam App Intents para passar ações para o aplicativo principal. Limitação: apenas na tela inicial, não na seção “Hoje” até o iOS 18.
O usuário personaliza os dados exibidos através da interface do sistema — seleciona uma cidade para o clima, uma conta para finanças, uma categoria para notícias. Implementado através de Intents Extension e configuração no WidgetBundle. Widgets configuráveis aumentam a personalização e relevância das informações para cada usuário.
Vamos ver o processo de criação de um Today Widget em SwiftUI usando WidgetKit. O widget exibirá a taxa de câmbio atual com atualizações automáticas. WidgetKit requer três componentes: uma estrutura de widget, um Provider com configuração e uma View para exibição.
import WidgetKit
import SwiftUI
@main
struct CurrencyWidget: Widget {
let kind: String = "CurrencyWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
CurrencyWidgetEntryView(entry: entry)
}
.configurationDisplayName("Currency Rate")
.description("Current USD/RUB exchange rate")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
O Provider é responsável por preparar os dados para exibição. O método getTimeline cria um cronograma de atualização: a próxima atualização em 15 minutos. TimelineProvider garante que o widget mostre dados atualizados sem consultar constantemente o servidor.
struct Provider: TimelineProvider {
func getSnapshot(in context: Context,
completion: @escaping (CurrencyEntry) -> Void) {
let entry = CurrencyEntry(date: Date(), rate: 92.5)
completion(entry)
}
func getTimeline(in context: Context,
completion: @escaping (Timeline<CurrencyEntry>) -> Void) {
let rate = CurrencyService().fetchRate()
let entry = CurrencyEntry(date: Date(), rate: rate)
let nextUpdate = Calendar.current.date(
byAdding: .minute, value: 15, to: Date()
) ?? Date()
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
Timeline Provider é o mecanismo central do WidgetKit para gerenciar dados do Today Widget. Em vez de atualizações periódicas por temporizador (como no antigo NCWidgetProviding), o WidgetKit usa o conceito de timeline — uma sequência de entradas com carimbos de data/hora. O sistema exibe a entrada atual até que expire, depois alterna para a próxima ou solicita uma nova.
Timeline suporta três políticas: .after(date) — próxima atualização na data especificada; .never — o widget não atualiza até uma chamada explícita a WidgetCenter.reloadAllTimelines; .atEnd — atualização após exibir a última entrada. Para um Today Widget com taxa de câmbio, a política .after com intervalo de 15–30 minutos é ideal. A eficiência energética é uma vantagem chave do WidgetKit: o sistema agrupa as atualizações de todos os widgets em uma janela.
Se os dados mudarem antes da expiração do timeline (por exemplo, o usuário atualizou a taxa no aplicativo), chame WidgetCenter.shared.reloadTimelines(ofKind: “CurrencyWidget”). Isso solicitará um novo timeline do Provider e atualizará a exibição. WidgetCenter também permite recarregar todos os widgets do aplicativo com um único comando — conveniente após a sincronização de dados.
A Apple impõe requisitos rigorosos para o design do Today Widget: o conteúdo deve ser legível rapidamente, sem elementos desnecessários e com uma hierarquia clara. Violar as recomendações da HIG (Human Interface Guidelines) é motivo de rejeição ao publicar na App Store. Três princípios: legibilidade rápida, consistência e hierarquia.
O usuário gasta menos de um segundo em um widget. Não adicione mais de 3–4 elementos de dados. Fonte — mínimo 11pt para rótulos, 17pt para valores. Use negrito (Semibold) para números-chave. Evite rolagem — Today Widget não rola.
WidgetKit suporta três tamanhos: Pequeno (170×170pt), Médio (364×170pt), Grande (364×382pt). Para Today Widget na seção “Hoje”, Médio é a escolha mais comum. Design adaptável através de EnvironmentValues: altere a densidade de informação dependendo do tamanho. Pequeno — um número, Médio — número + gráfico, Grande — tabela.
O widget deve exibir corretamente nos temas claro e escuro sem ações adicionais do desenvolvedor — WidgetKit capta automaticamente as cores do sistema. Dynamic Type para widgets é limitado: o tamanho da fonte é fixo, mas deve ser legível. UIColor.label e UIColor.systemBackground são as cores base para texto e fundo em ambos os temas.
Perguntas frequentes
Hoje é o mesmo widget WidgetKit. A diferença é apenas na localização: na tela inicial e na seção “Hoje” (à esquerda da primeira tela). Antes do iOS 14, o Today Widget era uma extensão separada do NCWidgetProviding que funcionava apenas na Central de Notificações. Agora é um único WidgetKit.
WidgetKit não atualiza widgets por temporizador. O desenvolvedor define o cronograma através do Timeline Provider: entradas com carimbos de data/hora. O sistema garante a atualização no horário especificado considerando economia de energia — pode atrasar alguns minutos. O intervalo mínimo é de 15 minutos, mas a Apple recomenda no máximo uma vez por hora.
Sim, a partir do iOS 17, o WidgetKit suporta botões, interruptores e controles deslizantes através de App Intents. Elementos interativos funcionam na tela inicial do iPhone e iPad. O suporte na seção “Hoje” apareceu no iOS 18. Para iOS 16 e versões anteriores — apenas abrir o aplicativo ao tocar no widget.
Não há limites. Um aplicativo pode registrar qualquer número de widgets através do WidgetBundle — cada um com seu próprio tipo, tamanho e configuração. O usuário os adiciona individualmente. Recomenda-se no máximo 3–5 widgets para não sobrecarregar a escolha do usuário.
WidgetKit é totalmente suportado no iOS Simulator. Execute o esquema do target WidgetKit no Xcode — o widget aparecerá na tela inicial do simulador. Para testar o Timeline Provider, use WidgetKit Debug Profile: Xcode → Product → Profile → WidgetKit Debug. Verifique o comportamento real em um dispositivo físico.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também