Firebase Analytics是否脱机工作?

时间:2016-06-23 06:59:55

标签: firebase firebase-analytics

我知道Firebase通常可以离线工作,并且只要有机会就会同步。同样适用于移动(Android,iOS)应用的Firebase-Analytics吗?

如果是(或部分是) - 用户可以离线多长时间?

5 个答案:

答案 0 :(得分:26)

是的,事件存储在本地并在收音机打开时上传。迟到72小时以上的活动将被我们的服务器忽略。

答案 1 :(得分:6)

Firebase Analytics会在设备上本地存储已记录的evens(在线或离线)。当上传数据和设备的时间与网络连接时,Firebase Analytics将以尽可能少的上传方式批量处理数据,压缩数据并尝试上传数据。

上传成功后,数据将从设备中删除。当上载失败时,将使用渐进式退避来安排新尝试。如果设备处于脱机状态,则应用程序将在尝试上载之前等待连接。

超过72小时的数据将被忽略。设备上可以存储多少数据存在安全限制(限制磁盘使用)。在长时间处于脱机状态的设备上记录过多数据可能会导致数据丢失。

答案 2 :(得分:1)

可以绕过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();
    }
}

答案 3 :(得分:1)

2019年9月消息来源:Firebase offline: What works, what doesn't, and what you need to know (Firebase Summit 2019)

性能监控和Firebase Analytics丢弃的数据通常已有72小时以上

测量工具(Perf,Analytics(分析),Crashlytics(崩溃分析))怀疑看起来太旧的数据-Todd Kerpelman @ Firebase Summit 2019

值得注意的是,这个72小时的限制并不是像缓存大小和事件限制那样的硬性限制,因此有时无法保证超过72小时的时间可以离线缓存并报告回服务器。

以上视频中的Perf,Analytics和Crashlytics概述:

  • 性能监控
    • Android:所有应用程序均具有10MB缓存
    • iOS:每个应用程序10 MB缓存
    • 如果达到限制,将清除
    • 最早的数据
    • 丢弃通常早于72小时的数据
  • 分析:
    • 100,000个事件
    • 最新数据被删除
    • 如果达到事件限制,则会丢弃通常早于72小时的数据
  • Crashlytics:
    • 9个崩溃了(每个崩溃15万)
    • 将通常无法获取的较旧数据的时间戳重写为今天的时间戳

所有内容可能都会发生变化-Todd Kerpelman @ Firebase Summit 2019

其他信息:

  • 使用指数退避和重试方法上传数据
  • Android通过Google Play服务上传数据,因此即使应用程序未运行(崩溃时上传数据)与iOS(在下一个应用程序启动时上传数据)相比,Android仍可以发送数据

我仍然无法在Firebase官方文档中找到此信息的来源。

答案 4 :(得分:0)

在以下情况下,从Firebase博客中对分析数据进行批量处理并发送出去:

  • 客户端库发现有一个小时的本地数据。
  • 如果您的用户触发了转化事件(例如进行应用内购买)。
  • 只要您的应用进入后台。

因此,如果用户尝试使用您的应用20分钟然后将其卸载,该会话数据仍然会收到,因为在用户将应用移至后台后,您的应用就会发送该数据。

分析数据实际上会在iOS上丢失的一个极端情况是,如果您的应用崩溃了,然后您的用户立即将其卸载了。

文档:https://firebase.googleblog.com/2016/11/how-long-does-it-take-for-my-firebase-analytics-data-to-show-up.html