Uso do SyncState
June 11, 2026 · View on GitHub
SyncState é um componente da biblioteca AppState que permite sincronizar o estado da aplicação em vários dispositivos usando o iCloud. Isso é especialmente útil para manter as preferências do usuário, configurações ou outros dados importantes consistentes em todos os dispositivos.
Visão Geral
SyncState aproveita o NSUbiquitousKeyValueStore do iCloud para manter pequenas quantidades de dados sincronizadas em todos os dispositivos. Isso o torna ideal para sincronizar o estado leve da aplicação, como preferências ou configurações do usuário.
Principais Características
- Sincronização com o iCloud: Sincroniza automaticamente o estado em todos os dispositivos conectados à mesma conta do iCloud.
- Armazenamento Persistente: Os dados são armazenados de forma persistente no iCloud, o que significa que eles persistirão mesmo que o aplicativo seja encerrado ou reiniciado.
- Sincronização Quase em Tempo Real: As alterações no estado são propagadas para outros dispositivos quase instantaneamente.
Nota:
SyncStateé suportado no watchOS 9.0 e posterior.
Exemplo de Uso
Modelo de Dados
Suponha que temos uma estrutura chamada Settings que se conforma com Codable:
struct Settings: Codable {
var text: String
var isShowingSheet: Bool
var isDarkMode: Bool
}
Definindo um SyncState
Você pode definir um SyncState estendendo o objeto Application e declarando as propriedades de estado que devem ser sincronizadas:
extension Application {
var settings: SyncState<Settings> {
syncState(
initial: Settings(
text: "Hello, World!",
isShowingSheet: false,
isDarkMode: false
),
id: "settings"
)
}
}
Lidando com Alterações Externas
Para garantir que o aplicativo responda a alterações externas do iCloud, substitua a função didChangeExternally criando uma subclasse personalizada de Application:
class CustomApplication: Application {
override func didChangeExternally(notification: Notification) {
super.didChangeExternally(notification: notification)
DispatchQueue.main.async {
self.notifyChange()
}
}
}
Criando Visualizações para Modificar e Sincronizar o Estado
No exemplo a seguir, temos duas visualizações: ContentView e ContentViewInnerView. Essas visualizações compartilham e sincronizam o estado de Settings entre elas. ContentView permite que o usuário modifique o text e alterne isDarkMode, enquanto ContentViewInnerView exibe o mesmo texto e o atualiza quando tocado.
struct ContentView: View {
@SyncState(\.settings) private var settings: Settings
var body: some View {
VStack {
TextField("", text: $settings.text)
Button(settings.isDarkMode ? "Light" : "Dark") {
settings.isDarkMode.toggle()
}
Button("Show") { settings.isShowingSheet = true }
}
.preferredColorScheme(settings.isDarkMode ? .dark : .light)
.sheet(isPresented: $settings.isShowingSheet, content: ContentViewInnerView.init)
}
}
struct ContentViewInnerView: View {
@Slice(\.settings, \.text) private var text: String
var body: some View {
Text("\(text)")
.onTapGesture {
text = Date().formatted()
}
}
}
Configurando o Aplicativo
Finalmente, configure o aplicativo na estrutura @main. Na inicialização, promova o aplicativo personalizado, habilite o registro e carregue a dependência do armazenamento do iCloud para sincronização:
@main
struct SyncStateExampleApp: App {
init() {
Application
.promote(to: CustomApplication.self)
.logging(isEnabled: true)
.load(dependency: \.icloudStore)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Habilitando o Armazenamento de Chave-Valor do iCloud
Para habilitar a sincronização do iCloud, certifique-se de seguir este guia para habilitar a capacidade de Armazenamento de Chave-Valor do iCloud: Começando a usar o SyncState.
SyncState: Notas sobre o Armazenamento do iCloud
Embora o SyncState permita uma sincronização fácil, é importante lembrar as limitações do NSUbiquitousKeyValueStore:
- Limite de Armazenamento: Você pode armazenar até 1 MB de dados no iCloud usando o
NSUbiquitousKeyValueStore, com um limite de tamanho de valor por chave de 1 MB.
Considerações sobre Migração
Ao atualizar seu modelo de dados, é importante levar em conta os possíveis desafios de migração, especialmente ao trabalhar com dados persistentes usando StoredState, FileState ou SyncState. Sem o tratamento adequado da migração, alterações como adicionar novos campos ou modificar formatos de dados podem causar problemas ao carregar dados mais antigos.
Aqui estão alguns pontos-chave a serem lembrados:
- Adicionando Novos Campos Não Opcionais: Certifique-se de que os novos campos sejam opcionais ou tenham valores padrão para manter a compatibilidade com versões anteriores.
- Lidando com Alterações no Formato de Dados: Se a estrutura do seu modelo mudar, implemente uma lógica de decodificação personalizada para suportar formatos antigos.
- Versionando Seus Modelos: Use um campo
versionem seus modelos para ajudar nas migrações e aplicar a lógica com base na versão dos dados.
Para saber mais sobre como gerenciar migrações e evitar possíveis problemas, consulte o Guia de Considerações sobre Migração.
Guia de Implementação do SyncState
Para obter instruções detalhadas sobre como configurar o iCloud e o SyncState em seu projeto, consulte o Guia de Implementação do SyncState.
Melhores Práticas
- Use para Dados Pequenos e Críticos:
SyncStateé ideal para sincronizar pequenas e importantes peças de estado, como preferências do usuário, configurações ou sinalizadores de recursos. - Monitore o Armazenamento do iCloud: Certifique-se de que seu uso do
SyncStatepermaneça dentro dos limites de armazenamento do iCloud para evitar problemas de sincronização de dados. - Lide com Atualizações Externas: Se seu aplicativo precisar responder a alterações de estado iniciadas em outro dispositivo, substitua a função
didChangeExternallypara atualizar o estado do aplicativo em tempo real.
Conclusão
SyncState fornece uma maneira poderosa de sincronizar pequenas quantidades de estado da aplicação em todos os dispositivos via iCloud. É ideal para garantir que as preferências do usuário e outros dados importantes permaneçam consistentes em todos os dispositivos conectados à mesma conta do iCloud. Para casos de uso mais avançados, explore outras funcionalidades do AppState, como SecureState e FileState.
Esta tradução foi gerada automaticamente e pode conter erros. Se você é um falante nativo, agradecemos suas contribuições com correções por meio de um Pull Request.