| เลือกแพลตฟอร์ม: | iOS+ Android Web Flutter Unity C++ |
คุณสามารถใช้ Firebase Remote Config เพื่อกำหนดพารามิเตอร์ในแอปและ อัปเดตค่าในระบบคลาวด์ ซึ่งจะช่วยให้คุณแก้ไขรูปลักษณ์และ ลักษณะการทำงานของแอปได้โดยไม่ต้องเผยแพร่การอัปเดตแอป คู่มือนี้จะแนะนำขั้นตอนการเริ่มต้นใช้งานและแสดงโค้ดตัวอย่าง ซึ่งทั้งหมดนี้พร้อมให้โคลนหรือดาวน์โหลดจากที่เก็บ firebase/quickstart-ios ใน GitHub
ขั้นตอนที่ 1: เพิ่ม Remote Config ลงในแอป
สำหรับ Remote Config ต้องใช้ Google Analytics ในการ กำหนดเป้าหมายแบบมีเงื่อนไขของอินสแตนซ์แอป ไปยังพร็อพเพอร์ตี้ผู้ใช้และกลุ่มเป้าหมาย โปรดเปิดใช้ Google Analyticsใน โปรเจ็กต์
สร้างออบเจ็กต์ Remote Config แบบ Singleton ดังที่แสดงในตัวอย่างต่อไปนี้
Swift
let remoteConfig = RemoteConfig.remoteConfig() let settings = RemoteConfigSettings() settings.minimumFetchInterval = 0 RemoteConfig.remoteConfig().configSettings = settings
Objective-C
FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init]; remoteConfigSettings.minimumFetchInterval = 0; remoteConfig.configSettings = remoteConfigSettings;
ออบเจ็กต์นี้ใช้เพื่อจัดเก็บค่าพารามิเตอร์เริ่มต้นในแอป ดึงค่าพารามิเตอร์ที่อัปเดต จากแบ็กเอนด์ Remote Config และควบคุมเวลาที่ค่าที่ดึงมา จะพร้อมใช้งานในแอป
ในระหว่างการพัฒนา เราขอแนะนำให้ตั้งค่าช่วงเวลาการดึงข้อมูลขั้นต่ำให้ค่อนข้างต่ำ ดูข้อมูลเพิ่มเติมได้ที่ การควบคุม
ขั้นตอนที่ 2: ตั้งค่าพารามิเตอร์เริ่มต้นในแอป
คุณสามารถตั้งค่าพารามิเตอร์เริ่มต้นในแอปในRemote Config ออบเจ็กต์ เพื่อให้แอปทำงานตามที่ต้องการก่อนที่จะเชื่อมต่อกับ Remote Configแบ็กเอนด์ และเพื่อให้ค่าเริ่มต้นพร้อมใช้งานในกรณีที่ไม่ได้ ตั้งค่าไว้ในแบ็กเอนด์
กำหนดชุดชื่อพารามิเตอร์และค่าพารามิเตอร์เริ่มต้นโดยใช้
NSDictionaryออบเจ็กต์หรือไฟล์ plistหากกำหนดค่าพารามิเตอร์แบ็กเอนด์ Remote Config ไว้แล้ว คุณสามารถดาวน์โหลดไฟล์
plistที่สร้างขึ้นซึ่งมีค่าเริ่มต้นทั้งหมด แล้วบันทึกลงในโปรเจ็กต์ XcodeREST
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
คุณสามารถสร้างโทเค็นผู้รับมอบสิทธิ์ได้โดยเรียกใช้คำสั่งต่อไปนี้โดยใช้ Google Cloud CLI หรือ Cloud Shell:
gcloud auth print-access-tokenโทเค็นนี้มีอายุการใช้งานสั้น คุณจึงอาจต้องสร้างใหม่หากได้รับข้อผิดพลาดในการตรวจสอบสิทธิ์
คอนโซล Firebase
ในแท็บพารามิเตอร์ ให้เปิด เมนู แล้วเลือกดาวน์โหลดค่าเริ่มต้น
เมื่อได้รับข้อความแจ้ง ให้เปิดใช้ .plist สำหรับ iOS แล้วคลิกดาวน์โหลดไฟล์
เพิ่มค่าเหล่านี้ลงในออบเจ็กต์ Remote Config โดยใช้
setDefaults:ตัวอย่างต่อไปนี้จะตั้งค่าเริ่มต้นในแอปจากไฟล์ plistSwift
RemoteConfig.remoteConfig().setDefaults(fromPlist: "RemoteConfigDefaults")
Objective-C
[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 Wrapper สำหรับการกำหนดค่าแบบประกาศใน 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()
}
}
}
ใช้ Property Wrapper @RemoteConfigProperty เมื่อต้องการวิธีแบบประกาศ
เพื่อเข้าถึงค่า Remote Config ใน SwiftUI โดยมีการรองรับค่าเริ่มต้น
ในตัวและการจัดการการกำหนดค่าที่ง่ายขึ้น
ขั้นตอนที่ 4: ตั้งค่าพารามิเตอร์
คุณสามารถสร้างค่าเริ่มต้นแบ็กเอนด์ใหม่ที่ลบล้างค่าในแอปได้ตามตรรกะแบบมีเงื่อนไขหรือการกำหนดเป้าหมายผู้ใช้ที่ต้องการ โดยใช้คอนโซล Firebase หรือ API แบ็กเอนด์ Remote Config ส่วนนี้จะแนะนำขั้นตอนในคอนโซล เพื่อสร้างค่าเหล่านี้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!") remoteConfig.activate { changed, error in // ... } } else { print("Config not fetched") print("Error: \(error?.localizedDescription ?? "No error available.")") } }
Objective-C
[remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) { if (status == FIRRemoteConfigFetchStatusSuccess) { NSLog(@"Config fetched!"); [remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) { if (error != nil) { NSLog(@"Activate error: %@", error.localizedDescription); } else { dispatch_async(dispatch_get_main_queue(), ^{ // update UI }); } }]; } else { NSLog(@"Config not fetched"); NSLog(@"Error %@", error.localizedDescription); } }];
เนื่องจากค่าพารามิเตอร์ที่อัปเดตเหล่านี้ส่งผลต่อลักษณะการทำงานและรูปลักษณ์ของแอป คุณจึงควรเปิดใช้งานค่าที่ดึงมาในเวลาที่รับประกันประสบการณ์การใช้งานที่ราบรื่นสำหรับผู้ใช้ เช่น ครั้งต่อไปที่ผู้ใช้เปิดแอป ดู กลยุทธ์การโหลดการกำหนดค่าระยะไกล สำหรับข้อมูลเพิ่มเติมและตัวอย่าง
ขั้นตอนที่ 6: รับฟังการอัปเดตแบบเรียลไทม์
หลังจากดึงค่าพารามิเตอร์แล้ว คุณสามารถใช้ Remote Config แบบเรียลไทม์เพื่อ รับฟังการอัปเดตจากแบ็กเอนด์ Remote Config เรียลไทม์ Remote Configจะส่งสัญญาณไปยังอุปกรณ์ที่เชื่อมต่อเมื่อมีการอัปเดต และ ดึงข้อมูลการเปลี่ยนแปลงโดยอัตโนมัติหลังจากที่คุณเผยแพร่Remote Config เวอร์ชันใหม่
SDK สำหรับแพลตฟอร์ม Apple เวอร์ชัน 10.7.0 ขึ้นไปรองรับการอัปเดตแบบเรียลไทม์ Firebase
ในแอป ให้เรียกใช้
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 เวอร์ชันใหม่ อุปกรณ์ ที่เรียกใช้แอปและรับฟังการเปลี่ยนแปลงจะเรียกใช้ Completion Handler
การควบคุม
หากแอปดึงข้อมูลหลายครั้งเกินไปในช่วงเวลาสั้นๆ ระบบจะควบคุมการเรียกใช้การดึงข้อมูลและ SDK จะแสดงผล
FIRRemoteConfigFetchStatusThrottled
ก่อน SDK เวอร์ชัน 6.3.0 ข้อจำกัดคือคำขอการดึงข้อมูล 5 รายการในระยะเวลา 60 นาที (เวอร์ชันใหม่กว่ามีข้อจำกัดที่ผ่อนปรนมากขึ้น)
ในระหว่างการพัฒนาแอป คุณอาจต้องการดึงข้อมูลบ่อยขึ้นเพื่อรีเฟรชแคชบ่อยมาก (หลายครั้งต่อชั่วโมง) เพื่อให้คุณทำซ้ำได้อย่างรวดเร็วขณะพัฒนาและทดสอบแอป การอัปเดต Remote Config แบบเรียลไทม์จะข้ามแคชโดยอัตโนมัติเมื่อมีการอัปเดตการกำหนดค่าระยะไกลในเซิร์ฟเวอร์ หากต้องการรองรับการทำซ้ำอย่างรวดเร็วในโปรเจ็กต์ที่มีนักพัฒนาแอปจำนวนมาก คุณสามารถเพิ่มพร็อพเพอร์ตี้ FIRRemoteConfigSettings ที่มีช่วงเวลาการดึงข้อมูลขั้นต่ำต่ำ (MinimumFetchInterval) ในแอปชั่วคราว
ช่วงเวลาการดึงข้อมูลเริ่มต้นและที่แนะนำสำหรับการใช้งานจริงของ Remote Config คือ 12 ชั่วโมง ซึ่งหมายความว่าระบบจะไม่ดึงข้อมูลการกำหนดค่าจากแบ็กเอนด์มากกว่า 1 ครั้งในระยะเวลา 12 ชั่วโมง ไม่ว่าจะมีคำขอการดึงข้อมูลกี่รายการก็ตาม โดยเฉพาะอย่างยิ่ง ระบบจะกำหนดช่วงเวลาการดึงข้อมูลขั้นต่ำตามลำดับต่อไปนี้
- พารามิเตอร์ใน
fetch(long) - พารามิเตอร์ใน
FIRRemoteConfigSettings.MinimumFetchInterval - ค่าเริ่มต้น 12 ชั่วโมง