iOS で Firebase Remote Config を使ってみる

Firebase Remote Config を使ってアプリ内パラメータを定義し、その値をクラウドで更新することができます。これにより、アプリのアップデートを配布しなくてもアプリの外観や動作を変更できます。

このガイドでは、作業を開始するための手順について説明し、サンプルコードを示します(すべてのサンプルコードは firebase/quickstart-ios GitHub リポジトリからクローンを作成またはダウンロードできます)。

Remote Config をアプリに追加する

  1. iOS 用の Firebase SDK をインストールします。

  2. 次の例のとおり 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 ファイルを使用して、一連のパラメータ名とデフォルト パラメータ値を定義します。
  2. setDefaults: を使用して、これらの値を Remote Config オブジェクトに追加します。次の例では、plist ファイルからアプリ内デフォルト値を設定します。

Swift

remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")

Objective-C

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

アプリ内で使うパラメータ値を取得する

ここまでの手順で、パラメータ値を Remote Config オブジェクトから取得できるようになりました。後で Remote Config バックエンドに値を設定し、フェッチして有効化すると、それらの値をアプリで使用できるようになります。または、setDefaults: を使用して、構成したアプリ内パラメータ値を取得します。アプリ内パラメータ値を取得するには、configValueForKey: メソッドを呼び出します。このとき、引数としてパラメータキーを指定します。

パラメータ値を設定する

Firebase コンソールまたは Remote Config REST API を使用して、バックエンドの新しいデフォルト値を作成できます。このデフォルト値は、目的の条件付きロジックまたはユーザー ターゲティングに従って、アプリ内の値をオーバーライドします。このセクションでは、Firebase コンソールでこれらの値を作成するための手順を説明します。

  1. Firebase コンソールでプロジェクトを開きます。
  2. メニューから [Remote Config] を選択して Remote Config ダッシュボードを表示します。
  3. アプリで定義したパラメータと同じ名前のパラメータを定義します。それぞれのパラメータにデフォルト値を設定できます(最終的にはアプリ内デフォルト値をオーバーライドします)。また、条件値を設定することもできます。詳しくは Remote Config のパラメータと条件をご覧ください。

値をフェッチして有効にする

  1. Remote Config からパラメータ値をフェッチするには、fetchWithCompletionHandler: メソッドまたは fetchWithExpirationDuration:completionHandler: メソッドを呼び出します。バックエンドに設定したすべての値がフェッチされ、Remote Config オブジェクトにキャッシュ保存されます。
  2. フェッチ済みのパラメータ値をアプリで使用できるようにするには、activateFetched メソッドを呼び出します。

1 回の呼び出しで値をフェッチして有効化する場合は、fetchAndActivateWithCompletionHandler: を使用します。

この例では、キャッシュに保存された値の代わりに Remote Config バックエンドから値をフェッチし、それらの値をアプリで使用できるようにするために activateWithCompletionHandler: を呼び出します。

Swift

// TimeInterval is set to expirationDuration here, indicating the next fetch request will use
// data fetched from the Remote Config service, rather than cached parameter values, if cached
// parameter values are more than expirationDuration seconds old. See Best Practices in the
// README for more information.
remoteConfig.fetch(withExpirationDuration: TimeInterval(expirationDuration)) { (status, error) -> Void in
  if status == .success {
    print("Config fetched!")
    self.remoteConfig.activate(completionHandler: { (error) in
      // ...
    })
  } else {
    print("Config not fetched")
    print("Error: \(error?.localizedDescription ?? "No error available.")")
  }
  self.displayWelcome()
}

Objective-C

// TimeInterval is set to expirationDuration here, indicating the next fetch request will use
// data fetched from the Remote Config service, rather than cached parameter values, if cached
// parameter values are more than expirationDuration seconds old. See Best Practices in the
// README for more information.
[self.remoteConfig fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
    if (status == FIRRemoteConfigFetchStatusSuccess) {
        NSLog(@"Config fetched!");
      [self.remoteConfig activateWithCompletionHandler:^(NSError * _Nullable error) {
        // ...
      }];
    } else {
        NSLog(@"Config not fetched");
        NSLog(@"Error %@", error.localizedDescription);
    }
    [self displayWelcome];
}];

これらの更新されたパラメータ値はアプリの動作と外観に影響するので、スムーズなユーザー エクスペリエンスを実現するタイミング(次にユーザーがアプリを開いたときなど)でフェッチ済みの値を有効化する必要があります。詳細と例については、Remote Config の読み込み方法をご覧ください。

スロットル処理

アプリが短期間に何度もフェッチすると、フェッチ呼び出しが抑制され、SDK から FIRRemoteConfigFetchStatusThrottled が返されます。バージョン 6.3.0 よりも前の SDK では、フェッチ リクエストは 60 分間に 5 回までと制限されていました(新しいバージョンでは制限が緩和されています)。

アプリの開発中は、開発とテストを繰り返すためのイテレーションがすばやくできるように、頻繁なキャッシュの更新(1 時間に何度も)が必要となることがあります。多数のデベロッパーがいるプロジェクトで迅速なイテレーションに対応するには、アプリ内で最小フェッチ間隔(MinimumFetchInterval)を小さく設定した FIRRemoteConfigSettings プロパティを一時的に追加します。

Remote Config のデフォルトのフェッチ間隔は 12 時間であり、本番環境で推奨されるフェッチ間隔もこの値です。この場合、実際にフェッチ呼び出しが行われた回数に関係なく、12 時間の期間内で構成がバックエンドから複数回フェッチされることはありません。具体的には、次の順で最小フェッチ間隔が決定されます。

  1. fetch(long) のパラメータ
  2. FIRRemoteConfigSettings.MinimumFetchInterval のパラメータ
  3. デフォルト値(12 時間)

次のステップ

Remote Config のユースケースに関する詳細な情報が必要な方は、主要なコンセプトと高度な戦略に関する以下のドキュメントをご覧ください。