24

我知道 Firebase 通常离线工作,并且只要有机会就会同步。同样的事情是否适用于 Firebase-Analytics 的移动(Android、iOS)应用程序?

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

4

5 回答 5

37

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

于 2016-06-23T12:49:15.737 回答
10

Firebase Analytics 将在设备本地存储记录的事件(在线或离线)。当需要上传数据并且设备有网络连接时,Firebase Analytics 将尽可能少地批量上传数据,压缩它并尝试上传数据。

上传成功后,数据将从设备中删除。当上传失败时,将安排一次新的尝试并进行渐进式后退。如果设备离线,应用程序将在尝试上传之前等待连接。

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

于 2016-06-24T00:18:46.630 回答
2

2019 年 9 月资料来源:Firebase 离线:哪些有效,哪些无效,以及您需要了解的内容(Firebase 峰会 2019)

性能监控和 Firebase 分析会丢弃通常超过 72 小时的数据

测量工具(Perf、Analytics、Crashlytics)对看起来太旧的数据持怀疑态度 - Todd Kerpelman @ Firebase 峰会 2019

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

上述视频中的 Perf、Analytics、Crashlytics 总结:

  • 性能监控
    • Android:所有应用程序都有 10MB 缓存
    • iOS:每个应用程序有 10MB 缓存
    • 如果达到限制,将清除最旧的数据
    • 丢弃通常 > 72 小时前的数据
  • 分析:
    • 100,000 个事件
    • 最近的数据被删除
    • 如果达到事件限制,则丢弃通常 > 72 小时前的数据
  • 崩溃分析:
    • 9 个崩溃(每个最多 150K)
    • 重写今天无法识别的旧数据的时间戳,因为您通常需要崩溃数据

一切都可能发生变化 - Todd Kerpelman @ Firebase 峰会 2019

其他信息:

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

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

于 2020-09-07T08:21:22.943 回答
1

可以绕过分析的 72 小时时间限制。首先,您需要添加权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在您的清单文件中。在记录事件之前,请使用此方法检查 Internet 是否可用:

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 监听连接变化事件,在你的 manifest 文件中添加以下内容:

<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();
    }
}
于 2018-09-08T21:53:26.713 回答
0

在 Firebase 博客中,分析数据在以下情况下被批量发送并发送:

  • 客户端库看到有一个小时前的任何本地数据。
  • 如果您的用户触发了转化事件(例如进行应用内购买)。
  • 每当您的应用程序进入后台时。

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

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

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

于 2020-01-14T03:32:14.763 回答