【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種類となっています。
- String
- Boolean
- Number
- JSON
パラメータは最大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
にして保存します。
保存してもまだ公開はされていないので「変更を公開」をクリックすることで設定完了です。以降は「パラメータを追加」から新規作成をしていきます。
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」をダウンロードすることができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。