คุณใช้ Firebase Remote Config เพื่อกำหนดพารามิเตอร์ในแอปและ อัปเดตค่าในระบบคลาวด์ได้ ซึ่งจะช่วยให้คุณแก้ไขรูปลักษณ์และ ลักษณะการทำงานของแอปได้โดยไม่ต้องเผยแพร่การอัปเดตแอป คู่มือนี้จะแนะนำขั้นตอนการเริ่มต้นใช้งานและแสดงโค้ดตัวอย่าง ซึ่งทั้งหมดนี้พร้อมให้โคลนหรือดาวน์โหลดจากที่เก็บ firebase/quickstart-ios บน GitHub
ขั้นตอนที่ 1: เพิ่ม Remote Config ลงในแอป
หากยังไม่ได้ดำเนินการ ให้เพิ่ม Firebase ในโปรเจ็กต์ Apple
สําหรับ Remote Config Google Analytics ต้องใช้สําหรับ การกําหนดเป้าหมายแบบมีเงื่อนไขของอินสแตนซ์แอป ไปยังพร็อพเพอร์ตี้ผู้ใช้และกลุ่มเป้าหมาย ตรวจสอบว่าคุณได้ เปิดใช้ Google Analytics ในโปรเจ็กต์แล้ว
สร้างออบเจ็กต์ Remote Config แบบซิงเกิลตัน ดังที่แสดงในตัวอย่างต่อไปนี้
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;
ออบเจ็กต์นี้ใช้เพื่อจัดเก็บค่าพารามิเตอร์เริ่มต้นในแอป ดึงค่าพารามิเตอร์ที่อัปเดตแล้วจากแบ็กเอนด์ Remote Config และควบคุมเวลาที่ค่าที่ดึงมาจะพร้อมใช้งานในแอป
ในระหว่างการพัฒนา เราขอแนะนำให้ตั้งค่าช่วงเวลาการดึงข้อมูลขั้นต่ำให้ค่อนข้างต่ำ ดูข้อมูลเพิ่มเติมได้ที่การควบคุมอัตรา
ขั้นตอนที่ 2: ตั้งค่าพารามิเตอร์เริ่มต้นในแอป
คุณสามารถตั้งค่าพารามิเตอร์เริ่มต้นในแอปในRemote Config ออบเจ็กต์ เพื่อให้แอปทํางานตามที่ต้องการก่อนที่จะเชื่อมต่อกับแบ็กเอนด์ของ Remote Config และเพื่อให้มีค่าเริ่มต้นในกรณีที่ไม่ได้ตั้งค่าใดๆ ในแบ็กเอนด์
กำหนดชุดชื่อพารามิเตอร์และค่าพารามิเตอร์เริ่มต้นโดยใช้ออบเจ็กต์
NSDictionary
หรือไฟล์ plistหากกำหนดค่าRemote Configค่าพารามิเตอร์แบ็กเอนด์แล้ว คุณสามารถดาวน์โหลดไฟล์
plist
ที่สร้างขึ้นซึ่งมีค่าเริ่มต้นทั้งหมดและ บันทึกลงในโปรเจ็กต์ 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
Firebase คอนโซล
ในแท็บพารามิเตอร์ ให้เปิด เมนู แล้ว เลือกดาวน์โหลดค่าเริ่มต้น
เมื่อได้รับข้อความแจ้ง ให้เปิดใช้ .plist สำหรับ iOS แล้วคลิกดาวน์โหลดไฟล์
เพิ่มค่าเหล่านี้ลงในออบเจ็กต์ Remote Config โดยใช้
setDefaults:
ตัวอย่างต่อไปนี้จะตั้งค่าเริ่มต้นในแอปจากไฟล์ plistSwift
remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
Objective-C
[self.remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];
ขั้นตอนที่ 3: รับค่าพารามิเตอร์สำหรับใช้ในแอป
ตอนนี้คุณรับค่าพารามิเตอร์จากออบเจ็กต์ Remote Config ได้แล้ว หากคุณตั้งค่าในRemote Configแบ็กเอนด์ในภายหลัง ให้ดึงข้อมูลเหล่านั้น แล้วเปิดใช้งาน
ค่าเหล่านั้นจะพร้อมใช้งานในแอปของคุณ มิฉะนั้น คุณจะได้รับค่าพารามิเตอร์ในแอปที่กำหนดค่าโดยใช้
setDefaults:
หากต้องการรับค่าเหล่านี้ ให้เรียกใช้เมธอด
configValueForKey:
โดยระบุคีย์พารามิเตอร์เป็นอาร์กิวเมนต์
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
วิธีที่อ่านง่ายและสะดวกกว่าในการเข้าถึงค่าเหล่านี้ใน Swift คือการใช้สัญกรณ์การอ้างอิงแบบดัชนีของ Swift ดังนี้
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
ใช้ Codable เพื่อการกำหนดค่าที่ปลอดภัยต่อประเภท
สำหรับการกำหนดค่าที่ซับซ้อนมากขึ้น คุณสามารถใช้โปรโตคอล Codable
ของ Swift เพื่อ
ถอดรหัส Structured Data จาก Remote Config ได้ ซึ่งจะช่วยให้การจัดการการกำหนดค่ามีความปลอดภัยด้านประเภท
และทำให้การทำงานกับออบเจ็กต์ที่ซับซ้อนง่ายขึ้น
// 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)")
}
}
}
วิธีนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- กำหนดโครงสร้างการกำหนดค่าที่ซับซ้อน
- แยกวิเคราะห์การกำหนดค่า JSON โดยอัตโนมัติ
- ตรวจสอบความปลอดภัยของประเภทเมื่อเข้าถึงค่า Remote Config
- เขียนโค้ดที่สะอาดและอ่านง่ายเพื่อจัดการRemote Config เทมเพลตที่มีโครงสร้าง
ใช้ Property Wrappers สำหรับการกำหนดค่าแบบประกาศใน SwiftUI
Property Wrapper เป็นฟีเจอร์ Swift ที่มีประสิทธิภาพซึ่งช่วยให้คุณเพิ่มลักษณะการทำงานที่กำหนดเอง ลงในการประกาศพร็อพเพอร์ตี้ได้ ใน SwiftUI จะใช้ Property Wrapper เพื่อ จัดการสถานะ การเชื่อมโยง และลักษณะการทำงานอื่นๆ ของพร็อพเพอร์ตี้ ดูข้อมูลเพิ่มเติมได้ในคำแนะนำเกี่ยวกับภาษา 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()
}
}
}
ใช้ตัวห่อหุ้มพร็อพเพอร์ตี้ @RemoteConfigProperty
เมื่อต้องการวิธีประกาศ
เพื่อเข้าถึงค่า Remote Config ใน SwiftUI โดยมีการรองรับค่าเริ่มต้นในตัว
และการจัดการการกำหนดค่าที่ง่ายขึ้น
ขั้นตอนที่ 4: ตั้งค่าพารามิเตอร์
การใช้FirebaseคอนโซลหรือRemote ConfigAPI แบ็กเอนด์ จะช่วยให้คุณสร้างค่าเริ่มต้นแบ็กเอนด์ใหม่ที่ลบล้างค่าในแอป ตามตรรกะแบบมีเงื่อนไขหรือการกำหนดเป้าหมายผู้ใช้ที่ต้องการได้ ส่วนนี้ จะแนะนำFirebaseขั้นตอนในคอนโซลเพื่อสร้างค่าเหล่านี้
- เปิดโปรเจ็กต์ในคอนโซล Firebase
- เลือก Remote Config จากเมนูเพื่อดูRemote Config แดชบอร์ด
- กําหนดพารามิเตอร์ที่มีชื่อเดียวกับพารามิเตอร์ที่คุณกําหนดไว้ใน แอปของคุณ สําหรับพารามิเตอร์แต่ละรายการ คุณสามารถตั้งค่าเริ่มต้น (ซึ่งจะ ลบล้างค่าเริ่มต้นในแอปในที่สุด) และยังตั้งค่าแบบมีเงื่อนไขได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ Remote Config พารามิเตอร์และเงื่อนไข
หากใช้เงื่อนไข สัญญาณที่กำหนดเอง ให้กำหนดแอตทริบิวต์และค่าของแอตทริบิวต์ ตัวอย่างต่อไปนี้แสดงวิธี กำหนดเงื่อนไขสัญญาณที่กำหนดเอง
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!"); } }]; });
ขั้นตอนที่ 5: ดึงข้อมูลและเปิดใช้งานค่า
หากต้องการดึงค่าพารามิเตอร์จาก Remote Config ให้เรียกใช้เมธอด
fetchWithCompletionHandler:
หรือ
fetchWithExpirationDuration:completionHandler:
ระบบจะดึงค่าที่คุณตั้งไว้ในแบ็กเอนด์และ
แคชไว้ในออบเจ็กต์ Remote Config
ในกรณีที่คุณต้องการดึงข้อมูลและเปิดใช้งานค่าในการเรียกครั้งเดียว ให้ใช้
fetchAndActivateWithCompletionHandler:
ตัวอย่างนี้จะดึงค่าจากแบ็กเอนด์ Remote Config (ค่าที่ไม่ได้แคช) และเรียกใช้ activateWithCompletionHandler:
เพื่อให้ค่าพร้อมใช้งานในแอป
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); } }];
เนื่องจากค่าพารามิเตอร์ที่อัปเดตเหล่านี้ส่งผลต่อลักษณะการทำงานและลักษณะที่ปรากฏ ของแอป คุณจึงควรเปิดใช้งานค่าที่ดึงมาในเวลาที่รับประกันได้ว่าผู้ใช้จะได้รับประสบการณ์ที่ราบรื่น เช่น ครั้งถัดไปที่ผู้ใช้เปิดแอปของคุณ ดูข้อมูลและตัวอย่างเพิ่มเติมได้ที่กลยุทธ์การโหลดการกำหนดค่าระยะไกล
ขั้นตอนที่ 6: ฟังข้อมูลอัปเดตแบบเรียลไทม์
หลังจากดึงค่าพารามิเตอร์แล้ว คุณจะใช้ Remote Config แบบเรียลไทม์เพื่อ ฟังการอัปเดตจากแบ็กเอนด์ของ Remote Config ได้ สัญญาณแบบเรียลไทม์ Remote Configไปยังอุปกรณ์ที่เชื่อมต่อเมื่อมีการอัปเดตและ ดึงข้อมูลการเปลี่ยนแปลงโดยอัตโนมัติหลังจากที่คุณเผยแพร่Remote Config เวอร์ชันใหม่
Firebase SDK สำหรับแพลตฟอร์ม Apple เวอร์ชัน 10.7.0 ขึ้นไปรองรับการอัปเดตแบบเรียลไทม์
ในแอป ให้เรียกใช้
addOnConfigUpdateListener
เพื่อเริ่มฟังการอัปเดต และดึงค่าพารามิเตอร์ใหม่หรือที่อัปเดตแล้วโดยอัตโนมัติ ตัวอย่างต่อไปนี้ จะรอการอัปเดต และเมื่อมีการเรียกใช้activateWithCompletionHandler
จะใช้ค่าที่เพิ่งดึงมาเพื่อแสดงข้อความต้อนรับที่อัปเดตแล้ว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]; }); }]; } }];
ในครั้งถัดไปที่คุณเผยแพร่ Remote Config เวอร์ชันใหม่ อุปกรณ์ ที่เรียกใช้แอปและรอฟังการเปลี่ยนแปลงจะเรียกใช้ตัวแฮนเดิลการดำเนินการเสร็จสมบูรณ์
การควบคุม
หากแอปดึงข้อมูลหลายครั้งเกินไปในช่วงเวลาสั้นๆ ระบบจะจำกัดอัตราการเรียกดึงข้อมูลและ SDK จะแสดง FIRRemoteConfigFetchStatusThrottled
ก่อน SDK เวอร์ชัน 6.3.0
ขีดจำกัดคือคำขอเรียกข้อมูล 5 รายการในหน้าต่าง
60 นาที (เวอร์ชันใหม่กว่ามีขีดจำกัดที่ผ่อนปรนมากกว่า)
ในระหว่างการพัฒนาแอป คุณอาจต้องการดึงข้อมูลบ่อยขึ้นเพื่อรีเฟรชแคช
บ่อยมาก (หลายครั้งต่อชั่วโมง) เพื่อให้คุณทำซ้ำได้อย่างรวดเร็วขณะพัฒนา
และทดสอบแอป การอัปเดต Remote Config แบบเรียลไทม์จะข้ามแคชโดยอัตโนมัติ
เมื่อมีการอัปเดตการกำหนดค่าในเซิร์ฟเวอร์ หากต้องการรองรับการทำซ้ำอย่างรวดเร็ว
ในโปรเจ็กต์ที่มีนักพัฒนาซอฟต์แวร์จำนวนมาก คุณสามารถเพิ่มFIRRemoteConfigSettings
พร็อพเพอร์ตี้ที่มีช่วงเวลาการดึงข้อมูลขั้นต่ำต่ำ
(MinimumFetchInterval
) ในแอปชั่วคราวได้
ช่วงเวลาการดึงข้อมูลการผลิตเริ่มต้นและที่แนะนำสำหรับ Remote Config คือ 12 ชั่วโมง ซึ่ง หมายความว่าระบบจะไม่ดึงข้อมูลการกำหนดค่าจากแบ็กเอนด์มากกว่า 1 ครั้งในกรอบเวลา 12 ชั่วโมง ไม่ว่าการเรียกดึงข้อมูลจะเกิดขึ้นจริงกี่ครั้งก็ตาม โดยเฉพาะอย่างยิ่ง ระบบจะกำหนด ช่วงเวลาการดึงข้อมูลขั้นต่ำตามลำดับต่อไปนี้
- พารามิเตอร์ใน
fetch(long)
- พารามิเตอร์ใน
FIRRemoteConfigSettings.MinimumFetchInterval
- ค่าเริ่มต้นคือ 12 ชั่วโมง
ขั้นตอนถัดไป
หากยังไม่ได้สำรวจ Remote Config กรณีการใช้งาน และดูเอกสารประกอบเกี่ยวกับแนวคิดหลักและกลยุทธ์ขั้นสูงบางส่วน ซึ่งรวมถึง