Firebaseは一般的にオフラインで動作し、機会があればいつでも同期することを知っています。同じことがFirebase-Analyticsfor mobile(Android、iOS)アプリにも当てはまりますか?
はい(または部分的にはい)の場合-ユーザーはどのくらいオフラインにできますか?
はい、イベントはローカルに保存され、ラジオがオンになるとアップロードされます。 72時間以上遅れて到着したイベントは、サーバーによって無視されます。
Firebase Analyticsは、ログに記録された偶数をデバイスにローカルに保存します(オンラインまたはオフライン)。データをアップロードする時間であり、デバイスにネットワーク接続がある場合、Firebase Analyticsはデータを可能な限り少ないアップロードでバッチ処理し、圧縮してデータのアップロードを試みます。
アップロードが成功すると、データはデバイスから削除されます。アップロードが失敗すると、プログレッシブバックオフを使用して新しい試行がスケジュールされます。デバイスがオフラインの場合、アプリはアップロードを試みる前に接続を待機します。
72時間より古いデータは無視されます。デバイスに保存できるデータの量には安全上の制限があります(ディスク使用量を制限するため)。長期間オフラインになっているデバイスに過剰なデータを記録すると、データが失われる可能性があります。
分析の72時間の制限時間を回避することが可能です。まず、権限を追加する必要があります
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
マニフェストファイル内。イベントをログに記録する前に、次の方法を使用してインターネットが利用可能かどうかを確認してください。
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
上記の方法を使用して、ユーザーがオンラインであるかどうかを確認し、オンラインである場合は通常どおりイベントをログに記録します。オンラインでない場合は、今はログに記録せず、SharedPreferences
を使用してイベント名とそのパラメーターを文字列として保存します。
if(isNetworkAvailable()){
// the user is online, log the events
}else{
// Don't log the events, save the event name and its parameters using SharedPreferences
}
BroadcastReceiverリスニング接続変更イベントを登録し、マニフェストファイルに以下を追加します。
<receiver
Android:name="type your class directory extending BroadcastReceiver here"
Android:enabled="true"
Android:exported="true">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
<action Android:name="Android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
BroadcastReceiverを拡張するクラスで、ネットワークが利用可能かどうかを確認し、SharedPreferences
によって保存されたイベントをログに記録します
public class NetworkEnabledBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(isNetworkAvailable(context)){
//Check if there are saved events and parameters using the same named
//SharedPreferences used for saving the events and parameters, log if
//so, then clear the data.
}
}
private boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager
= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
Firebase Blogから、分析データは次の場合にバッチ処理されて送信されます。
そのため、ユーザーがアプリを20分間試してからアンインストールしても、ユーザーがアプリをバックグラウンドに移動した瞬間にアプリがデータを送信するため、そのセッションデータは引き続き受信されます。
IOSで分析データが実際に失われる1つのコーナーケースは、アプリがクラッシュした後、ユーザーがすぐにアンインストールした場合です。