iOS-এ রিমোট কনফিগ ব্যবহার করা শুরু করা

প্ল্যাটফর্ম বেছে নিন: 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 কনসোল

    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 ব্যবহার করা

আরও জটিল কনফিগারেশনের জন্য, আপনি Remote Config থেকে স্ট্রাকচার করা ডেটা ডিকোড করতে Swift-এর Codable প্রোটোকল ব্যবহার করতে পারেন। এটি টাইপ-সেফ কনফিগারেশন ম্যানেজমেন্ট প্রদান করে এবং জটিল অবজেক্টের সাথে কাজ করা সহজ করে তোলে।

// 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 গাইড দেখুন।

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 প্ল্যাটফর্ম v10.7.0+ ও এর পরের যেকোনও ভার্সনের জন্য Firebase SDK-তে রিয়েল-টাইম আপডেট কাজ করে।

  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-এর আগে, ৬০ মিনিটের উইন্ডোতে ৫টি ফেচ অনুরোধের সীমা ছিল (নতুন ভার্সনে আরও বেশি অনুমতিমূলক সীমা আছে)।

অ্যাপ ডেভেলপ করার সময়, আপনি হয়ত ক্যাশে রিফ্রেশ করার জন্য খুব ঘনঘন (প্রতি ঘণ্টায় অনেকবার) ডেটা ফেচ করতে চাইবেন, যাতে আপনি ডেভেলপ করার সাথে সাথে আপনার অ্যাপ দ্রুত ইটারেট করতে ও পরীক্ষা করতে পারেন। রিয়েল-টাইম রিমোট কনফিগার আপডেট, সার্ভারে কনফিগার আপডেট করা হলে অটোমেটিক ক্যাশে বাইপাস করে। প্রচুর ডেভেলপার সহ কোনও প্রজেক্টে দ্রুত ইটারেশনকে জায়গা করে দিতে, আপনার অ্যাপে কম ন্যূনতম ফেচ ইন্টারভ্যাল (MinimumFetchInterval) সহ সাময়িকভাবে একটি FIRRemoteConfigSettings প্রপার্টি যোগ করতে পারেন।

Remote Config-এর জন্য ডিফল্ট ও সাজেস্ট করা প্রোডাকশন ফেচ ইন্টারভ্যাল ১২ ঘণ্টা, যার অর্থ হল, ১২ ঘণ্টার উইন্ডোতে ব্যাকএন্ড থেকে একাধিকবার কনফিগারেশন ফেচ করা হবে না। আসলে কতবার ফেচ কল করা হয়েছে তা এর উপর নির্ভর করে না। বিশেষত, নিম্নলিখিত ক্রম অনুসারে ন্যূনতম ফেচ ইন্টারভ্যাল নির্ধারণ করা হয়:

  1. fetch(long)-এর প্যারামিটার
  2. FIRRemoteConfigSettings.MinimumFetchInterval-এর প্যারামিটার
  3. ১২ ঘণ্টার ডিফল্ট ভ্যালু