iOS पर Remote Config का इस्तेमाल शुरू करना

प्लैटफ़ॉर्म चुनें: iOS+ Android Web Flutter Unity C++


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

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

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

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

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

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

रिमोट कॉन्फ़िगरेशन 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. पैरामीटर टैब में, मेन्यू खोलें और डिफ़ॉल्ट वैल्यू डाउनलोड करें को चुनें.

    2. प्रॉम्प्ट मिलने पर, iOS के लिए .plist को चालू करें. इसके बाद, फ़ाइल डाउनलोड करें पर क्लिक करें.

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

    Swift

    RemoteConfig.remoteConfig().setDefaults(fromPlist: "RemoteConfigDefaults")

    Objective-C

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

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

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

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

  1. Firebase 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!")
    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);
  }
}];

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

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

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

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

थ्रॉटलिंग

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

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

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

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