เริ่มต้นใช้งานการกำหนดค่าระยะไกลของ Firebase


คุณใช้ Firebase Remote Config เพื่อกำหนดพารามิเตอร์ในแอปและ อัปเดตค่าในระบบคลาวด์ได้ ซึ่งจะช่วยให้คุณแก้ไขรูปลักษณ์และ ลักษณะการทำงานของแอปได้โดยไม่ต้องเผยแพร่การอัปเดตแอป คู่มือนี้จะแนะนำขั้นตอนการเริ่มต้นใช้งานและแสดงโค้ดตัวอย่าง ซึ่งทั้งหมดนี้พร้อมให้โคลนหรือดาวน์โหลดจากที่เก็บ firebase/quickstart-ios บน GitHub

ขั้นตอนที่ 1: เพิ่ม Remote Config ลงในแอป

  1. หากยังไม่ได้ดำเนินการ ให้เพิ่ม Firebase ในโปรเจ็กต์ Apple

  2. สําหรับ Remote Config Google Analytics ต้องใช้สําหรับ การกําหนดเป้าหมายแบบมีเงื่อนไขของอินสแตนซ์แอป ไปยังพร็อพเพอร์ตี้ผู้ใช้และกลุ่มเป้าหมาย ตรวจสอบว่าคุณได้ เปิดใช้ Google Analytics ในโปรเจ็กต์แล้ว

  3. สร้างออบเจ็กต์ 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 และเพื่อให้มีค่าเริ่มต้นในกรณีที่ไม่ได้ตั้งค่าใดๆ ในแบ็กเอนด์

  1. กำหนดชุดชื่อพารามิเตอร์และค่าพารามิเตอร์เริ่มต้นโดยใช้ออบเจ็กต์ 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 คอนโซล

    1. ในแท็บพารามิเตอร์ ให้เปิดเมนู แล้ว เลือกดาวน์โหลดค่าเริ่มต้น

    2. เมื่อได้รับข้อความแจ้ง ให้เปิดใช้ .plist สำหรับ iOS แล้วคลิกดาวน์โหลดไฟล์

  2. เพิ่มค่าเหล่านี้ลงในออบเจ็กต์ Remote Config โดยใช้ setDefaults: ตัวอย่างต่อไปนี้จะตั้งค่าเริ่มต้นในแอปจากไฟล์ plist

    Swift

    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ขั้นตอนในคอนโซลเพื่อสร้างค่าเหล่านี้

  1. เปิดโปรเจ็กต์ในคอนโซล Firebase
  2. เลือก Remote Config จากเมนูเพื่อดูRemote Config แดชบอร์ด
  3. กําหนดพารามิเตอร์ที่มีชื่อเดียวกับพารามิเตอร์ที่คุณกําหนดไว้ใน แอปของคุณ สําหรับพารามิเตอร์แต่ละรายการ คุณสามารถตั้งค่าเริ่มต้น (ซึ่งจะ ลบล้างค่าเริ่มต้นในแอปในที่สุด) และยังตั้งค่าแบบมีเงื่อนไขได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ Remote Config พารามิเตอร์และเงื่อนไข
  4. หากใช้เงื่อนไข สัญญาณที่กำหนดเอง ให้กำหนดแอตทริบิวต์และค่าของแอตทริบิวต์ ตัวอย่างต่อไปนี้แสดงวิธี กำหนดเงื่อนไขสัญญาณที่กำหนดเอง

    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 ขึ้นไปรองรับการอัปเดตแบบเรียลไทม์

  1. ในแอป ให้เรียกใช้ 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];
          });
        }];
      }
    }];
  2. ในครั้งถัดไปที่คุณเผยแพร่ Remote Config เวอร์ชันใหม่ อุปกรณ์ ที่เรียกใช้แอปและรอฟังการเปลี่ยนแปลงจะเรียกใช้ตัวแฮนเดิลการดำเนินการเสร็จสมบูรณ์

การควบคุม

หากแอปดึงข้อมูลหลายครั้งเกินไปในช่วงเวลาสั้นๆ ระบบจะจำกัดอัตราการเรียกดึงข้อมูลและ SDK จะแสดง FIRRemoteConfigFetchStatusThrottled ก่อน SDK เวอร์ชัน 6.3.0 ขีดจำกัดคือคำขอเรียกข้อมูล 5 รายการในหน้าต่าง 60 นาที (เวอร์ชันใหม่กว่ามีขีดจำกัดที่ผ่อนปรนมากกว่า)

ในระหว่างการพัฒนาแอป คุณอาจต้องการดึงข้อมูลบ่อยขึ้นเพื่อรีเฟรชแคช บ่อยมาก (หลายครั้งต่อชั่วโมง) เพื่อให้คุณทำซ้ำได้อย่างรวดเร็วขณะพัฒนา และทดสอบแอป การอัปเดต Remote Config แบบเรียลไทม์จะข้ามแคชโดยอัตโนมัติ เมื่อมีการอัปเดตการกำหนดค่าในเซิร์ฟเวอร์ หากต้องการรองรับการทำซ้ำอย่างรวดเร็ว ในโปรเจ็กต์ที่มีนักพัฒนาซอฟต์แวร์จำนวนมาก คุณสามารถเพิ่มFIRRemoteConfigSettingsพร็อพเพอร์ตี้ที่มีช่วงเวลาการดึงข้อมูลขั้นต่ำต่ำ (MinimumFetchInterval) ในแอปชั่วคราวได้

ช่วงเวลาการดึงข้อมูลการผลิตเริ่มต้นและที่แนะนำสำหรับ Remote Config คือ 12 ชั่วโมง ซึ่ง หมายความว่าระบบจะไม่ดึงข้อมูลการกำหนดค่าจากแบ็กเอนด์มากกว่า 1 ครั้งในกรอบเวลา 12 ชั่วโมง ไม่ว่าการเรียกดึงข้อมูลจะเกิดขึ้นจริงกี่ครั้งก็ตาม โดยเฉพาะอย่างยิ่ง ระบบจะกำหนด ช่วงเวลาการดึงข้อมูลขั้นต่ำตามลำดับต่อไปนี้

  1. พารามิเตอร์ใน fetch(long)
  2. พารามิเตอร์ใน FIRRemoteConfigSettings.MinimumFetchInterval
  3. ค่าเริ่มต้นคือ 12 ชั่วโมง

ขั้นตอนถัดไป

หากยังไม่ได้สำรวจ Remote Config กรณีการใช้งาน และดูเอกสารประกอบเกี่ยวกับแนวคิดหลักและกลยุทธ์ขั้นสูงบางส่วน ซึ่งรวมถึง