JustTweak é uma estrutura de sinalização de recursos para aplicativos iOS. Ele fornece uma interface de fachada simples, interagindo com vários provedores de ajustes que são consultados em relação a uma determinada prioridade. Os ajustes representam sinalizadores usados para direcionar decisões no código do cliente.
Com JustTweak, você pode alcançar o seguinte:
JustTweak está disponível através de Cocoapods. Para instalá -lo, basta adicionar a seguinte linha ao seu PODFILE:
pod "JustTweak"
JustTweak também está disponível no SPM. Copie o URL para este repositório e adicione o pacote nas configurações do seu projeto.
LocalTweakProvider
incluindo seus recursos. Consulte LocalTweaks_example.json
para obter um ponto de partida.Para configurar a pilha, você tem duas opções:
static let tweakManager : TweakManager = {
var tweakProviders : [ TweakProvider ] = [ ]
// Mutable TweakProvider (to override tweaks from other TweakProviders)
let userDefaultsTweakProvider = UserDefaultsTweakProvider ( userDefaults : UserDefaults . standard )
tweakProviders . append ( userDefaultsTweakProvider )
// Optimizely (remote TweakProvider)
let optimizelyTweakProvider = OptimizelyTweakProvider ( )
optimizelyTweakProvider . userId = UUID ( ) . uuidString
tweakProviders . append ( optimizelyTweakProvider )
// Firebase Remote Config (remote TweakProvider)
let firebaseTweakProvider = FirebaseTweakProvider ( )
tweakProviders . append ( firebaseTweakProvider )
// Local JSON-based TweakProvider (default TweakProvider)
let jsonFileURL = Bundle . main . url ( forResource : " LocalTweaks_example " , withExtension : " json " ) !
let localTweakProvider = LocalTweakProvider ( jsonURL : jsonFileURL )
tweakProviders . append ( localTweakProvider )
return TweakManager ( tweakProviders : tweakProviders )
} ( )
LocalTweakProvider
. Consulte TweakAccessor.swift
para um ponto de partida. config.json
no seguinte formato: {
"accessorName" : " GeneratedTweakAccessor "
}
O único valor suportado atualmente é accessorName
que define o nome da classe gerada.
Podfile
script_phase :name = > ' TweakAccessorGenerator ' ,
:script = > ' $SRCROOT/../TweakAccessorGenerator
-l $SRCROOT/<path_to_the_local_tweaks_json_file>
-o $SRCROOT/<path_to_the_output_folder_for_the_generated_code>
-c $SRCROOT/<path_to_the_folder_containing_config.json> ' ,
:execution_position = > :before_compile
Sempre que o destino é construído, a ferramenta de gerador de código regenera o código da pilha. Ele incluirá todas as propriedades que apoiam os recursos definidos no LocalTweakProvider
.
Se você usou a ferramenta geradora de código, a pilha gerada inclui todos os sinalizadores de recursos. Basta alocar o objeto Acessor (cujo nome você definiu na configuração .json
e use -o para acessar os sinalizadores de recursos.
let accessor = GeneratedTweakAccessor ( with : < #tweak_manager_instance# > )
if accessor . meaningOfLife == 42 {
...
}
Consulte GeneratedTweakAccessor.swift
e GeneratedTweakAccessor+Constants.swift
para um exemplo de código gerado.
Se você decidiu implementar o código da pilha, precisará implementar o código para acessar os recursos através do TweakManager
.
Os três principais recursos do JustTweak podem ser acessados a partir da instância TweakManager
para conduzir as decisões do caminho do código.
// check for a feature to be enabled
let enabled = tweakManager . isFeatureEnabled ( " some_feature " )
if enabled {
// enable the feature
} else {
// default behaviour
}
TweakManager
retornará o valor do provedor de ajustes com a maior prioridade e o fallback automaticamente para os outros se nenhum valor definido for encontrado. Ele lança execução quando um ajuste nulo é encontrado, que pode ser capturado e manuseado conforme necessário. Use tweakWith(feature:variable:)
ou os Wrappers de propriedade fornecidos.
// check for a tweak value
let tweak = try ? tweakManager . tweakWith ( feature : " some_feature " , variable : " some_flag " )
if let tweak = tweak {
// tweak was found in some tweak provider, use tweak.value
} else {
// tweak was not found in any tweak provider
}
Ou com a captura de doenças
// check for a tweak value
do {
let tweak = try tweakManager . tweakWith ( feature : " some_feature " , variable : " some_flag " )
// tweak was found in some tweak provider, use tweak.value
return tweak
} catch let error as TweakError {
switch error {
case . notFound : ( ) // "Feature or variable is not found"
case . notSupported : ( ) // "Variable type is not supported"
case . decryptionClosureNotProvided : ( ) // "Value is encrypted but there's no decryption closure provided"
}
} catch let error { // add a default catch to satisfy the compiler
print ( error . localizedDescription )
}
@TweakProperty
, @OptionalTweakProperty
e @FallbackTweakProperty
Os invólucros estão disponíveis para marcar propriedades que representam sinalizadores de recursos. Lembre -se de que, para usar esses invólucros de propriedades, é necessária uma instância estática do TweakManager
.
@ TweakProperty ( feature : < #feature_key# > ,
variable : < # var iable_key# > ,
tweakManager : < #TweakManager# > )
var labelText : String
@ OptionalTweakProperty ( fallbackValue : < #nillable_fallback_value# > ,
feature : < #feature_key# > ,
variable : < # var iable_key# > ,
tweakManager : < #TweakManager# > )
var meaningOfLife : Int ?
@ FallbackTweakProperty ( fallbackValue : < #nillable_fallback_value# > ,
feature : < #feature_key# > ,
variable : < # var iable_key# > ,
tweakManager : < #TweakManager# > )
var shouldShowFeatureX : Bool
A ordem dos objetos na matriz tweakProviders
define a prioridade dos provedores de ajustes.
O MutableTweakProvider
com a maior prioridade, como UserDefaultsTweakProvider
no exemplo acima, será usado para refletir as alterações feitas na interface do usuário ( TweakViewController
). O LocalTweakProvider
deve ter a menor prioridade, pois fornece os valores padrão de um provedor de ajustes local e é o usado pelo TweakViewController
para preencher a interface do usuário.
Para migrar do manual para a implementação gerada pelo código, é necessário atualizar para o novo formato .json
. Para ajudar nesse processo, adicionamos a propriedade GeneratedPropertyName
ao objeto Tweak. Defina esse valor para alinhar com seus nomes de propriedades atuais no código, para que as propriedades do acessador gerado correspondam à sua implementação existente.
O TweakManager
oferece a opção de armazenar em cache os valores de ajuste para melhorar o desempenho. O cache é desativado por padrão, mas pode ser ativado pela propriedade useCache
. Quando ativado, há duas maneiras de redefinir o cache:
resetCache
no TweakManager
TweakProviderDidChangeNotification
O JustTweak vem com um ViewController que permite ao usuário editar o MutableTweakProvider
com a maior prioridade.
func presentTweakViewController ( ) {
let tweakViewController = TweakViewController ( style : . grouped , tweakManager : < #TweakManager# > )
// either present it modally
let tweaksNavigationController = UINavigationController ( rootViewController : tweakViewController )
tweaksNavigationController . navigationBar . prefersLargeTitles = true
present ( tweaksNavigationController , animated : true , completion : nil )
// or push it on an existing UINavigationController
navigationController ? . pushViewController ( tweakViewController , animated : true )
}
Quando um valor é modificado em qualquer MutableTweakProvider
, uma notificação é demitida para dar aos clientes a oportunidade de reagir e refletir alterações na interface do usuário.
override func viewDidLoad ( ) {
super . viewDidLoad ( )
NotificationCenter . defaultCenter ( ) . addObserver ( self ,
selector : #selector ( updateUI ) ,
name : TweakProviderDidChangeNotification ,
object : nil )
}
@ objc func updateUI ( ) {
// update the UI accordingly
}
JustTweak vem com três provedores de ajustes prontos para o uso:
UserDefaultsTweakProvider
, que é mutável e usa UserDefaults
como um armazenamento de chave/valueLocalTweakProvider
, que é somente leitura e usa um arquivo JSON destinado a manter a configuração de sinalização padrão de sinalização do recursoEphemeralTweakProvider
, que é simplesmente uma instância do NSMutableDictionary
Além disso, o JustTweak define protocolos TweakProvider
e MutableTweakProvider
que você pode implementar para criar seu próprio provedor de ajustes para atender às suas necessidades. No projeto de exemplo, você pode encontrar alguns exemplos que você pode usar como ponto de partida.
O JustTweak oferece a capacidade de adicionar uma decryptionClosure
a um TweakProvider
. Esse fechamento toma o Tweak
como entrada e retorna um TweakValue
como saída. O fechamento permite que você faça algum pré -processamento no seu ajuste, que pode ser usado para descriptografar os valores. Isso pode ser usado se você tiver um valor criptografado no arquivo JSON de ajustes, como pode ser visto abaixo:
"encrypted_answer_to_the_universe" : {
"Title" : " Encrypted definitive answer " ,
"Description" : " Encrypted answer to the Ultimate Question of Life, the Universe, and Everything " ,
"Group" : " General " ,
"Value" : " 24 ton yletinifeD " ,
"GeneratedPropertyName" : " definitiveAnswerEncrypted " ,
"Encrypted" : true
}
Observe que você deve especificar se o valor é criptografado no seu arquivo json (com a propriedade Encrypted
) para o fechamento de descriptografia para processar o valor. O fechamento de descriptografia para o JSON acima pode ser especificado da seguinte forma:
tweakProvider . decryptionClosure = { tweak in
// decrypt `tweak.value` with your cypher of choice and return the decrypted value
}
Dessa forma, o ajuste obtido no provedor de ajustes terá o valor descriptografado.
JustTweak está disponível sob a licença Apache 2.0. Consulte o arquivo de licença para obter mais informações.