Use Firebase Remote Config para definir parâmetros no app e atualizar os respectivos valores na nuvem. Assim, você modifica a aparência e o comportamento do app sem precisar distribuir uma atualização. Este guia traz as noções básicas e os exemplos de código, que estão disponíveis para clonagem ou download no repositório do GitHub firebase/quickstart-ios.
Etapa 1: adicionar Remote Config ao app
Adicione o Firebase ao seu projeto da Apple caso ainda não tenha feito isso.
Em Remote Config, Google Analytics é necessário para a segmentação condicional de instâncias de app para propriedades de usuário e públicos. Ative Google Analytics no projeto.
Crie o objeto singleton de Remote Config, conforme mostrado neste exemplo:
Swift
remoteConfig = RemoteConfig.remoteConfig() let settings = RemoteConfigSettings() settings.minimumFetchInterval = 0 remoteConfig.configSettings = settings
Objective-C
self.remoteConfig = [FIRRemoteConfig remoteConfig]; FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init]; remoteConfigSettings.minimumFetchInterval = 0; self.remoteConfig.configSettings = remoteConfigSettings;
Esse objeto é usado para armazenar valores de parâmetro padrão no app, buscar valores de parâmetro atualizados no back-end de Remote Config e controlar quando eles são disponibilizados ao app.
Durante o desenvolvimento, recomendamos definir um intervalo de busca mínimo relativamente baixo. Para mais informações, consulte Limitação.
Etapa 2: definir valores de parâmetros padrão no app
É possível definir os valores de parâmetro padrão no app com Remote Config. Assim, o app se comporta de maneira previsível antes de se conectar ao back-end de Remote Config e os valores padrão ficam disponíveis, caso nenhum tenha sido definido no back-end.
Defina um conjunto de nomes e valores de parâmetros padrão usando um objeto
NSDictionary
ou um arquivo plist (links em inglês).Depois de configurar os valores de parâmetro do back-end de Remote Config, é possível fazer o download de um arquivo
plist
gerado com todos os valores padrão e salvar esse arquivo no projeto do Xcode.REST
curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=PLIST -o RemoteConfigDefaults.plist
Console do Firebase
Na guia Parâmetros, abra o Menu e selecione Fazer o download dos valores padrão.
Quando solicitado, ative a opção .plist para iOS, e clique em Fazer o download do arquivo.
Adicione esses valores ao objeto de Remote Config usando
setDefaults:
. O exemplo a seguir define valores padrão no aplicativo de um arquivo plist:Swift
remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
Objective-C
[self.remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];
Etapa 3: receber valores de parâmetros para uso no app
Agora você pode receber valores de parâmetro do objeto de Remote Config. Se você definir
valores no back-end de Remote Config, buscá-los e ativá-los,
eles vão estar disponíveis para o app. Caso
contrário, você vai receber os valores de parâmetro configurados no app
com setDefaults:
.
Para receber esses valores, chame o método
configValueForKey:
fornecendo a chave de parâmetro como argumento.
let remoteConfig = RemoteConfig.remoteConfig()
// Retrieve a parameter value using configValueForKey
let welcomeMessageValue = remoteConfig.configValue(forKey: "welcome_message")
let welcomeMessage = welcomeMessageValue.stringValue
let featureFlagValue = remoteConfig.configValue(forKey: "new_feature_flag")
let isFeatureEnabled = featureFlagValue.boolValue
Uma maneira mais legível e conveniente de acessar esses valores no Swift é usando a notação de índice:
let remoteConfig = RemoteConfig.remoteConfig()
// Retrieve a string parameter value
let welcomeMessage = remoteConfig["welcome_message"].stringValue
// Retrieve a boolean parameter value
let isFeatureEnabled = remoteConfig["new_feature_flag"].boolValue
// Retrieve a number parameter value
let maxItemCount = remoteConfig["max_items"].numberValue.intValue
Usar o Codable para configuração segura de tipos
Para configurações mais complexas, use o protocolo Codable
do Swift para
decodificar dados estruturados de Remote Config. Isso oferece gerenciamento de configuração
seguro para tipos e simplifica o trabalho com objetos complexos.
// Define a Codable struct for your configuration
struct AppFeatureConfig: Codable {
let isNewFeatureEnabled: Bool
let maxUploadSize: Int
let themeColors: [String: String]
}
// Fetch and decode the configuration
func configureAppFeatures() {
let remoteConfig = RemoteConfig.remoteConfig()
remoteConfig.fetchAndActivate { status, error in
guard error == nil else { return }
do {
let featureConfig = try remoteConfig["app_feature_config"].decoded(asType: AppFeatureConfig.self)
configureApp(with: featureConfig)
} catch {
// Handle decoding errors
print("Failed to decode configuration: \(error)")
}
}
}
Esse método permite:
- Definir estruturas de configuração complexas.
- Analisar automaticamente as configurações JSON.
- Garanta a segurança de tipos ao acessar valores Remote Config.
- Forneça um código limpo e legível para processar modelos Remote Config estruturados.
Usar wrappers de propriedade para configuração declarativa no SwiftUI
Os wrappers de propriedade são um recurso Swift poderoso que permite adicionar comportamento personalizado às declarações de propriedade. No SwiftUI, os wrappers de propriedade são usados para gerenciar estado, vinculações e outros comportamentos de propriedade. Para mais informações, consulte o Guia de linguagem Swift.
struct ContentView: View {
@RemoteConfigProperty(key: "cardColor", fallback: "#f05138")
var cardColor
var body: some View {
VStack {
Text("Dynamic Configuration")
.background(Color(hex: cardColor))
}
.onAppear {
RemoteConfig.remoteConfig().fetchAndActivate()
}
}
}
Use o wrapper de propriedade @RemoteConfigProperty
quando quiser uma maneira declarativa
de acessar valores Remote Config no SwiftUI, com suporte integrado para valores
padrão e gerenciamento de configuração simplificado.
Etapa 4: definir valores de parâmetros
Com o console de Firebase ou as APIs de back-end de Remote Config, é possível criar valores padrão do back-end que substituem os valores no app de acordo com a lógica condicional ou a segmentação de usuário pretendidas. Nesta seção, confira as etapas a serem seguidas no console de Firebase para criar esses valores.
- Abra o projeto no console de Firebase.
- Selecione Remote Config no menu para acessar o painel de Remote Config.
- Defina os parâmetros com os mesmos nomes dos definidos no seu app. Para cada um, é possível definir um valor padrão (que possivelmente substituirá o valor padrão no app) e também valores condicionais. Saiba mais em Parâmetros e condições de Remote Config.
Ao usar condições de indicador personalizado, defina os atributos e os valores deles. Os exemplos a seguir mostram como definir uma condição de indicador personalizado.
Swift
Task { let customSignals: [String: CustomSignalValue?] = [ "city": .string("Tokyo"), "preferred_event_category": .string("sports") ] do { try await remoteConfig.setCustomSignals(customSignals) print("Custom signals set successfully!") } catch { print("Error setting custom signals: \(error)") } }
Objective-C
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSDictionary *customSignals = @{ @"city": @"Tokyo", @"preferred_event_category": @"sports" }; [self.remoteConfig setCustomSignals:customSignals withCompletion:^(NSError * _Nullable error) { if (error) { NSLog(@"Error setting custom signals: %@", error); } else { NSLog(@"Custom signals set successfully!"); } }]; });
Etapa 5: buscar e ativar valores
Para buscar os valores de parâmetro de Remote Config, chame o
método
fetchWithCompletionHandler:
ou
fetchWithExpirationDuration:completionHandler:
. Todos os valores definidos no back-end são buscados e
armazenados em cache no objeto de Remote Config.
Para buscar e ativar valores com uma chamada, use
fetchAndActivateWithCompletionHandler:
.
Este exemplo busca valores no back-end de Remote Config (não valores em
cache) e chama activateWithCompletionHandler:
para disponibilizá-los
ao app:
Swift
remoteConfig.fetch { (status, error) -> Void in if status == .success { print("Config fetched!") self.remoteConfig.activate { changed, error in // ... } } else { print("Config not fetched") print("Error: \(error?.localizedDescription ?? "No error available.")") } self.displayWelcome() }
Objective-C
[self.remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) { if (status == FIRRemoteConfigFetchStatusSuccess) { NSLog(@"Config fetched!"); [self.remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) { if (error != nil) { NSLog(@"Activate error: %@", error.localizedDescription); } else { dispatch_async(dispatch_get_main_queue(), ^{ [self displayWelcome]; }); } }]; } else { NSLog(@"Config not fetched"); NSLog(@"Error %@", error.localizedDescription); } }];
Esses valores de parâmetro atualizados afetam o comportamento e a aparência do app. Por isso, ative-os sem prejudicar a experiência do usuário, como da próxima vez que ele abrir o app. Confira informações e exemplos em Estratégias de carregamento da Configuração remota.
Etapa 6: detectar atualizações em tempo real
Depois de buscar valores de parâmetros, é possível usar Remote Config em tempo real para detectar atualizações do back-end de Remote Config. Remote Config em tempo real sinaliza para dispositivos conectados quando atualizações estão disponíveis e busca as mudanças automaticamente depois que você publica uma nova versão de Remote Config.
O SDK de Firebase para plataformas Apple v10.7.0 e mais recente é compatível com atualizações em tempo real.
No seu app, chame
addOnConfigUpdateListener
para detectar atualizações e buscar novos valores de parâmetros automaticamente. O exemplo a seguir detecta atualizações e usa os valores recém-buscados quandoactivateWithCompletionHandler
é chamado para mostrar uma mensagem de boas-vindas atualizada.Swift
remoteConfig.addOnConfigUpdateListener { configUpdate, error in guard let configUpdate, error == nil else { print("Error listening for config updates: \(error)") } print("Updated keys: \(configUpdate.updatedKeys)") self.remoteConfig.activate { changed, error in guard error == nil else { return self.displayError(error) } DispatchQueue.main.async { self.displayWelcome() } } }
Objective-C
__weak __typeof__(self) weakSelf = self; [self.remoteConfig addOnConfigUpdateListener:^(FIRRemoteConfigUpdate * _Nonnull configUpdate, NSError * _Nullable error) { if (error != nil) { NSLog(@"Error listening for config updates %@", error.localizedDescription); } else { NSLog(@"Updated keys: %@", configUpdate.updatedKeys); __typeof__(self) strongSelf = weakSelf; [strongSelf.remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) { if (error != nil) { NSLog(@"Activate error %@", error.localizedDescription); } dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf displayWelcome]; }); }]; } }];
Na próxima vez que você publicar uma nova versão de Remote Config, os dispositivos que estão executando o app e detectando as mudanças vão chamar o gerenciador de conclusão.
Limitação
Se um aplicativo fizer muitas buscas em um curto período, as chamadas de busca serão limitadas, e o SDK retornará FIRRemoteConfigFetchStatusThrottled
. Antes da versão 6.3.0 do SDK, o
limite era de cinco solicitações de busca em um intervalo de 60 minutos.
As versões mais recentes têm limites mais flexíveis.
Durante o desenvolvimento de apps, sempre faça buscas para atualizar o cache
com mais frequência (muitas vezes por hora) para permitir a iteração rápida enquanto você desenvolve
e testa seu app. As atualizações da Configuração remota em tempo real ignoram automaticamente
o cache quando a configuração é atualizada no servidor. Caso queira acomodar a iteração rápida
em um projeto com vários desenvolvedores, é possível adicionar temporariamente uma propriedade
FIRRemoteConfigSettings
com um intervalo de busca mínimo baixo
(MinimumFetchInterval
) no app.
O intervalo de busca de produção padrão e recomendado para Remote Config é de 12 horas, o que significa que a busca pelas configurações no back-end não acontecerá mais de uma vez em um período de 12 horas, independentemente de quantas chamadas de busca forem realmente realizadas. O intervalo mínimo de busca é determinado especificamente na seguinte ordem:
- O parâmetro em
fetch(long)
- O parâmetro em
FIRRemoteConfigSettings.MinimumFetchInterval
- O valor padrão de 12 horas
Próximas etapas
Se ainda não tiver feito isso, confira os casos de uso de Remote Config, bem como alguns dos principais conceitos e a documentação de estratégias avançadas, que incluem: