شروع کار با Remote Config در iOS

انتخاب پلتفرم: iOS+ اندروید وب فلاتر یونیتی سی پلاس پلاس


شما می‌توانید از Firebase Remote Config برای تعریف پارامترها در برنامه خود و به‌روزرسانی مقادیر آنها در فضای ابری استفاده کنید، که به شما امکان می‌دهد ظاهر و رفتار برنامه خود را بدون توزیع به‌روزرسانی برنامه تغییر دهید. این راهنما مراحل شروع کار را برای شما شرح می‌دهد و چند نمونه کد ارائه می‌دهد که همه آنها برای کلون کردن یا دانلود از مخزن گیت‌هاب firebase/quickstart-ios در دسترس هستند.

مرحله ۱: Remote Config به برنامه خود اضافه کنید

  1. اگر هنوز Firebase را به پروژه اپل خود اضافه نکرده‌اید، آن را اضافه کنید .

  2. برای Remote Config ، Google Analytics برای هدف‌گیری مشروط نمونه‌های برنامه به ویژگی‌های کاربر و مخاطبان مورد نیاز است. مطمئن شوید که Google Analytics در پروژه خود فعال کرده‌اید .

  3. شیء singleton Remote Config را همانطور که در مثال زیر نشان داده شده است، ایجاد کنید:

    سویفت

    let remoteConfig = RemoteConfig.remoteConfig()
    let settings = RemoteConfigSettings()
    settings.minimumFetchInterval = 0
    RemoteConfig.remoteConfig().configSettings = settings

    هدف-سی

    FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
    FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
    remoteConfigSettings.minimumFetchInterval = 0;
    remoteConfig.configSettings = remoteConfigSettings;

این شیء برای ذخیره مقادیر پیش‌فرض پارامترها در برنامه، دریافت مقادیر به‌روزرسانی‌شده پارامترها از Remote Config backend و کنترل زمان در دسترس قرار گرفتن مقادیر دریافتی برای برنامه شما استفاده می‌شود.

در طول توسعه، توصیه می‌شود حداقل فاصله زمانی واکشی نسبتاً کمی تنظیم شود. برای اطلاعات بیشتر به بخش تنظیم فشار (Throttling) مراجعه کنید.

مرحله ۲: تنظیم مقادیر پیش‌فرض پارامترها در برنامه

شما می‌توانید مقادیر پیش‌فرض پارامترهای درون‌برنامه‌ای را در شیء Remote Config تنظیم کنید، به طوری که برنامه شما قبل از اتصال به Remote Config backend طبق انتظار رفتار کند، و اگر هیچ مقداری در backend تنظیم نشده باشد، مقادیر پیش‌فرض در دسترس باشند.

  1. مجموعه‌ای از نام پارامترها و مقادیر پیش‌فرض پارامترها را با استفاده از یک شیء NSDictionary یا یک فایل plist تعریف کنید.

    اگر قبلاً مقادیر پارامترهای backend Remote Config را پیکربندی کرده‌اید، می‌توانید یک فایل plist تولید شده که شامل تمام مقادیر پیش‌فرض است را دانلود کرده و آن را در پروژه Xcode خود ذخیره کنید.

    استراحت

    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
    

    شما می‌توانید با اجرای دستور زیر با استفاده از رابط خط فرمان گوگل کلود یا کلود شل، یک توکن حامل ایجاد کنید:

    gcloud auth print-access-token
    

    این توکن کوتاه‌مدت است، بنابراین اگر با خطای احراز هویت مواجه شدید، ممکن است نیاز به تولید مجدد آن داشته باشید.

    کنسول Firebase

    1. در برگه پارامترها ، منوی را باز کنید و گزینه دانلود مقادیر پیش‌فرض را انتخاب کنید.

    2. وقتی از شما خواسته شد، فایل ‎.plist را برای iOS فعال کنید، سپس روی دانلود فایل کلیک کنید.

  2. این مقادیر را با استفاده از setDefaults: به شیء Remote Config اضافه کنید. مثال زیر مقادیر پیش‌فرض درون برنامه را از یک فایل plist تنظیم می‌کند:

    سویفت

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

    هدف-سی

    [remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

مرحله ۳: دریافت مقادیر پارامترها برای استفاده در برنامه

اکنون می‌توانید مقادیر پارامترها را از شیء Remote Config دریافت کنید. اگر بعداً مقادیری را در backend 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

یک راه خواناتر و راحت‌تر برای دسترسی به این مقادیر در سوئیفت، از طریق نمادگذاری زیرنویس سوئیفت است:

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 سوئیفت برای رمزگشایی داده‌های ساختاریافته از 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

بسته‌بندی‌های ویژگی (property wrappers) یک ویژگی قدرتمند سوئیفت هستند که به شما امکان می‌دهند رفتار سفارشی را به اعلان‌های ویژگی اضافه کنید. در SwiftUI، از بسته‌بندی‌های ویژگی برای مدیریت حالت، اتصال‌ها و سایر رفتارهای ویژگی استفاده می‌شود. برای اطلاعات بیشتر، به راهنمای زبان سوئیفت مراجعه کنید.

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

وقتی می‌خواهید به روشی اعلانی به مقادیر Remote Config در SwiftUI دسترسی داشته باشید، از پوشش ویژگی @RemoteConfigProperty استفاده کنید، به طوری که از مقادیر پیش‌فرض پشتیبانی داخلی داشته باشد و مدیریت پیکربندی ساده شده باشد.

مرحله ۴: تنظیم مقادیر پارامترها

با استفاده از کنسول Firebase یا APIهای Backend مربوط به Remote Config ، می‌توانید مقادیر پیش‌فرض جدیدی در Backend ایجاد کنید که مقادیر درون برنامه‌ای را مطابق با منطق شرطی یا هدف‌گیری کاربر مورد نظر شما لغو می‌کنند. این بخش شما را در مراحل ایجاد این مقادیر در کنسول Firebase راهنمایی می‌کند.

  1. در کنسول Firebase ، پروژه خود را باز کنید.
  2. برای مشاهده داشبورد Remote Config از منو Remote Config را انتخاب کنید.
  3. پارامترهایی را با همان نام پارامترهایی که در برنامه خود تعریف کرده‌اید، تعریف کنید. برای هر پارامتر، می‌توانید یک مقدار پیش‌فرض تنظیم کنید (که در نهایت مقدار پیش‌فرض درون برنامه را لغو می‌کند) و همچنین می‌توانید مقادیر شرطی تنظیم کنید. برای کسب اطلاعات بیشتر، به بخش پارامترها و شرایط Remote Config مراجعه کنید.
  4. در صورت استفاده از شرایط سیگنال سفارشی ، ویژگی‌ها و مقادیر آنها را تعریف کنید. مثال‌های زیر نحوه تعریف یک شرایط سیگنال سفارشی را نشان می‌دهند.

    سویفت

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

    هدف-سی

        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: را فراخوانی کنید. هر مقداری که در backend تنظیم کنید، در شیء Remote Config دریافت و ذخیره می‌شود.

برای مواردی که می‌خواهید مقادیر را در یک فراخوانی دریافت و فعال کنید، fetchAndActivateWithCompletionHandler:

این مثال مقادیر را از بک‌اند Remote Config (نه مقادیر ذخیره‌شده در حافظه پنهان) دریافت می‌کند و تابع activateWithCompletionHandler: را فراخوانی می‌کند تا آنها را در دسترس برنامه قرار دهد:

سویفت

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.")")
  }
}

