JustTweak เป็นเฟรมเวิร์กการตั้งค่าสถานะสำหรับแอพ iOS มันให้อินเทอร์เฟซด้านหน้าอย่างง่ายที่มีปฏิสัมพันธ์กับผู้ให้บริการปรับแต่งหลายรายที่มีการสอบถามเกี่ยวกับลำดับความสำคัญที่กำหนด Tweaks เป็นตัวแทนของธงที่ใช้ในการขับเคลื่อนการตัดสินใจในรหัสลูกค้า
ด้วย JustTweak คุณสามารถทำสิ่งต่อไปนี้:
JustTweak มีให้บริการผ่าน Cocoapods หากต้องการติดตั้งเพียงเพิ่มบรรทัดต่อไปนี้ลงใน PodFile ของคุณ:
pod "JustTweak"
JustTweak ยังมีให้บริการผ่าน SPM คัดลอก URL สำหรับ repo นี้และเพิ่มแพ็คเกจในการตั้งค่าโครงการของคุณ
LocalTweakProvider
รวมถึงคุณสมบัติของคุณ อ้างถึง 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
หากคุณใช้เครื่องมือเครื่องกำเนิดรหัสสแต็กที่สร้างขึ้นจะมีธงฟีเจอร์ทั้งหมด เพียงจัดสรรวัตถุ accessor (ซึ่งชื่อที่คุณกำหนดไว้ในการกำหนดค่า .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 ที่มีลำดับความสำคัญสูงสุดและทางเลือกให้กับผู้อื่นโดยอัตโนมัติหากไม่พบค่าที่ตั้งไว้ มันส่งผลงานเมื่อพบการปรับแต่งไม่มีการปรับแต่งซึ่งสามารถจับและจัดการได้ตามต้องการ ใช้ tweakWith(feature:variable:)
หรือ wrappers คุณสมบัติที่ให้ไว้
// 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
}
หรือด้วยการจับ
// 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
wrappers มีให้บริการเพื่อทำเครื่องหมายคุณสมบัติที่เป็นตัวแทนของธงฟีเจอร์ โปรดทราบว่าเพื่อที่จะใช้ wrappers ทรัพย์สินเหล่านี้จำเป็นต้องมีอินสแตนซ์แบบคงที่ของ 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
กำหนดลำดับความสำคัญของผู้ให้บริการปรับแต่ง
MutableTweakProvider
ที่มีลำดับความสำคัญสูงสุดเช่น UserDefaultsTweakProvider
ในตัวอย่างด้านบนจะถูกนำมาใช้เพื่อสะท้อนการเปลี่ยนแปลงที่เกิดขึ้นใน UI ( TweakViewController
) LocalTweakProvider
ควรมีลำดับความสำคัญต่ำสุดเนื่องจากให้ค่าเริ่มต้นจากผู้ให้บริการปรับแต่งท้องถิ่นและเป็นค่าที่ใช้โดย TweakViewController
เพื่อเติม UI
ในการโยกย้ายจากคู่มือไปยังการใช้งานรหัสที่สร้างขึ้นจำเป็นต้องอัปเดตเป็นรูปแบบ .json
ใหม่ เพื่อช่วยในกระบวนการนี้เราได้เพิ่มคุณสมบัติ GeneratedPropertyName
ใน PropertyName ลงในวัตถุ tweak ตั้งค่านี้ให้สอดคล้องกับชื่อคุณสมบัติปัจจุบันของคุณในรหัสเพื่อให้คุณสมบัติ accessor ที่สร้างขึ้นตรงกับการใช้งานที่มีอยู่ของคุณ
TweakManager
มีตัวเลือกในการแคชค่า tweak เพื่อปรับปรุงประสิทธิภาพ การแคชถูกปิดใช้งานโดยค่าเริ่มต้น แต่สามารถเปิดใช้งานได้ผ่านคุณสมบัติ useCache
เมื่อเปิดใช้งานมีสองวิธีในการรีเซ็ตแคช:
resetCache
บน TweakManager
TweakProviderDidChangeNotification
JustTweak มาพร้อมกับ ViewController ที่ช่วยให้ผู้ใช้สามารถแก้ไข MutableTweakProvider
ด้วยลำดับความสำคัญสูงสุด
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 มาพร้อมกับผู้ให้บริการปรับแต่งสามคนนอกกรอบ:
UserDefaultsTweakProvider
ซึ่งไม่สามารถเปลี่ยนแปลงได้และใช้ UserDefaults
เป็นคีย์/ค่าที่เก็บLocalTweakProvider
ซึ่งอ่านอย่างเดียวและใช้ไฟล์ JSON ที่มีไว้เพื่อเก็บการตั้งค่าการตั้งค่าสถานะฟีเจอร์เริ่มต้นEphemeralTweakProvider
ซึ่งเป็นเพียงตัวอย่างของ NSMutableDictionary
นอกจากนี้ JustTweak กำหนดโปรโตคอล TweakProvider
และ MutableTweakProvider
ที่คุณสามารถนำไปใช้เพื่อสร้างผู้ให้บริการปรับแต่งของคุณเองเพื่อให้เหมาะกับความต้องการของคุณ ในโครงการตัวอย่างคุณสามารถค้นหาตัวอย่างที่คุณสามารถใช้เป็นจุดเริ่มต้น
JustTweak เสนอความสามารถในการเพิ่ม decryptionClosure
ให้กับ TweakProvider
การปิดนี้ใช้ 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 ดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม