「Unity/Firebase/RemoteConfig」の版間の差分
(→Helloworld) |
(→FetchComplete内でUI操作ができない問題) |
||
(同じ利用者による、間の39版が非表示) | |||
行1: | 行1: | ||
− | == | + | ==Firebase設定== |
− | + | [[unity/Firebase/基本]] [ショートカット] | |
− | == | + | ==RemoteConfigインストール== |
FirebaseRemoteConfig.unitypackageをAssets/Importからインストールする | FirebaseRemoteConfig.unitypackageをAssets/Importからインストールする | ||
+ | |||
+ | デフォルトで12時間アプリ内にキャッシュする | ||
+ | |||
+ | 一度取得したものはキャッシュ時間0sであっても次回用に保持する。 | ||
==Helloworld== | ==Helloworld== | ||
行10: | 行14: | ||
<pre> | <pre> | ||
− | System.Collections | + | use System.Collections; |
− | + | Dictionary<string, object> defaults = new Dictionary<string, object>(); | |
− | + | ||
− | + | ||
− | + | ||
defaults.Add("propertyname_string", "default local string"); | defaults.Add("propertyname_string", "default local string"); | ||
defaults.Add("propertyname_int", 1); | defaults.Add("propertyname_int", 1); | ||
defaults.Add("propertyname_float", 1.0); | defaults.Add("propertyname_float", 1.0); | ||
defaults.Add("propertyname_bool", false); | defaults.Add("propertyname_bool", false); | ||
− | |||
Firebase.RemoteConfig.FirebaseRemoteConfig.SetDefaults(defaults); | Firebase.RemoteConfig.FirebaseRemoteConfig.SetDefaults(defaults); | ||
</pre> | </pre> | ||
− | + | *SetDefaultsでの値はfirebaseからの取得した値が消えるとこのdefault値が使われる。 | |
− | error CS0305: Using the generic type 'Dictionary<TKey, TValue>' requires 2 type | + | *firebaseから取得した値の後にこのSetDefaultsを入れても値の上書きはされない。 |
+ | |||
+ | ==error CS0305: Using the generic type 'Dictionary<TKey, TValue>' requires 2 type argumentsエラー== | ||
+ | Dictionary defaults 部分で、error CS0305: Using the generic type 'Dictionary<TKey, TValue>' requires 2 type argumentsエラーがでる。 | ||
+ | <pre> | ||
+ | -System.Collections.Generic.Dictionary defaults = new System.Collections.Generic.Dictionary(); | ||
+ | +use System.Collections; | ||
+ | +Dictionary<string, object> defaults = new Dictionary<string, object>(); | ||
+ | </pre> | ||
+ | |||
+ | ==ローカルで値取得== | ||
+ | <pre> | ||
+ | Dictionary<string, object> defaults = new Dictionary<string, object>(); | ||
+ | defaults.Add("propertyname_string", "default local string"); | ||
+ | Debug.Log("hoge=" + Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("propertyname_string").StringValue); // default local string | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | ==firebase側値取得== | ||
+ | firebase1=hogehoge をfirebaseのRemoteConfigに登録しておく | ||
+ | <pre> | ||
+ | using System.Threading.Tasks; | ||
+ | using System; | ||
+ | void Start() | ||
+ | { | ||
+ | Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(0)); // cache時間0秒としている。 | ||
+ | fetchTask.ContinueWith(Firebase1FetchComplete); | ||
+ | } | ||
+ | void Firebase1FetchComplete(Task fetchTask) | ||
+ | { | ||
+ | switch (Firebase.RemoteConfig.FirebaseRemoteConfig.Info.LastFetchStatus) | ||
+ | { | ||
+ | case Firebase.RemoteConfig.LastFetchStatus.Success: | ||
+ | Firebase.RemoteConfig.FirebaseRemoteConfig.ActivateFetched(); | ||
+ | Debug.Log("firebase1=" + Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("firebase1").StringValue); // hogehoge | ||
+ | break; | ||
+ | case Firebase.RemoteConfig.LastFetchStatus.Failure: | ||
+ | switch (Firebase.RemoteConfig.FirebaseRemoteConfig.Info.LastFetchFailureReason) | ||
+ | { | ||
+ | case Firebase.RemoteConfig.FetchFailureReason.Error: | ||
+ | Debug.Log("Fetch failed for unknown reason"); | ||
+ | break; | ||
+ | case Firebase.RemoteConfig.FetchFailureReason.Throttled: | ||
+ | Debug.Log("Fetch throttled until " + | ||
+ | Firebase.RemoteConfig.FirebaseRemoteConfig.Info.ThrottledEndTime); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case Firebase.RemoteConfig.LastFetchStatus.Pending: | ||
+ | Debug.Log("Latest Fetch call still pending."); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | 参考: | ||
+ | https://qiita.com/wapa5pow/items/04edd95d312ee27f1da8 | ||
+ | |||
+ | ==FetchAsyncキャッシュ時間== | ||
+ | Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(600000000)); // cache時間60秒となる。 | ||
+ | |||
+ | TimeSpanに入れる引数は100nsっぽい。 | ||
+ | |||
+ | https://docs.microsoft.com/ja-jp/dotnet/api/system.timespan.-ctor?view=netframework-4.0 | ||
+ | |||
+ | キャッシュが切れてもSetDefaultで設定した値には戻らず、受け取った値は残り続け参照時呼び出される。 | ||
+ | |||
+ | ==FetchComplete内でUI操作ができない問題== | ||
+ | using System.Threading.Tasks; | ||
+ | TaskScheduler.FromCurrentSynchronizationContext()を第二引数に追加するとFetchCompleteがUIスレッドとなる。 | ||
+ | <pre> | ||
+ | Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(3600 * 10000000)); // 1h cache | ||
+ | fetchTask.ContinueWith(FirebaseFetchComplete, TaskScheduler.FromCurrentSynchronizationContext()); | ||
+ | |||
+ | void FirebaseFetchComplete(Task fetchTask) | ||
+ | { | ||
+ | GameObject.Find("AdUnitIdText").GetComponent<Text>().text = "hogehoge"; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | 参考:https://stackoverflow.com/questions/4331262/task-continuation-on-ui-thread | ||
+ | |||
+ | ==開発モード== | ||
+ | var settings = Firebase.RemoteConfig.FirebaseRemoteConfig.Settings; | ||
+ | settings.IsDeveloperMode = true; | ||
+ | Firebase.RemoteConfig.FirebaseRemoteConfig.Settings = settings; | ||
+ | |||
+ | 開発モードにすると最大10人まで以下制約は解除される。 | ||
+ | fetchAsyncを0秒としても、1時間以内でfetch回数は5回までと制限される。 | ||
+ | Fetch throttled until 6/5/2019 3:51:37 | ||
+ | |||
+ | 開発モードをonにしてもFetchAsyncのキャッシュ時間が守られるものと守られないosがある。 | ||
+ | |||
+ | cacehを1分にした時の例 | ||
+ | *developer_mode off | ||
+ | android 1分 | ||
+ | iOS 1分 | ||
+ | preview 1分 | ||
+ | |||
+ | *developer_mode on | ||
+ | android 即反映 | ||
+ | iOS 1分 | ||
+ | preview 1分 | ||
+ | |||
+ | 参考:https://qiita.com/hinom77/items/185fd4d2abde370a90c7 | ||
+ | |||
+ | 参考:https://firebase.google.com/docs/remote-config/android | ||
+ | |||
+ | ==keyリスト取得== | ||
+ | IEnumerable<string> keys = Firebase.RemoteConfig.FirebaseRemoteConfig.GetKeysByPrefix("propertyname"); | ||
+ | foreach (string key in keys) { | ||
+ | Debug.Log("key=" + key); | ||
+ | } | ||
+ | |||
+ | ==RemoteConfigの条件のユーザーランダムについて== | ||
+ | 実機だとこの条件が有効になる。Unity上のプレビューだとdefault値が帰ってきた。 | ||
+ | |||
+ | ==firebase公式RemoteConfigメソッド== | ||
+ | https://firebase.google.com/docs/reference/unity/struct/firebase/remote-config/config-value.html?hl=ja#struct_firebase_1_1_remote_config_1_1_config_value |
2019年7月20日 (土) 01:25時点における最新版
目次
Firebase設定
unity/Firebase/基本 [ショートカット]
RemoteConfigインストール
FirebaseRemoteConfig.unitypackageをAssets/Importからインストールする
デフォルトで12時間アプリ内にキャッシュする
一度取得したものはキャッシュ時間0sであっても次回用に保持する。
Helloworld
公式 https://firebase.google.com/docs/remote-config/use-config-unity?hl=ja
use System.Collections; Dictionary<string, object> defaults = new Dictionary<string, object>(); defaults.Add("propertyname_string", "default local string"); defaults.Add("propertyname_int", 1); defaults.Add("propertyname_float", 1.0); defaults.Add("propertyname_bool", false); Firebase.RemoteConfig.FirebaseRemoteConfig.SetDefaults(defaults);
- SetDefaultsでの値はfirebaseからの取得した値が消えるとこのdefault値が使われる。
- firebaseから取得した値の後にこのSetDefaultsを入れても値の上書きはされない。
error CS0305: Using the generic type 'Dictionary<TKey, TValue>' requires 2 type argumentsエラー
Dictionary defaults 部分で、error CS0305: Using the generic type 'Dictionary<TKey, TValue>' requires 2 type argumentsエラーがでる。
-System.Collections.Generic.Dictionary defaults = new System.Collections.Generic.Dictionary(); +use System.Collections; +Dictionary<string, object> defaults = new Dictionary<string, object>();
ローカルで値取得
Dictionary<string, object> defaults = new Dictionary<string, object>(); defaults.Add("propertyname_string", "default local string"); Debug.Log("hoge=" + Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("propertyname_string").StringValue); // default local string
firebase側値取得
firebase1=hogehoge をfirebaseのRemoteConfigに登録しておく
using System.Threading.Tasks; using System; void Start() { Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(0)); // cache時間0秒としている。 fetchTask.ContinueWith(Firebase1FetchComplete); } void Firebase1FetchComplete(Task fetchTask) { switch (Firebase.RemoteConfig.FirebaseRemoteConfig.Info.LastFetchStatus) { case Firebase.RemoteConfig.LastFetchStatus.Success: Firebase.RemoteConfig.FirebaseRemoteConfig.ActivateFetched(); Debug.Log("firebase1=" + Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("firebase1").StringValue); // hogehoge break; case Firebase.RemoteConfig.LastFetchStatus.Failure: switch (Firebase.RemoteConfig.FirebaseRemoteConfig.Info.LastFetchFailureReason) { case Firebase.RemoteConfig.FetchFailureReason.Error: Debug.Log("Fetch failed for unknown reason"); break; case Firebase.RemoteConfig.FetchFailureReason.Throttled: Debug.Log("Fetch throttled until " + Firebase.RemoteConfig.FirebaseRemoteConfig.Info.ThrottledEndTime); break; } break; case Firebase.RemoteConfig.LastFetchStatus.Pending: Debug.Log("Latest Fetch call still pending."); break; } }
参考: https://qiita.com/wapa5pow/items/04edd95d312ee27f1da8
FetchAsyncキャッシュ時間
Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(600000000)); // cache時間60秒となる。
TimeSpanに入れる引数は100nsっぽい。
https://docs.microsoft.com/ja-jp/dotnet/api/system.timespan.-ctor?view=netframework-4.0
キャッシュが切れてもSetDefaultで設定した値には戻らず、受け取った値は残り続け参照時呼び出される。
FetchComplete内でUI操作ができない問題
using System.Threading.Tasks; TaskScheduler.FromCurrentSynchronizationContext()を第二引数に追加するとFetchCompleteがUIスレッドとなる。
Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(new TimeSpan(3600 * 10000000)); // 1h cache fetchTask.ContinueWith(FirebaseFetchComplete, TaskScheduler.FromCurrentSynchronizationContext()); void FirebaseFetchComplete(Task fetchTask) { GameObject.Find("AdUnitIdText").GetComponent<Text>().text = "hogehoge"; }
参考:https://stackoverflow.com/questions/4331262/task-continuation-on-ui-thread
開発モード
var settings = Firebase.RemoteConfig.FirebaseRemoteConfig.Settings; settings.IsDeveloperMode = true; Firebase.RemoteConfig.FirebaseRemoteConfig.Settings = settings;
開発モードにすると最大10人まで以下制約は解除される。
fetchAsyncを0秒としても、1時間以内でfetch回数は5回までと制限される。 Fetch throttled until 6/5/2019 3:51:37
開発モードをonにしてもFetchAsyncのキャッシュ時間が守られるものと守られないosがある。
cacehを1分にした時の例
- developer_mode off
android 1分 iOS 1分 preview 1分
- developer_mode on
android 即反映 iOS 1分 preview 1分
参考:https://qiita.com/hinom77/items/185fd4d2abde370a90c7
参考:https://firebase.google.com/docs/remote-config/android
keyリスト取得
IEnumerable<string> keys = Firebase.RemoteConfig.FirebaseRemoteConfig.GetKeysByPrefix("propertyname"); foreach (string key in keys) { Debug.Log("key=" + key); }
RemoteConfigの条件のユーザーランダムについて
実機だとこの条件が有効になる。Unity上のプレビューだとdefault値が帰ってきた。