Firebase Analytics 可以离线工作吗?
Does Firebase Analytics Work Offline?
我知道 Firebase 通常可以离线工作,并在有机会时进行同步。同样的事情是否适用于移动(Android、iOS)应用程序的 Firebase-Analytics?
如果是(或部分是)- 用户可以离线多长时间?
是的,事件存储在本地并在打开收音机时上传。迟到超过 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>
在 class 扩展 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 博客,分析数据在以下时间进行批处理和发送:
- 客户端库看到有一个小时前的任何本地数据。
- 如果您的用户触发了转化事件(例如进行应用内购买)。
- 每当您的应用程序进入后台时。
因此,如果用户试用您的应用 20 分钟然后将其卸载,该会话数据仍会收到,因为您的应用会在用户将您的应用移至后台时发送数据。
分析数据实际上会在 iOS 上丢失的一个极端情况是,如果您的应用程序崩溃,然后您的用户立即将其卸载。
2019 年 9 月来源:Firebase offline: What works, what doesn't, and what you need to know (Firebase Summit 2019)
性能监控和 Firebase 分析会丢弃通常超过 72 小时的数据
Measurement tools (Perf, Analytics, Crashlytics) are suspicious of data that looks too old - Todd Kerpelman @ Firebase Summit 2019
值得注意的是,这个 72 小时限制不像缓存大小和事件限制那样是硬性限制,因此有时可以离线缓存超过 72 小时并报告回服务器,但不能保证这一点。
上面视频中的 Perf、Analytics、Crashlytics 总结:
- 性能监控
- Android:所有应用程序 10MB 缓存
- iOS:每个应用程序 10MB 缓存
- 如果达到限制,将清除最早的数据
- 丢弃通常超过 72 小时的数据
- 分析:
- 100,000 个事件
- 最近的数据被删除
- 如果达到事件限制,则丢弃通常超过 72 小时的数据
- 崩溃分析:
- 9 次崩溃(每次最多 150K)
- re-writes 它无法识别的旧数据的时间戳,因为您通常需要崩溃数据
All subject to change - Todd Kerpelman @ Firebase Summit 2019
其他信息:
- 使用指数退避和重试方法上传数据
- Android 通过 Google Play 服务上传数据,因此即使应用程序未运行 运行(数据在崩溃时上传)与 iOS 相比也可以发送数据下次应用启动时上传数据的位置
我仍然无法在官方 Firebase 文档中找到此信息的来源。
我知道 Firebase 通常可以离线工作,并在有机会时进行同步。同样的事情是否适用于移动(Android、iOS)应用程序的 Firebase-Analytics?
如果是(或部分是)- 用户可以离线多长时间?
是的,事件存储在本地并在打开收音机时上传。迟到超过 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>
在 class 扩展 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 博客,分析数据在以下时间进行批处理和发送:
- 客户端库看到有一个小时前的任何本地数据。
- 如果您的用户触发了转化事件(例如进行应用内购买)。
- 每当您的应用程序进入后台时。
因此,如果用户试用您的应用 20 分钟然后将其卸载,该会话数据仍会收到,因为您的应用会在用户将您的应用移至后台时发送数据。
分析数据实际上会在 iOS 上丢失的一个极端情况是,如果您的应用程序崩溃,然后您的用户立即将其卸载。
2019 年 9 月来源:Firebase offline: What works, what doesn't, and what you need to know (Firebase Summit 2019)
性能监控和 Firebase 分析会丢弃通常超过 72 小时的数据
Measurement tools (Perf, Analytics, Crashlytics) are suspicious of data that looks too old - Todd Kerpelman @ Firebase Summit 2019
值得注意的是,这个 72 小时限制不像缓存大小和事件限制那样是硬性限制,因此有时可以离线缓存超过 72 小时并报告回服务器,但不能保证这一点。
上面视频中的 Perf、Analytics、Crashlytics 总结:
- 性能监控
- Android:所有应用程序 10MB 缓存
- iOS:每个应用程序 10MB 缓存
- 如果达到限制,将清除最早的数据
- 丢弃通常超过 72 小时的数据
- 分析:
- 100,000 个事件
- 最近的数据被删除
- 如果达到事件限制,则丢弃通常超过 72 小时的数据
- 崩溃分析:
- 9 次崩溃(每次最多 150K)
- re-writes 它无法识别的旧数据的时间戳,因为您通常需要崩溃数据
All subject to change - Todd Kerpelman @ Firebase Summit 2019
其他信息:
- 使用指数退避和重试方法上传数据
- Android 通过 Google Play 服务上传数据,因此即使应用程序未运行 运行(数据在崩溃时上传)与 iOS 相比也可以发送数据下次应用启动时上传数据的位置
我仍然无法在官方 Firebase 文档中找到此信息的来源。