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

เลือกแพลตฟอร์ม iOS+ Android Web Flutter Unity C++


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

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

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

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

  3. สร้างออบเจ็กต์ Remote Config ซิงเกิลตัน ดังที่แสดงในตัวอย่างต่อไปนี้

    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 และเพื่อให้ค่าเริ่มต้นพร้อมใช้งานหากไม่ได้ตั้งค่าไว้ในแบ็กเอนด์

  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
    

    คุณสร้างโทเค็นสำหรับผู้ถือได้โดยเรียกใช้คำสั่งต่อไปนี้โดยใช้ Google Cloud CLI หรือ Cloud Shell

    gcloud auth print-access-token
    

    โทเค็นนี้มีอายุสั้น คุณจึงอาจต้องสร้างโทเค็นใหม่หากได้รับข้อผิดพลาดในการตรวจสอบสิทธิ์

    คอนโซล Firebase

    1. ในคอนโซล Firebase ให้ไปที่หน้า DevOps และการมีส่วนร่วม > การกำหนดค่าระยะไกล > พารามิเตอร์

    2. เปิด เมนู แล้วเลือกดาวน์โหลดค่าเริ่มต้น

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

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

    Swift

    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 เพื่อถอดรหัสข้อมูลที่มีโครงสร้างจาก 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 ที่มีโครงสร้าง

ใช้ Wrapper พร็อพเพอร์ตี้สำหรับการกำหนดค่าแบบประกาศใน SwiftUI

Property Wrapper เป็นฟีเจอร์ Swift ที่มีประสิทธิภาพซึ่งช่วยให้คุณเพิ่มลักษณะการทำงานที่กำหนดเองลงในการประกาศพร็อพเพอร์ตี้ได้ ใน SwiftUI จะใช้ 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()
    }
  }
}

ใช้ Wrapper พร็อพเพอร์ตี้ @RemoteConfigProperty เมื่อต้องการวิธีประกาศเพื่อเข้าถึงค่า Remote Config ใน SwiftUI พร้อมการรองรับค่าเริ่มต้นในตัวและการจัดการการกำหนดค่าที่ง่ายขึ้น

ขั้นตอนที่ 4: ตั้งค่าพารามิเตอร์

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

  1. ในคอนโซล Firebase ให้ไปที่หน้า DevOps และการมีส่วนร่วม > การกำหนดค่าระยะไกล > พารามิเตอร์

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

  3. หากใช้เงื่อนไขสัญญาณที่กำหนดเอง ให้กำหนดแอตทริบิวต์และค่าของแอตทริบิวต์ ตัวอย่างต่อไปนี้แสดงวิธีกำหนดเงื่อนไขสัญญาณที่กำหนดเอง

    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 ของ Firebase สำหรับแพลตฟอร์ม 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 นาที (เวอร์ชันใหม่กว่ามีขีดจำกัดที่ผ่อนปรนมากกว่า)

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

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

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