هدف-سی

[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 به صورت بلادرنگ، هنگامی که به‌روزرسانی‌ها در دسترس باشند، به دستگاه‌های متصل سیگنال می‌دهد و پس از انتشار نسخه جدید Remote Config ، تغییرات را به طور خودکار دریافت می‌کند.

به‌روزرسانی‌های بلادرنگ توسط Firebase SDK برای پلتفرم‌های Apple نسخه ۱۰.۷.۰+ و بالاتر پشتیبانی می‌شوند.

  1. در برنامه خود، addOnConfigUpdateListener را فراخوانی کنید تا شروع به گوش دادن به به‌روزرسانی‌ها کند و به طور خودکار هر مقدار پارامتر جدید یا به‌روزرسانی‌شده را دریافت کند. مثال زیر به به‌روزرسانی‌ها گوش می‌دهد و هنگامی که activateWithCompletionHandler فراخوانی می‌شود، از مقادیر تازه دریافت‌شده برای نمایش یک پیام خوش‌آمدگویی به‌روزرسانی‌شده استفاده می‌کند.

    سویفت

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

    هدف-سی

    __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 را فراخوانی می‌کنند.

تنظیم سرعت

اگر یک برنامه در یک بازه زمانی کوتاه، تعداد زیادی درخواست واکشی (fetch) داشته باشد، فراخوانی‌های واکشی محدود می‌شوند و SDK مقدار FIRRemoteConfigFetchStatusThrottled برمی‌گرداند. قبل از نسخه 6.3.0 SDK، محدودیت 5 درخواست واکشی در یک پنجره 60 دقیقه‌ای بود (نسخه‌های جدیدتر محدودیت‌های مجازتری دارند).

در طول توسعه برنامه، ممکن است بخواهید بیشتر اوقات (چندین بار در ساعت) کش را فچ کنید تا بتوانید به سرعت در حین توسعه و آزمایش برنامه خود، آن را به‌روزرسانی کنید. به‌روزرسانی‌های Remote Config در لحظه، هنگام به‌روزرسانی پیکربندی روی سرور، به طور خودکار از کش عبور می‌کنند. برای تطبیق با تکرار سریع در یک پروژه با توسعه‌دهندگان متعدد، می‌توانید به طور موقت یک ویژگی FIRRemoteConfigSettings با حداقل فاصله فچ پایین ( MinimumFetchInterval ) در برنامه خود اضافه کنید.

فاصله زمانی پیش‌فرض و توصیه‌شده برای Remote Config عملیاتی، ۱۲ ساعت است، به این معنی که پیکربندی‌ها بیش از یک بار در یک بازه زمانی ۱۲ ساعته از بک‌اند واکشی نمی‌شوند، صرف نظر از اینکه در واقع چند فراخوانی واکشی انجام شده است. به طور خاص، حداقل فاصله زمانی واکشی به ترتیب زیر تعیین می‌شود:

  1. پارامتر در fetch(long)
  2. پارامتر موجود در FIRRemoteConfigSettings.MinimumFetchInterval
  3. مقدار پیش‌فرض ۱۲ ساعت