【问题标题】:Does Firebase Analytics Work Offline?Firebase Analytics 是否可以离线工作?
【发布时间】:2016-10-25 08:36:58
【问题描述】:

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

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

【问题讨论】:

    标签: firebase firebase-analytics


    【解决方案1】:

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

    【讨论】:

    • 是否有任何方法可以延长此时间限制,即记录在 Firebase 服务器上延迟超过 72 小时的陈旧或较旧的事件。
    • 在建设数十亿美元(印度!)时,我们不应该惊讶地看到用户每隔几天才上线一次。假设像计算器这样的典型实用程序不需要使用互联网,那么实用程序应用程序的许多有用事件将会丢失。
    • 有没有办法直接访问本地存储的事件?
    • 任何人都可以分享有关此限制的 Google 文档链接。
    • 我认为 google firebase 团队应该将此限制放在文档中,因为我在官方文档中看不到它。在比较我们的系统事务和 firebase 时,我们感到很困惑
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答。我在 Firebase 文档中找不到此信息。你认为你可以提供一个链接到讨论离线数据过期的页面吗?
    • 非常感谢,但是我找不到官方文档,请问您是从哪里得到这些信息的?
    • @djabi 这种同步是由 firebase 自动完成的,还是我应该自己完成?
    • @djabi 是否同样适用于 Firebase Analytics for Web?
    【解决方案3】:

    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 的总结:

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

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

    其他信息:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这可能行不通,因为数据记录在设备中的实际时间与将在分析中记录的时间不一致。
      【解决方案5】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多