FirebaseRemoteConfigのパラメータキーが存在しない場合の注意点

# はじめに
[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 5日目担当の[@kyorokyoro](https://qiita.com/kyorokyoro)です。
主にUnityを使用した開発をしております。
4日目は[@ayany0_zzZ](https://qiita.com/ayany0_zzZ)さんの[快適なデスクワークのために！ハッピーライフハック5選！](https://qiita.com/ayany0_zzZ/private/fcf6fedb41d403b5b6fb)でした。
是非こちらも合わせてご覧ください！

# 概要
FirebaseのRemoteConfigからFirebaseコンソール上で設定した値や、A/Bテストでユーザーごとに異なる値を取得することができます。
その値はパラメータキーから取得するのですが、コンソールの設定より先にアプリ側の実装をした際やコンソールからRemoteConfigが削除された場合など、存在しないパラメータキーを取得しようとした際の情報がなかったのでまとめました。

# 準備
### RemoteConfigの取得
起動時にRemoteConfigを取得してRemoteConfigManagerに保存する。
```起動時クラス.cs
/// <summary>
/// FirebaseRemoteConfig取得.
/// </summary>
private void RemoteConfig()
{
    FirebaseRemoteConfig remoteConfig;
    remoteConfig = FirebaseRemoteConfig.DefaultInstance;
    remoteConfig.FetchAsync(TimeSpan.Zero).ContinueWithOnMainThread(task =>
    {
        var info = FirebaseRemoteConfig.DefaultInstance.Info;
        switch (info.LastFetchStatus)
        {
            case LastFetchStatus.Success:
                FirebaseRemoteConfig.DefaultInstance.ActivateAsync()
                .ContinueWithOnMainThread(task => {
                    // RemoteConfigManagerに保存
                    remoteConfigManager.SetRemoteConfig(remoteConfig);
                });
                break;
        }
    });
}
```
```RemoteConfigManager.cs
using System;
using Firebase.RemoteConfig;
using UnityEngine;

/// <summary>
/// RemoteConfig用マネージャークラス.
/// </summary>
public class RemoteConfigManager : MonoBehaviour
{
    private FirebaseRemoteConfig remoteConfig;

    /// <summary>
    /// FirebaseRemoteConfigのセット.
    /// </summary>
    /// <param name="remoteConfig">remoteConfig</param>
    public void SetRemoteConfig(FirebaseRemoteConfig remoteConfig)
    {
        this.remoteConfig = remoteConfig;
    }
}
```

# パラメータ値の取得
### bool型
存在しないキー時の値：**false**
デフォルト値をあわせてfalseにしておくとよい。
```RemoteConfigManager.cs
        /// <summary>
        /// パラメータキーからbool値を取得.
        /// </summary>
        /// <param name="key">パラメータキー</param>
        /// <returns>FirebaseRemoteConfigが未取得の場合はfalse 存在しないパラメータキーもfalse</returns>
        public bool GetBooleanValue(string key)
        {
            if (remoteConfig == null)
            {
                return false;
            }

            return remoteConfig.GetValue(key).BooleanValue;
        }
```

### string型
存在しないキー時の値：**空文字**
デフォルト値をあわせて空文字にしておくとよい。
```RemoteConfigManager.cs
        /// <summary>
        /// パラメータキーからstring値を取得.
        /// </summary>
        /// <param name="key">パラメータキー</param>
        /// <returns>FirebaseRemoteConfigが未取得の場合はstring.Empty 存在しないパラメータキーもfalse</returns>
        public string GetStringValue(string key)
        {
            if (remoteConfig == null)
            {
                return string.Empty;
            }

            return remoteConfig.GetValue(key).StringValue;
        }

```
### double,long型
存在しないキー時の値：**FormatException: Input string was not in a correct format.(入力文字列の形式が正しくありません。)**
数値が取得できないため値をそのまま使用するとエラーになってしまうので注意。
try-catchを使用してエラー時は特定の値を返すようにする。

```RemoteConfigManager.cs
        /// <summary>
        /// パラメータキーからdouble値を取得.
        /// </summary>
        /// <param name="key">パラメータキー</param>
        /// <returns>FirebaseRemoteConfigが未取得の場合は0 存在しないパラメータキーも0</returns>
        public double GetDoubleValue(string key)
        {
            if (remoteConfig == null)
            {
                return 0;
            }

            try
            {
                return remoteConfig.GetValue(key).DoubleValue;
            }
            catch (Exception e)
            {
                return 0;
            }
        }

        /// <summary>
        /// パラメータキーからlong値を取得.
        /// </summary>
        /// <param name="key">パラメータキー</param>
        /// <returns>FirebaseRemoteConfigが未取得の場合は0 存在しないパラメータキーも0</returns>
        public long GetLongValue(string key)
        {
            if (remoteConfig == null)
            {
                return 0;
            }

            try
            {
                return remoteConfig.GetValue(key).LongValue;
            }
            catch (Exception e)
            {
                return 0;
            }
        }
```


## 最後に
double,long型を使用する際は実装時は正常に動作していてもコンソールから削除など外部要因でエラーになりますので気をつけましょう。

6日目は[@gumita](https://qiita.com/gumita)さんの [初めてのUnrealEngine5](https://qiita.com/gumita/private/ef6f236d74f00ef99b17) です。
お楽しみに。