JustTweak는 iOS 앱의 기능 플래그 프레임 워크입니다. 주어진 우선 순위와 관련하여 쿼리되는 여러 조정 제공 업체와 상호 작용하는 간단한 Facade 인터페이스를 제공합니다. 조정은 클라이언트 코드에서 결정을 내리는 데 사용되는 플래그를 나타냅니다.
JusttWeak를 사용하면 다음을 달성 할 수 있습니다.
Justtweak는 Cocoapods를 통해 제공됩니다. 설치하려면 Podfile에 다음 줄을 추가하십시오.
pod "JustTweak"
Justtweak는 SPM을 통해도 제공됩니다. 이 repo의 URL을 복사하고 프로젝트 설정에 패키지를 추가하십시오.
LocalTweakProvider
JSON 파일을 정의하십시오. 시작점은 LocalTweaks_example.json
을 참조하십시오.스택을 구성하려면 두 가지 옵션이 있습니다.
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
에 정의 된 기능을 뒷받침하는 모든 속성이 포함됩니다.
코드 생성기 도구를 사용한 경우 생성 된 스택에는 모든 기능 플래그가 포함되어 있습니다. 액세서 객체 ( .json
구성에 정의한 이름이있는 이름을 할당하고 기능 플래그에 액세스하는 데 사용하십시오.
let accessor = GeneratedTweakAccessor ( with : < #tweak_manager_instance# > )
if accessor . meaningOfLife == 42 {
...
}
생성 된 코드의 예는 GeneratedTweakAccessor.swift
및 GeneratedTweakAccessor+Constants.swift
참조하십시오.
스택 코드를 직접 구현하기로 결정한 경우 TweakManager
통해 기능에 액세스하기 위해 코드를 구현해야합니다.
JustTweak의 세 가지 주요 기능은 TweakManager
인스턴스에서 액세스하여 코드 경로 결정을 주도 할 수 있습니다.
// check for a feature to be enabled
let enabled = tweakManager . isFeatureEnabled ( " some_feature " )
if enabled {
// enable the feature
} else {
// default behaviour
}
TweakManager
설정 값이없는 경우 우선 순위가 가장 높고 다른 사람에게 자동으로 변형 된 Tweak Provider의 값을 반환합니다. 필요에 따라 잡히고 처리 할 수있는 NIL 조정이 발견되면 사형 퇴치를 던집니다. 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
어레이의 오브젝트 순서는 조정 제공 업체의 우선 순위를 정의합니다.
위의 예제에서 UserDefaultsTweakProvider
와 같이 우선 순위가 가장 높은 MutableTweakProvider
UI ( TweakViewController
)의 변경 사항을 반영하는 데 사용됩니다. LocalTweakProvider
는 로컬 트위언 제공 업체의 기본값을 제공하므로 TweakViewController
가 UI를 채우는 데 사용하는 것입니다.
매뉴얼에서 생성 된 구현으로 마이그레이션하려면 새로운 .json
형식으로 업데이트해야합니다. 이 프로세스를 돕기 위해 GeneratedPropertyName
속성을 조정 객체에 추가했습니다. 생성 된 액세서 속성이 기존 구현과 일치하도록 현재 속성 이름과 현재 속성 이름에 맞게이 값을 설정하십시오.
TweakManager
성능을 향상시키기 위해 Teak 값을 캐시하는 옵션을 제공합니다. 캐싱은 기본적으로 비활성화되지만 useCache
속성을 통해 활성화 할 수 있습니다. 활성화되면 캐시를 재설정하는 두 가지 방법이 있습니다.
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 개의 조정 제공 업체가 제공됩니다.
UserDefaults
키/가치 저장소로 사용하는 UserDefaultsTweakProvider
LocalTweakProvider
EphemeralTweakProvider
는 단순히 NSMutableDictionary
의 인스턴스입니다 또한 JustTweak는 TweakProvider
및 MutableTweakProvider
프로토콜을 정의하여 귀하의 요구에 맞는 자체 조정 제공 업체를 작성합니다. 예제 프로젝트에서는 출발점으로 사용할 수있는 몇 가지 예를 찾을 수 있습니다.
Justtweak는 TweakProvider
에 decryptionClosure
추가 할 수있는 기능을 제공합니다. 이 폐쇄는 Tweak
입력으로 가져 와서 TweakValue
를 출력으로 반환합니다. 클로저를 사용하면 값을 해독하는 데 사용할 수있는 조정에 대한 전처리를 수행 할 수 있습니다. 아래에서 볼 수 있듯이 조정 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
}
이런 식으로, 조정 제공 업체에서 가져온 조정은 해독 된 값을 갖습니다.
Justtweak는 Apache 2.0 라이센스에 따라 제공됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.