【发布时间】:2016-10-25 08:36:58
【问题描述】:
我知道 Firebase 通常离线工作,并且只要有机会就会同步。是否同样适用于 Firebase-Analytics for mobile(Android、iOS)应用?
如果是(或部分是)- 用户可以离线多长时间?
【问题讨论】:
标签: firebase firebase-analytics
我知道 Firebase 通常离线工作,并且只要有机会就会同步。是否同样适用于 Firebase-Analytics for mobile(Android、iOS)应用?
如果是(或部分是)- 用户可以离线多长时间?
【问题讨论】:
标签: firebase firebase-analytics
是的,事件存储在本地并在收音机打开时上传。我们的服务器将忽略迟到超过 72 小时的事件。
【讨论】:
Firebase Analytics 会将记录的事件本地存储在设备上(在线或离线)。当需要上传数据并且设备有网络连接时,Firebase Analytics 将在尽可能少的上传中批量处理数据,压缩它并尝试上传数据。
上传成功后,数据将从设备中删除。当上传失败时,将安排一次新的尝试并进行渐进式后退。如果设备离线,应用程序将在尝试上传之前等待连接。
超过 72 小时的数据将被忽略。可以在设备上存储多少数据存在安全限制(以限制磁盘使用)。在长时间离线的设备上记录过多数据可能会导致数据丢失。
【讨论】:
2019 年 9 月来源:Firebase offline: What works, what doesn't, and what you need to know (Firebase Summit 2019)
性能监控和 Firebase 分析会丢弃通常 >72 小时前的数据
测量工具(Perf、Analytics、Crashlytics)对看起来太旧的数据持怀疑态度 - Todd Kerpelman @ Firebase 峰会 2019
值得注意的是,这个 72 小时的限制不像缓存大小和事件限制那样是硬限制,因此有时可以离线缓存超过 72 小时并报告回服务器,尽管这不能保证。
以上视频中对性能、分析、Crashlytics 的总结:
一切都可能发生变化 - Todd Kerpelman @ Firebase 峰会 2019
其他信息:
我仍然无法在 Firebase 官方文档中找到此信息的来源。
【讨论】:
可以绕过分析的 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>
在扩展广播接收器的类中,检查网络是否可用并记录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 博客,分析数据在以下情况下被批量发送:
因此,如果用户试用您的应用 20 分钟然后将其卸载,则仍会收到该会话数据,因为您的应用会在用户将您的应用移至后台的那一刻发送数据。
分析数据在 iOS 上实际丢失的一种极端情况是,如果您的应用崩溃,然后您的用户立即将其卸载。
【讨论】: