Firebase रिमोट कॉन्फ़िगरेशन का इस्तेमाल शुरू करना


अपने ऐप्लिकेशन में पैरामीटर तय करने और क्लाउड में उनकी वैल्यू अपडेट करने के लिए, Firebase Remote Config का इस्तेमाल किया जा सकता है. इससे, ऐप्लिकेशन का अपडेट डिस्ट्रिब्यूट किए बिना ही, ऐप्लिकेशन के लुक और काम करने के तरीके में बदलाव किया जा सकता है. इस गाइड में, शुरू करने के तरीके के बारे में बताया गया है. साथ ही, इसमें कुछ सैंपल कोड भी दिए गए हैं. इन सभी को firebase/quickstart-ios GitHub रिपॉजिटरी से क्लोन या डाउनलोड किया जा सकता है.

पहला चरण: अपने ऐप्लिकेशन में Remote Config जोड़ना

  1. अगर आपने पहले से ऐसा नहीं किया है, तो अपने Apple प्रोजेक्ट में Firebase जोड़ें.

  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 बैकएंड से अपडेट की गई पैरामीटर वैल्यू फ़ेच करने और यह कंट्रोल करने के लिए किया जाता है कि फ़ेच की गई वैल्यू आपके ऐप्लिकेशन के लिए कब उपलब्ध कराई जाएं.

डेवलपमेंट के दौरान, हमारा सुझाव है कि फ़ेच करने का कम से कम इंटरवल सेट करें. ज़्यादा जानकारी के लिए, थ्रॉटलिंग देखें.

दूसरा चरण: ऐप्लिकेशन में डिफ़ॉल्ट पैरामीटर वैल्यू सेट करना

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. जब आपसे कहा जाए, तब iOS के लिए .plist को चालू करें. इसके बाद, फ़ाइल डाउनलोड करें पर क्लिक करें.

  2. setDefaults: का इस्तेमाल करके, इन वैल्यू को Remote Config ऑब्जेक्ट में जोड़ें. यहां दिए गए उदाहरण में, plist फ़ाइल से ऐप्लिकेशन में मौजूद प्रॉडक्ट के लिए डिफ़ॉल्ट वैल्यू सेट की गई हैं:

    Swift

    remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")

    Objective-C

    [self.remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

तीसरा चरण: अपने ऐप्लिकेशन में इस्तेमाल करने के लिए पैरामीटर वैल्यू पाना

अब 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 का इस्तेमाल करना

ज़्यादा जटिल कॉन्फ़िगरेशन के लिए, Swift के Codable प्रोटोकॉल का इस्तेमाल करके 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 टेंप्लेट को मैनेज करने के लिए, साफ़ और पढ़ने में आसान कोड उपलब्ध कराएं.

SwiftUI में डिक्लेरेटिव कॉन्फ़िगरेशन के लिए प्रॉपर्टी रैपर का इस्तेमाल करना

प्रॉपर्टी रैपर, Swift की एक बेहतरीन सुविधा है. इसकी मदद से, प्रॉपर्टी के एलान में कस्टम व्यवहार जोड़ा जा सकता है. SwiftUI में, प्रॉपर्टी रैपर का इस्तेमाल, स्टेट, बाइंडिंग, और प्रॉपर्टी के अन्य व्यवहारों को मैनेज करने के लिए किया जाता है. ज़्यादा जानकारी के लिए, Swift Language Guide देखें.

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()
    }
  }
}

जब आपको SwiftUI में Remote Config वैल्यू को ऐक्सेस करने के लिए, डिक्लेरेटिव तरीके का इस्तेमाल करना हो, तब @RemoteConfigProperty प्रॉपर्टी रैपर का इस्तेमाल करें. इसमें डिफ़ॉल्ट वैल्यू के लिए पहले से मौजूद सपोर्ट और कॉन्फ़िगरेशन मैनेजमेंट को आसान बनाने की सुविधा होती है.

चौथा चरण: पैरामीटर वैल्यू सेट करना

Firebase कंसोल या Remote Config बैकएंड एपीआई का इस्तेमाल करके, बैकएंड की नई डिफ़ॉल्ट वैल्यू बनाई जा सकती हैं. ये वैल्यू, इन-ऐप्लिकेशन वैल्यू को बदल देती हैं. ऐसा, आपकी पसंद के मुताबिक शर्त के लॉजिक या उपयोगकर्ता टारगेटिंग के हिसाब से होता है. इस सेक्शन में, इन वैल्यू को बनाने के लिए 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!");
            }
      }];
    });

