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

प्लैटफ़ॉर्म चुनें: iOS+ Android वेब 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 console

    1. Firebase कंसोल में, DevOps और यूज़र ऐक्टिविटी > रिमोट कॉन्फ़िगरेशन > पैरामीटर पेज पर जाएं.

    2. मेन्यू खोलें और डिफ़ॉल्ट वैल्यू डाउनलोड करें को चुनें.

    3. जब कहा जाए, तब iOS के लिए .plist को चालू करें. इसके बाद, फ़ाइल डाउनलोड करें पर क्लिक करें.

  2. setDefaults: का इस्तेमाल करके, इन वैल्यू को Remote Config ऑब्जेक्ट में जोड़ें. यहां दिए गए उदाहरण में, 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()
    }
  }
}

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

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

Firebase कंसोल या 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!");
              }
        }];
    });

पांचवां चरण: वैल्यू फ़ेच करना और उन्हें चालू करना

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 का नया वर्शन पब्लिश करने के बाद, बदलावों को अपने-आप फ़ेच करता है.

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

थ्रॉटलिंग

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

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

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

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