JustTweakは、iOSアプリの機能フラグフレームワークです。特定の優先順位を尊重して照会された複数の微調整プロバイダーと対話する単純なファサードインターフェイスを提供します。微調整は、クライアントコードの決定を促進するために使用されるフラグを表します。
JustTweakを使用すると、以下を達成できます。
JustTweakはCocoapodsから入手できます。インストールするには、次の行をPodfileに追加するだけです。
pod "JustTweak"
JustTweakはSPMからも利用できます。このリポジトリのURLをコピーし、プロジェクト設定にパッケージを追加します。
LocalTweakProvider
JSONファイルを定義します。開始点については、 LocalTweaks_example.json
を参照してください。スタックを構成するには、2つのオプションがあります。
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
に裏打ちされた機能のプロパティと定数を実装します。開始点については、 TweakAccessor.swift
を参照してください。 config.json
ファイルのスタック構成を次の形式で定義します。 {
"accessorName" : " GeneratedTweakAccessor "
}
現在サポートされている唯一の値は、生成されたクラスの名前を定義するaccessorName
です。
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
ターゲットが構築されるたびに、コードジェネレーターツールはスタックのコードを再生します。 LocalTweakProvider
で定義されている機能を裏付けるすべてのプロパティが含まれます。
コードジェネレーターツールを使用した場合、生成されたスタックにはすべての機能フラグが含まれます。 Accessorオブジェクトを割り当てるだけ( .json
構成で定義した名前を使用し、それを使用して機能フラグにアクセスします。
let accessor = GeneratedTweakAccessor ( with : < #tweak_manager_instance# > )
if accessor . meaningOfLife == 42 {
...
}
生成されたコードの例については、 GeneratedTweakAccessor.swift
およびGeneratedTweakAccessor+Constants.swift
を参照してください。
Stack Codeを自分で実装することにした場合、 TweakManager
を介して機能にアクセスするためのコードを実装する必要があります。
JustTweakの3つの主な機能は、 TweakManager
インスタンスからアクセスして、コードパスの決定を促進できます。
// check for a feature to be enabled
let enabled = tweakManager . isFeatureEnabled ( " some_feature " )
if enabled {
// enable the feature
} else {
// default behaviour
}
TweakManager
セット値が見つからない場合、最優先事項でTweakプロバイダーから値を返し、他のものに自動的にフォールバックします。必要に応じてキャッチして処理できる微調整が見つかると、エグゼクティブがスローされます。 tweakWith(feature:variable:)
または提供されたプロパティラッパーのいずれかを使用します。
// 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
}
またはdo-catchで
// 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
、 @FallbackTweakProperty
プロパティラッパーは、機能フラグを表すプロパティをマークするために利用できます。これらのプロパティラッパーを使用するには、 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
tweakProviders
アレイのオブジェクトの順序は、Tweakプロバイダーの優先度を定義します。
上記の例のUserDefaultsTweakProvider
など、最優先事項を持つMutableTweakProvider
、UI( TweakViewController
)で行われた変更を反映するために使用されます。 LocalTweakProvider
、ローカルTweakプロバイダーのデフォルト値を提供し、 TweakViewController
がUIに入力するために使用するため、最優先度が最も低い必要があります。
マニュアルからコード生成の実装に移行するには、新しい.json
形式に更新する必要があります。このプロセスを支援するために、 GeneratedPropertyName
プロパティをTweakオブジェクトに追加しました。この値を設定して、現在のプロパティ名と整合して、生成されたアクセサアプロパティが既存の実装と一致するようにします。
TweakManager
パフォーマンスを改善するために、微調整値をキャッシュするオプションを提供します。キャッシュはデフォルトで無効になっていますが、 useCache
プロパティで有効にすることができます。有効にすると、キャッシュをリセットするには2つの方法があります。
TweakManager
のresetCache
メソッドを呼び出しますTweakProviderDidChangeNotification
通知を投稿してくださいJustTweakには、ユーザーが最優先事項でMutableTweakProvider
編集できるViewControllerが付属しています。
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 )
}
MutableTweakProvider
で値が変更されると、クライアントにUIの変化を反応させて反映する機会を提供するために通知が起動されます。
override func viewDidLoad ( ) {
super . viewDidLoad ( )
NotificationCenter . defaultCenter ( ) . addObserver ( self ,
selector : #selector ( updateUI ) ,
name : TweakProviderDidChangeNotification ,
object : nil )
}
@ objc func updateUI ( ) {
// update the UI accordingly
}
JustTweakには、すぐに調整された3つのTweakプロバイダーが付属しています。
UserDefaultsTweakProvider
は、可変であり、 UserDefaults
キー/バリューストアとして使用しますLocalTweakProvider
は読み取り専用で、デフォルトの機能フラグのセットアップを保持するためのJSONファイルを使用していますEphemeralTweakProvider
は、単にNSMutableDictionary
のインスタンスですさらに、JustTweakは、ニーズに合わせて独自のTweakプロバイダーを作成するために実装できるTweakProvider
およびMutableTweakProvider
プロトコルを定義します。この例プロジェクトでは、出発点として使用できるいくつかの例を見つけることができます。
JustTweakは、 TweakProvider
にdecryptionClosure
を追加する機能を提供します。この閉鎖は、入力としてTweak
を受け、 TweakValue
出力として返します。閉鎖により、値を復号化するために使用できる微調整で前処理を行うことができます。これは、以下に示すように、Tweaks JSONファイルに暗号化された値がある場合に使用できます。
"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
}
復号化が閉鎖されて値を処理するために、JSONファイル( Encrypted
プロパティを使用)で値が暗号化されているかどうかを指定する必要があることに注意してください。上記のJSONの復号化閉鎖は、次のように指定できます。
tweakProvider . decryptionClosure = { tweak in
// decrypt `tweak.value` with your cypher of choice and return the decrypted value
}
このようにして、Tweakプロバイダーから取得された微調整には、復号化された値があります。
JustTweakは、Apache 2.0ライセンスの下で利用できます。詳細については、ライセンスファイルを参照してください。