【Swift/Firebase】Remote Configの使い方!強制アップデートなど

【Swift/Firebase】Remote Configの使い方!強制アップデートなど

この記事からわかること

  • Swift Firebase Remote Config とは?
  • 強制アップデートメンテナンスモードなどを実装する方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Googleが運営するモバイルサービスであるFirebaseの「Firebase Remote Config」を利用します。無料で使えるので登録しておいてください。

Firebase Remote Config

公式リファレンス:Firebase Remote Config

FirebaseのRemote ConfigはFirebase上に設定を設けることでアプリのアップデートを行わなくてもアプリの外観を変更できるようにすることができる機能です。例えばメンテナンスモードフラグをRemote Config上に用意しておき、アプリ側ではそのフラグごとに画面を用意しておきます。開発者の任意のタイミングでフラグを切り替えることでアプリ側の画面が切り替えられるようにする実装などが可能になります。

特徴

公式リファレンス:Remote Config のパラメータと条件

Remote Configではパラメータ(キー)と値のペアで設定を登録することができ、設定できる値のデータ型は以下の4種類となっています。

パラメータは最大2000個、最大500個の条件を指定することができます。パラメータキーの長さは最大 256 文字で、アンダースコアまたはアルファベット(A~Z、a~z)で始める必要があり、プロジェクト内のパラメータ値文字列の合計長は、1,000,000 文字以内にする必要があります。

導入方法

Remote Configを利用するためにはプロジェクトにFirebase自体の導入が必要です。この記事では割愛していますので以下の記事を参考にしてください。

プロジェクト内でRemote Configが扱えるようにSDKを入れていきます。今回はCocoa Podsを使用していきます。「PodFile」に以下を追加してpod installを実行します。

pod 'FirebaseRemoteConfig'

「AppDelegate.swift」に初期化コードを追記してセットアップは完了です。

import UIKit
import FirebaseCore // 追加

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure() // 追加
        return true
    }
}

使い方

まずはRemote Config上に設定を追加します。初めての追加であれば「構成を作成」をクリックすると以下のように設定を追加する画面が出てくるのでキーをmaintenance_flag、データ型をBool、デフォルト値をfalseにして保存します。

【Swift/Firebase】Remote Configの使い方!強制アップデートなど

保存してもまだ公開はされていないので「変更を公開」をクリックすることで設定完了です。以降は「パラメータを追加」から新規作成をしていきます。

【Swift/Firebase】Remote Configの使い方!強制アップデートなど

RemoteConfigインスタンスの生成

RemoteConfigを利用するためにはRemoteConfigインスタンスを生成します。このインスタンスでリモートサーバーから設定値の取得や設定、デフォルト値のセットなどを行います。

RemoteConfigインスタンスはremoteConfigメソッドを使用して取得します。最小フェッチ間隔はDEV環境であれば0を指定し、本番環境では数時間や数日など適切な値にしておく必要(後述)があります。

class RemoteConfigManager {
    
    private let remoteConfig: RemoteConfig
    init() {
        // RemoteConfigインスタンスを取得
        remoteConfig = RemoteConfig.remoteConfig()
        let settings = RemoteConfigSettings()
        // 最小フェッチ間隔 開発環境では0(制限なし)を指定
        settings.minimumFetchInterval = 0
        // 設定を反映
        remoteConfig.configSettings = settings
        // 次章で実装
        fetchRemoteConfig()
    }
}

SwiftでRemoteConfigの設定値を取得する

実際にサーバーに設定した値をアプリ内で取得するにはfetchメソッドを使用します。完了ハンドラーの引数からフェッチの成否を取得でき、成功していればactivateメソッドを使用して取得した設定値を有効にします。

/// リモートサーバーから最新の設定値を取得してremoteConfigインスタンスに反映
private func fetchRemoteConfig() {
    remoteConfig.fetch { [weak self] status, error in
        guard let self else { return }
        if status == .success {
            print("Config フェッチ成功")
            self.remoteConfig.activate(completion: nil)
        } else {
            print("Config フェッチ失敗")
            print("Error: \(error?.localizedDescription ?? "No error available.")")
        }
    }
}

実際の値を参照するにはRemoteConfigインスタンスからRemoteConfigに設定したキー値を使用して参照します。今回はBool型を指定したのでboolValueを使用します。

public var maintenanceFlag: AnyPublisher<Bool, Never> {
    _maintenanceFlag.eraseToAnyPublisher()
}
private var _maintenanceFlag = CurrentValueSubject<Bool, Never>(false)

public func applyMaintenanceFlag() {
    let maintenanceFlag = remoteConfig["maintenance_flag"].boolValue
    print("Remote Config Maintenance Flag: \(maintenanceFlag)")
    _maintenanceFlag.send(maintenanceFlag)
}

RemoteConfigの設定値の変化を観測する

RemoteConfigの設定値の変化を観測するにはaddOnConfigUpdateListenerを使用します。RemoteConfigの設定値に変化があるとリスナーが呼ばれupdatedKeys変化したキーを配列形式で取得することができます。

後は変化したタイミングで再度activateを実行して反映させ値を取得すればOKです。

private func observeRemoteConfig() {
    remoteConfig.addOnConfigUpdateListener { [weak self] configUpdate, error in
        guard let self else { return }
        guard let configUpdate, error == nil else {
            print("Error listening for config updates: \(error)")
            return
        }
        print("Updated keys: \(configUpdate.updatedKeys)")

        self.remoteConfig.activate(completion: nil)
        self.applyMaintenanceFlag()
    }
}

フェッチ間隔の設定

RemoteConfigから短期間の間に何度もフェッチを実行するとFIRRemoteConfigFetchStatusThrottledエラーが返されます。Remote Configのデフォルトフェッチ間隔は12時間に設定されており本番環境で推奨されるフェッチ間隔も12時間です。

前述した方法でフェッチ間隔は変更することができますが、基本的に変更せず開発環境でのみ変更することが推奨されています。

let settings = RemoteConfigSettings()
// 最小フェッチ間隔 開発環境では0(制限なし)を指定
settings.minimumFetchInterval = 0
// 設定を反映
remoteConfig.configSettings = settings

デフォルト値をアプリ内に設ける

RemoteConfigで設定したキーのデフォルト値はサーバー側でも設定できますが、未設定にしてアプリ側で設定することも可能です。iOSではデフォルト値設定用の「plist」ファイルを用意して読み込ませます

plistにはRemoteConfigのキーをKeyにデフォルト値を以下のように設定します。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>maintenance_flag</key>
	<true/>
    <key>maintenance_msg</key>
    <string>メンテナンス中...</string>
</dict>
</plist>

「plist」ファイルが作成できたらsetDefaults(fromPlist:)で対象のファイル名を指定すれば完了です。

init() {
    remoteConfig = RemoteConfig.remoteConfig()
    remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
}

デフォルト値をRemoteConfig側に設定済みであれば「パラメータを追加」の横にある4つのアイコンの一番右をクリックして「デフォルト値をダウンロード」を選択し、「.plist(iOS 用」を選択すれば設定済みのデフォルト値の「RemoteConfigDefaults.plist」をダウンロードすることができます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index