Aula 179: Flags de Funcionalidades e Configuração Remota
Flags de funcionalidades (também conhecidas como toggles de funcionalidades) e configuração remota são técnicas poderosas usadas no desenvolvimento de software para controlar a funcionalidade de um aplicativo sem a necessidade de implementar uma nova versão. Esta aula abordará como podemos implementar flags de funcionalidades e configuração remota em um aplicativo Swift.
O que são Flags de Funcionalidades?
Flags de funcionalidades permitem que os desenvolvedores ativem ou desativem recursos específicos em um aplicativo em tempo de execução. Isso é particularmente útil para:
- Testar novas funcionalidades (A/B testing)
- Implementar funcionalidades gradativamente (lançamentos canários)
- Permitir um rollback fácil quando surgem problemas
O que é Configuração Remota?
Configuração remota é um serviço que permite que os desenvolvedores modifiquem o comportamento e a aparência de um aplicativo a partir de um servidor remoto. Ao aproveitar a configuração remota, os desenvolvedores podem atualizar dinamicamente as flags de funcionalidades e outras configurações sem exigir que os usuários atualizem seus aplicativos.
Implementando Flags de Funcionalidades em Swift
Para implementar flags de funcionalidades em um aplicativo Swift, você pode usar uma enumeração ou uma flag booleana. Para esta aula, usaremos uma enum simples para gerenciar as flags de funcionalidades.
Passo 1: Definir Flags de Funcionalidades
Vamos criar uma enum para representar diferentes flags de funcionalidades.
enum FlagDeFuncionalidade {
case novaFuncionalidade
case funcionalidadeExperimental
}
Passo 2: Usar Flags de Funcionalidades
Em seguida, usaremos essas flags de funcionalidades para controlar o fluxo do nosso aplicativo.
class GerenciadorDeFuncionalidades {
static let compartilhado = GerenciadorDeFuncionalidades()
private init() {}
func isFeatureEnabled(_ feature: FlagDeFuncionalidade) -> Bool {
switch feature {
case .novaFuncionalidade:
return UserDefaults.standard.bool(forKey: "isNovaFuncionalidadeEnabled")
case .funcionalidadeExperimental:
return UserDefaults.standard.bool(forKey: "isFuncionalidadeExperimentalEnabled")
}
}
}
Passo 3: Alternar Flags de Funcionalidades
Você pode alternar as flags de funcionalidades de qualquer lugar do seu aplicativo. Veja como você pode habilitá-las ou desabilitá-las:
func toggleFeature(_ feature: FlagDeFuncionalidade, isEnabled: Bool) {
switch feature {
case .novaFuncionalidade:
UserDefaults.standard.set(isEnabled, forKey: "isNovaFuncionalidadeEnabled")
case .funcionalidadeExperimental:
UserDefaults.standard.set(isEnabled, forKey: "isFuncionalidadeExperimentalEnabled")
}
}
Passo 4: Exemplo de Uso de Funcionalidades
Agora, vamos ver como podemos verificar se a funcionalidade está ativada no código do nosso aplicativo.
func usarFuncionalidades() {
if GerenciadorDeFuncionalidades.compartilhado.isFeatureEnabled(.novaFuncionalidade) {
print("Nova funcionalidade está ativada!")
// Executar código para a nova funcionalidade
} else {
print("Nova funcionalidade está desativada.")
}
if GerenciadorDeFuncionalidades.compartilhado.isFeatureEnabled(.funcionalidadeExperimental) {
print("Funcionalidade experimental está ativada!")
// Executar código para a funcionalidade experimental
} else {
print("Funcionalidade experimental está desativada.")
}
}
Integração com Configuração Remota
Para configuração remota, podemos usar o Firebase Remote Config por simplicidade. Abaixo estão os passos básicos para integrar o Firebase Remote Config em nosso sistema de flags de funcionalidades.
Passo 1: Instalar o Firebase
Integre o Firebase ao seu projeto. Você pode usar o CocoaPods ou o Swift Package Manager para isso. Certifique-se de incluir o Remote Config em suas dependências.
Passo 2: Configurar o Remote Config
Inicialize o Firebase e configure o Remote Config:
import Firebase
class GerenciadorDeConfigRemota {
static let compartilhado = GerenciadorDeConfigRemota()
private let remoteConfig = RemoteConfig.remoteConfig()
private init() {
remoteConfig.setDefaults([
"isNovaFuncionalidadeEnabled": false as NSObject,
"isFuncionalidadeExperimentalEnabled": false as NSObject
])
buscarConfigRemota()
}
private func buscarConfigRemota() {
remoteConfig.fetch { (status, error) in
if status == .success {
print("Configuração buscada!")
self.remoteConfig.activate { _, _ in
// Aplicar alterações
}
} else {
print("Erro ao buscar configuração: \(error?.localizedDescription ?? "Nenhum erro disponível.")")
}
}
}
func isFeatureEnabled(_ feature: FlagDeFuncionalidade) -> Bool {
switch feature {
case .novaFuncionalidade:
return remoteConfig["isNovaFuncionalidadeEnabled"].boolValue
case .funcionalidadeExperimental:
return remoteConfig["isFuncionalidadeExperimentalEnabled"].boolValue
}
}
}
Passo 3: Atualizar o Uso das Funcionalidades
Agora, em vez de usar GerenciadorDeFuncionalidades.compartilhado
, chame GerenciadorDeConfigRemota.compartilhado
para verificar se a funcionalidade está ativada.
func usarFuncionalidades() {
if GerenciadorDeConfigRemota.compartilhado.isFeatureEnabled(.novaFuncionalidade) {
print("Nova funcionalidade está ativada pelo Configurador Remoto!")
// Executar código para a nova funcionalidade
} else {
print("Nova funcionalidade está desativada pelo Configurador Remoto.")
}
if GerenciadorDeConfigRemota.compartilhado.isFeatureEnabled(.funcionalidadeExperimental) {
print("Funcionalidade experimental está ativada pelo Configurador Remoto!")
// Executar código para a funcionalidade experimental
} else {
print("Funcionalidade experimental está desativada pelo Configurador Remoto.")
}
}
Conclusão
Flags de funcionalidades e configuração remota são ferramentas essenciais para o desenvolvimento ágil. Elas permitem que você controle dinamicamente as funcionalidades do seu aplicativo e melhore a experiência do usuário por meio de lançamentos mais inteligentes e A/B testing. Usando os padrões mostrados acima, você pode facilmente integrar flags de funcionalidades e implementar configuração remota em seus aplicativos Swift.