पांचवां चरण: वैल्यू को फ़ेच और ऐक्टिवेट करना

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);
    }
}];

अपडेट की गई पैरामीटर वैल्यू से, आपके ऐप्लिकेशन के व्यवहार और लुक पर असर पड़ता है. इसलिए, आपको फ़ेच की गई वैल्यू को ऐसे समय पर चालू करना चाहिए जिससे उपयोगकर्ता को बेहतर अनुभव मिले. जैसे, जब उपयोगकर्ता अगली बार आपका ऐप्लिकेशन खोले. ज़्यादा जानकारी और उदाहरणों के लिए, Remote Config की लोडिंग रणनीतियां देखें.

छठा चरण: रीयल टाइम में अपडेट सुनना

पैरामीटर वैल्यू फ़ेच करने के बाद, रीयल-टाइम Remote Config का इस्तेमाल करके, Remote Config बैकएंड से अपडेट सुने जा सकते हैं. अपडेट उपलब्ध होने पर, कनेक्ट किए गए डिवाइसों को रीयल-टाइम Remote Config सिग्नल भेजता है. साथ ही, Remote Config के नए वर्शन को पब्लिश करने के बाद, बदलावों को अपने-आप फ़ेच करता है.

रीयल-टाइम अपडेट की सुविधा, Apple प्लैटफ़ॉर्म के लिए Firebase SDK टूल के v10.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 का नया वर्शन पब्लिश किया जाएगा, तब आपके ऐप्लिकेशन को चलाने वाले और बदलावों को सुनने वाले डिवाइस, पूरा होने वाले हैंडलर को कॉल करेंगे.

थ्रॉटलिंग

अगर कोई ऐप्लिकेशन कम समय में कई बार फ़ेच करता है, तो फ़ेच करने के अनुरोधों को थ्रॉटल कर दिया जाता है. साथ ही, एसडीके FIRRemoteConfigFetchStatusThrottled दिखाता है. SDK टूल के 6.3.0 वर्शन से पहले, 60 मिनट की अवधि में फ़ेच करने के पांच अनुरोध किए जा सकते थे. हालांकि, नए वर्शन में यह सीमा ज़्यादा है.

ऐप्लिकेशन डेवलप करते समय, आपको कैश मेमोरी को बार-बार रीफ़्रेश करना पड़ सकता है. ऐसा इसलिए, ताकि आप ऐप्लिकेशन को डेवलप और टेस्ट करते समय, तेज़ी से बदलाव कर सकें. रीयल-टाइम Remote Config अपडेट होने पर, कैश मेमोरी अपने-आप बायपास हो जाती है. ऐसा तब होता है, जब सर्वर पर कॉन्फ़िगरेशन अपडेट किया जाता है. अगर किसी प्रोजेक्ट पर कई डेवलपर काम कर रहे हैं और आपको उसमें तेज़ी से बदलाव करने हैं, तो अपने ऐप्लिकेशन में कुछ समय के लिए FIRRemoteConfigSettings प्रॉपर्टी जोड़ें. इसमें कम से कम फ़ेच इंटरवल (MinimumFetchInterval) कम रखें.

Remote Config के लिए, प्रोडक्शन फ़ेच करने का डिफ़ॉल्ट और सुझाया गया इंटरवल 12 घंटे है. इसका मतलब है कि 12 घंटे की अवधि में, कॉन्फ़िगरेशन को बैकएंड से एक से ज़्यादा बार फ़ेच नहीं किया जाएगा. भले ही, फ़ेच करने के लिए कितने भी कॉल किए गए हों. खास तौर पर, फ़ेच करने का कम से कम इंटरवल इस क्रम में तय किया जाता है:

  1. fetch(long) में मौजूद पैरामीटर
  2. FIRRemoteConfigSettings.MinimumFetchInterval में मौजूद पैरामीटर
  3. डिफ़ॉल्ट वैल्यू 12 घंटे

अगले चरण

अगर आपने अभी तक ऐसा नहीं किया है, तो Remote Config इस्तेमाल के उदाहरण देखें. साथ ही, कुछ मुख्य कॉन्सेप्ट और बेहतर रणनीतियों से जुड़े दस्तावेज़ देखें. इनमें ये शामिल हैं: