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

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


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

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

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

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

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

  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 เพื่อถอดรหัส 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

  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 สำหรับแพลตฟอร์ม Apple เวอร์ชัน 10.7.0 ขึ้นไปรองรับการอัปเดตแบบเรียลไทม์ Firebase

  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 เวอร์ชันใหม่ อุปกรณ์ ที่เรียกใช้แอปและรับฟังการเปลี่ยนแปลงจะเรียกใช้ Completion Handler

การควบคุม

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

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

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

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