quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub

quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub Аналитика

Algolia

quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub

SaaS-решение для поиска. Платное, но с бесплатным планом. С прайсом и прочими деталями можно ознакомиться на

Интеграция с Firebase реализована при помощи официальной js-библиотеки. Процесс установки и запуска подробно описан в readme, и у меня всё заработало с первой попытки.

https://www.youtube.com/watch?v=9-emL-Fbvp0

Выглядит интеграция примерно так:

var algoliasearch = require('algoliasearch');

…

var client = algoliasearch(config.algolia.applicationID, config.algolia.apiKey); // инициализируем Algolia
var indexRooms = client.initIndex('rooms'); // инициализируем поисковый индекс Algolia

rooms.once('value', initInde); // rooms — это reference к объекту в Firebase
function initIndex(dataSnapshot) {
  var objectsToIndex = []; // Этот массив мы отправим в Algolia
  var values = dataSnapshot.val(); // Получаем значение snapshot’a
  for (var key in values) { // обрабатываем каждый room
    if (values.hasOwnProperty(key)) {
      var firebaseObject = values[key];
      firebaseObject.objectID = key; // id объекта в Algolia должен совпадать с ключом в Firebase
      objectsToIndex.push(firebaseObject); // добавляем в массив
    }
  }
  indexRooms.saveObjects(objectsToIndex, function(err, content) { 
    if (err) {
      console.log('error');
      return;
    }
    console.log('success');
    return;
  });
}

В результате мы получаем поисковый индекс в Algolia, содержащий все объекты rooms из Firebase. Обратите внимание, что по ходу импорта данные можно обработать дополнительно, например подтянуть название отеля из другого объекта в базе данных.

После того, как мы создали индекс, мы не собираемся обновлять его целиком, поэтому в дальнейшем следим за событиями в Firebase и обрабатываем их:

rooms.on('child_added', addOrUpdateObjectRooms);
rooms.on('child_changed', addOrUpdateObjectRooms);
rooms.on('child_removed', removeIndexRooms);


Единственный минус в использовании Algolia в том, что за SaaS нужно платить. Но для MVP бесплатного тарифа должно быть достаточно, а делать на Firebase масштабный проект мало кому придёт в голову (я надеюсь).

В противовес этому сомнительному минусу мы получаем удобную админку с доступом к аналитике, поисковому индексу и нюансам работы поисковых запросов.Важным плюсом является наличие SDK под всё и вся — от мобильных платформ до фреймворков для бэкенда. В суть я не вникал, но iOS-разработчик сказал: это удобнее, чем REST.

Я советую вам попробовать именно Algolia: интеграция с Firebase лучше, установка проще, а в довесок мы получаем консоль с аналитикой и SDK. Я оставил без внимания технические детали и не анализировал производительность и скорость, это сложная и отдельная тема.

Android

  • Register your Android app with Firebase.
    • Create a project in the
      Firebase console,
      and attach your Android app to it.
    • Download the google-services.json file associated with your
      Firebase project from the console.
      This file identifies your Android app to the Firebase backend, and will
      need to be included in the sample later.
  • Download the
    Firebase Unity SDK
    and unzip it somewhere convenient.
  • Open the sample project in the Unity editor.
    • Select the File > Open Project menu item.
    • If Unity Hub appears, click Add. Otherwise click Open.
    • Navigate to the sample directory testapp in the file dialog and click
      Open.
      • You might be prompted to upgrade the project to your version of Unity.
        Click Confirm to upgrade the project and continue.
  • Open the scene MainScene.
    • Navigate to Assets/Firebase/Sample/Analytics in the Project window.
    • Double click on the MainScene file to open it.
  • Import the Firebase Analytics plugin.
  • Add the google-services.json file to the project.
    • Navigate to the Assets/Firebase/Sample/Analytics folder in the Project
      window.
    • Drag the google-services.json downloaded from the Firebase console
      into the folder.
      • NOTE: google-services.json can be placed anywhere under the Assets
        folder.
  • Optional: Update the Project Bundle Identifier
    • If you did not use com.google.firebase.unity.analytics.testapp
      as the Android package name when you created your app in the Firebase
      Console, you will need to update the sample’s Bundle Identifier.
      • Select the File > Build Settings menu option.
      • Select Android in the Platform list.
      • Click Player Settings
      • In the Settings for Android panel scroll down to Bundle Identifier
        and update the value to the package name you provided when you
        registered your app with Firebase.
  • Build for Android
  • See the Using the Sample section below.

Bigquery

BigQuery — это вообще немного другая галактика.
С BigQuery можно было работать и через GA, но только если у вас premium-режим. В FA же вам прямо во вкладке Events предлагается установить связь (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubGoogle говорит: «Мы дарим вам машину, но за бензин платите вы». С тарифными планами можно ознакомиться здесь, а еще лучше здесь. Но поверьте, чтобы просто попробовать, вам вполне достаточно будет бесплатных лимитов тарифа Blaze. Да и даже при работе с боевыми продуктами, судя по отзывам товарищей, плата весьма условной получается.
Итак, начнем знакомство. Вот так выглядит консоль BigQuery (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubВ левом меню представлен список доступных данных. Например, TestStep — это мой тестовый проект с одним приложением в составе. А bigquery-public-data и Public Datasets — это, как можно догадаться, публичные данные, с которыми вы можете поэкспериментировать и на которых можете потренироваться в написании запросов.
Справа же вы видите список запросов, как успешных, так и не очень.
Теперь взглянем на данные тестового приложения за 14 марта 2021 года (таблица app_events_20210314, рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubВ таблицу я перебросил все данные за сутки (52 события). Общий состав таблицы представлен перед вами. Как видно, тут каждое событие описывается максимально полно, включая все properties, о которых речь будет чуть ниже.
Давайте посмотрим на превью данных (вкладка Preview, рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubТабличный вид с ходу малоинформативен. Намного более понятная форма — это JSON (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub

И тогда наше событие представляется в полном виде. В UI почему-то нельзя расширить окно показа json, поэтому приведу полный json последних пяти событий отдельно:

5 событий в BigQuery
[
  {
    "user_dim": {
      "user_id": null,
      "first_open_timestamp_micros": "1488878151620000",
      "user_properties": [
        {
          "key": "first_open_time",
          "value": {
            "value": {
              "string_value": null,
              "int_value": "1488880800000",
              "float_value": null,
              "double_value": null
            },
            "set_timestamp_usec": "1488878151620000",
            "index": null
          }
        }
      ],
      "device_info": {
        "device_category": "mobile",
        "mobile_brand_name": null,
        "mobile_model_name": null,
        "mobile_marketing_name": null,
        "device_model": "507SH",
        "platform_version": "6.0.1",
        "device_id": null,
        "resettable_device_id": null,
        "user_default_language": "ru-ru",
        "device_time_zone_offset_seconds": "10800",
        "limited_ad_tracking": "false"
      },
      "geo_info": {
        "continent": "Europe",
        "country": "Russia",
        "region": "Moscow",
        "city": "Moscow"
      },
      "app_info": {
        "app_version": "1.0",
        "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9",
        "app_store": "manual_install",
        "app_platform": "ANDROID",
        "app_id": "com.example.matsyuk.testfirebase"
      },
      "traffic_source": null,
      "bundle_info": {
        "bundle_sequence_id": "65",
        "server_timestamp_offset_micros": "-496748"
      },
      "ltv_info": null
    },
    "event_dim": [
      {
        "date": "20210314",
        "name": "user_engagement",
        "params": [
          {
            "key": "firebase_screen_class",
            "value": {
              "string_value": "SecondActivity",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_event_origin",
            "value": {
              "string_value": "auto",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_id",
            "value": {
              "string_value": null,
              "int_value": "1109587836504693342",
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "engagement_time_msec",
            "value": {
              "string_value": null,
              "int_value": "4424",
              "float_value": null,
              "double_value": null
            }
          }
        ],
        "timestamp_micros": "1489478210462000",
        "previous_timestamp_micros": "1489478205970000",
        "value_in_usd": null
      }
    ]
  },
  {
    "user_dim": {
      "user_id": null,
      "first_open_timestamp_micros": "1488878151620000",
      "user_properties": [
        {
          "key": "first_open_time",
          "value": {
            "value": {
              "string_value": null,
              "int_value": "1488880800000",
              "float_value": null,
              "double_value": null
            },
            "set_timestamp_usec": "1488878151620000",
            "index": null
          }
        }
      ],
      "device_info": {
        "device_category": "mobile",
        "mobile_brand_name": null,
        "mobile_model_name": null,
        "mobile_marketing_name": null,
        "device_model": "507SH",
        "platform_version": "6.0.1",
        "device_id": null,
        "resettable_device_id": null,
        "user_default_language": "ru-ru",
        "device_time_zone_offset_seconds": "10800",
        "limited_ad_tracking": "false"
      },
      "geo_info": {
        "continent": "Europe",
        "country": "Russia",
        "region": "Moscow",
        "city": "Moscow"
      },
      "app_info": {
        "app_version": "1.0",
        "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9",
        "app_store": "manual_install",
        "app_platform": "ANDROID",
        "app_id": "com.example.matsyuk.testfirebase"
      },
      "traffic_source": null,
      "bundle_info": {
        "bundle_sequence_id": "64",
        "server_timestamp_offset_micros": "-515257"
      },
      "ltv_info": null
    },
    "event_dim": [
      {
        "date": "20210314",
        "name": "user_engagement",
        "params": [
          {
            "key": "firebase_screen_class",
            "value": {
              "string_value": "MainActivity",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_event_origin",
            "value": {
              "string_value": "auto",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_id",
            "value": {
              "string_value": null,
              "int_value": "1109587836504693341",
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "engagement_time_msec",
            "value": {
              "string_value": null,
              "int_value": "17278",
              "float_value": null,
              "double_value": null
            }
          }
        ],
        "timestamp_micros": "1489478205970000",
        "previous_timestamp_micros": "1489153178047000",
        "value_in_usd": null
      }
    ]
  },
  {
    "user_dim": {
      "user_id": null,
      "first_open_timestamp_micros": "1488878151620000",
      "user_properties": [
        {
          "key": "first_open_time",
          "value": {
            "value": {
              "string_value": null,
              "int_value": "1488880800000",
              "float_value": null,
              "double_value": null
            },
            "set_timestamp_usec": "1488878151620000",
            "index": null
          }
        }
      ],
      "device_info": {
        "device_category": "mobile",
        "mobile_brand_name": null,
        "mobile_model_name": null,
        "mobile_marketing_name": null,
        "device_model": "507SH",
        "platform_version": "6.0.1",
        "device_id": null,
        "resettable_device_id": null,
        "user_default_language": "ru-ru",
        "device_time_zone_offset_seconds": "10800",
        "limited_ad_tracking": "false"
      },
      "geo_info": {
        "continent": "Europe",
        "country": "Russia",
        "region": "Moscow",
        "city": "Moscow"
      },
      "app_info": {
        "app_version": "1.0",
        "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9",
        "app_store": "manual_install",
        "app_platform": "ANDROID",
        "app_id": "com.example.matsyuk.testfirebase"
      },
      "traffic_source": null,
      "bundle_info": {
        "bundle_sequence_id": "63",
        "server_timestamp_offset_micros": "-500210"
      },
      "ltv_info": null
    },
    "event_dim": [
      {
        "date": "20210314",
        "name": "ga_event",
        "params": [
          {
            "key": "label",
            "value": {
              "string_value": "label1",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_class",
            "value": {
              "string_value": "MainActivity",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "action",
            "value": {
              "string_value": "action1",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_event_origin",
            "value": {
              "string_value": "app",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "value",
            "value": {
              "string_value": null,
              "int_value": "1",
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "category",
            "value": {
              "string_value": "category1",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_id",
            "value": {
              "string_value": null,
              "int_value": "1109587836504693341",
              "float_value": null,
              "double_value": null
            }
          }
        ],
        "timestamp_micros": "1489478204880000",
        "previous_timestamp_micros": "1489137436229000",
        "value_in_usd": null
      }
    ]
  },
  {
    "user_dim": {
      "user_id": null,
      "first_open_timestamp_micros": "1488878151620000",
      "user_properties": [
        {
          "key": "first_open_time",
          "value": {
            "value": {
              "string_value": null,
              "int_value": "1488880800000",
              "float_value": null,
              "double_value": null
            },
            "set_timestamp_usec": "1488878151620000",
            "index": null
          }
        }
      ],
      "device_info": {
        "device_category": "mobile",
        "mobile_brand_name": null,
        "mobile_model_name": null,
        "mobile_marketing_name": null,
        "device_model": "507SH",
        "platform_version": "6.0.1",
        "device_id": null,
        "resettable_device_id": null,
        "user_default_language": "ru-ru",
        "device_time_zone_offset_seconds": "10800",
        "limited_ad_tracking": "false"
      },
      "geo_info": {
        "continent": "Europe",
        "country": "Russia",
        "region": "Moscow",
        "city": "Moscow"
      },
      "app_info": {
        "app_version": "1.0",
        "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9",
        "app_store": "manual_install",
        "app_platform": "ANDROID",
        "app_id": "com.example.matsyuk.testfirebase"
      },
      "traffic_source": null,
      "bundle_info": {
        "bundle_sequence_id": "62",
        "server_timestamp_offset_micros": "-499813"
      },
      "ltv_info": null
    },
    "event_dim": [
      {
        "date": "20210314",
        "name": "select_content",
        "params": [
          {
            "key": "firebase_screen_class",
            "value": {
              "string_value": "MainActivity",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "content_type",
            "value": {
              "string_value": "image",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "item_name",
            "value": {
              "string_value": "name1",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_event_origin",
            "value": {
              "string_value": "app",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_id",
            "value": {
              "string_value": null,
              "int_value": "1109587836504693341",
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "item_id",
            "value": {
              "string_value": "1",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          }
        ],
        "timestamp_micros": "1489478204208000",
        "previous_timestamp_micros": "1489137435605000",
        "value_in_usd": null
      }
    ]
  },
  {
    "user_dim": {
      "user_id": null,
      "first_open_timestamp_micros": "1488878151620000",
      "user_properties": [
        {
          "key": "first_open_time",
          "value": {
            "value": {
              "string_value": null,
              "int_value": "1488880800000",
              "float_value": null,
              "double_value": null
            },
            "set_timestamp_usec": "1488878151620000",
            "index": null
          }
        }
      ],
      "device_info": {
        "device_category": "mobile",
        "mobile_brand_name": null,
        "mobile_model_name": null,
        "mobile_marketing_name": null,
        "device_model": "507SH",
        "platform_version": "6.0.1",
        "device_id": null,
        "resettable_device_id": null,
        "user_default_language": "ru-ru",
        "device_time_zone_offset_seconds": "10800",
        "limited_ad_tracking": "false"
      },
      "geo_info": {
        "continent": "Europe",
        "country": "Russia",
        "region": "Moscow",
        "city": "Moscow"
      },
      "app_info": {
        "app_version": "1.0",
        "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9",
        "app_store": "manual_install",
        "app_platform": "ANDROID",
        "app_id": "com.example.matsyuk.testfirebase"
      },
      "traffic_source": null,
      "bundle_info": {
        "bundle_sequence_id": "61",
        "server_timestamp_offset_micros": "-537470"
      },
      "ltv_info": null
    },
    "event_dim": [
      {
        "date": "20210314",
        "name": "session_start",
        "params": [
          {
            "key": "firebase_screen_class",
            "value": {
              "string_value": "MainActivity",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_event_origin",
            "value": {
              "string_value": "auto",
              "int_value": null,
              "float_value": null,
              "double_value": null
            }
          },
          {
            "key": "firebase_screen_id",
            "value": {
              "string_value": null,
              "int_value": "1109587836504693341",
              "float_value": null,
              "double_value": null
            }
          }
        ],
        "timestamp_micros": "1489478198696000",
        "previous_timestamp_micros": "1489137330069000",
        "value_in_usd": null
      }
    ]
  }
]

Красота, да и только!
Теперь более подробно рассмотрим Queries. Выберем первый (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubИ перед нами откроется следующий экран (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubЗапрос наш довольно произвольный. Обратите внимание на вкладку Results. Собственно, в ней вы и увидите результаты вашего запроса.
Если открыть вкладку Explanation, то вы увидите более подробный процесс прохождения запроса (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHubНу и самая интересная вкладка — Job information (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub

Дополнительный анализ:  Вакансия Бизнес-аналитик (MTS AI) в Москве, работа в компании «МТС», IT (вакансия в архиве c 10 июня 2021)

Обратите внимание на Bytes Processed, Bytes Billed и Bites Tier. В ходе запроса было обработано 26,4 KB, но платите вы по нижней границе для Bites Tier = 1, то есть платите как за 10 MB. Однако, судя по документации, 1 TB в месяц для вас будет бесплатным, а каждый последующий будет стоить $5. Вполне вам хватит наиграться и напробоваться. Ну и важное дополнение — платите вы только за успешные запросы!

Даже очень краткий обзор по BigQuery получается немаленьким. Это очень мощный и функциональный инструмент, с помощью которого вы можете анализировать данные как угодно. Но за 5 минут в BigQuery вы точно не разберетесь, в отличие от обычной консоли в GA или FA.

Поэтому очень круто, если в вашей команде или компании есть человек, который в этом разбирается, и который может получить какие угодно результаты.Если этим человеком хотите стать вы, то начать можете со вступительного видео от «Гугла», где, кстати, рассказывается и про расчет стоимости.

Также есть неплохие статьи — раз и два. Далее советую вам копать в сторону официальной доки и книги по BigQuery (целая книга, Карл!).Будет здорово, если кто-то уже хорошо покопал в эту сторону и может поделиться советами и опытом =)

Ga vs fa. события

Коль уж мы затронули тему событий. В плане осмысления «события» GA и FA действительно очень разные. И это особенно заметно на примере.Допустим, ваше приложение — это игра. По окончании игры вы хотите послать статистику, как в итоге сыграл пользователь.

// total score
mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config);
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
        .setCategory("gameOver")
        .setAction("totalScore")
        .setLabel("")
        .setValue(gameStats.getTotalScore());
mTracker.send(builder.build());
// enemies beaten
mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config);
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
        .setCategory("gameOver")
        .setAction("enemiesBeaten")
        .setLabel("")
        .setValue(gameStats.getEnemiesBeaten());
mTracker.send(builder.build());
// roundsSurvived
mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config);
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
        .setCategory("gameOver")
        .setAction("roundsSurvived")
        .setLabel("")
        .setValue(gameStats.getRoundsSurvived());
mTracker.send(builder.build());

В GA каждое событие по сути представляет собой иерархию параметров:category -> action -> label -> valueИ в самой консоли вы могли наблюдать данную иерархию параметров. Собственно при придумывании событий, которые вы бы хотели отслеживать, вы должны были руководствоваться данной парадигмой.

Также в консоли можно строить различные фильтры по данным параметрам.Но в GA в плане событий есть небольшой минус. Если вы хотите навешать событию дополнительные параметры, помимо вышеназванных, вот тут приходится танцевать вокруг “category” -> “action” -> “label” -> “value”, придумывать новые формулировки и прочее. Неудобно. По крайней мере так было раньше.

А теперь посмотрим, как можно данную статистику обыграть с FA:

Bundle params = new Bundle();
params.putLong("totalScore", gameStats.getTotalScore());
params.putLong("enemiesBeaten", gameStats.getEnemiesBeaten());
params.putLong("roundsSurvived", gameStats.getRoundSurvived());
mFirebaseAnalytics.logEvent("game_over", params);

Как видите, вместо трех событий мы отправляем одно, что более логично и удобно. Про «события» в FA мы поговорим подробнее чуть ниже.

Альтернативы firebase

Несмотря на то, что Firebase является великолепной платформой для разработки приложений, существуют не менее замечательные альтернативы. Если вы ищете чем заменить Firebase в 2021 году, посмотрите варианты, которые мы рекомендуем.

Back4App-это популярная платформа с открытым исходным кодом, которая предоставляет бэкенд с low-code для ускорения разработки приложений.

Она функциональна и имеет огромное количество встроенных характеристик, которые удовлетворяет потребности многих разработчиков. Платформа Back4App облегчает разработку, размещение и управление приложениями и является хорошим вариантом для размещения веб, мобильных и IoT-приложений.

Используя эту альтернативу Firebase, пользователи могут воспользоваться преимуществами базы данных, которая предоставляет более быстрое и эффективное обновление и синхронизацию данных. Разработчики могут использовать как GraphQL, так и REST API, а также использовать возможность динамических запросов для быстрого сохранения и синхронизации данных.

Backendless- это хорошо известный бэкенд для разработки мобильных приложений, который имеет набор надежных инструментов для разработки и управления приложениями.

Он предоставляет пользователям возможность выбора между выделенными, облачными и управляемыми серверами в соответствии с нуждами разработчиков.

База данных Backendless позволяет разработчикам использовать кэширование для повышения скорости работы приложений. Она также позволяет выполнять централизованное управление лог-файлами для повышения эффективности работы приложений.

Геолокация, это еще одна удобная функция для разработки приложений, работающих с информацией о местоположении.

AWS Amplify, это предложение, которое имеет множество функций для разработки полноценных приложений AWS. Оно очень удобно для реализации мобильных и клиентских проектов.

Одной из функций, которая отличает AWS Amplify от конкурентов, является аналитика, подходящая для анализа поведения пользователей, а также удобные метрики и автоматическое отслеживание. Push-уведомления AWS Amplify помогают улучшить взаимодействие и таргетинг клиентов.

Дополнительный анализ:  ЕБРР не возобновит инвестиции в РФ после избрания нового президента - Экономика и бизнес - ТАСС

Пользователи также могут воспользоваться функциями синхронизации и хранения данных на платформе.

Parse является ведущим бэкенд-фреймворком с открытым исходным кодом начиная с 2021 года и предоставляет весь спектр сервисов, например, базу данных, похожую на электронную таблицу, API, Уведомления, Аутентификацию и Хранилище.

Kinvey, это бессерверная и многоканальная платформа для разработки приложений, работающая через облачный сервер и SDK.

Бэкенд этой платформы закрывает основные потребности приложений и фокусируется на предоставлении качественного взаимодействия с пользователями.

Он поддерживает совместное использование кода для кроссплатформенных приложений и облегчает простое управление кодом. Kinvey часто выбирают разработчики angular, он также предоставляет пользователям доступ к собственным API.

Выпуск и мониторинг в firebase

Выпуск и Мониторинг, это набор возможностей Firebase для обеспечения долгожданного запуска приложений. Он поставляется совместно с инструментами для тестирования, анализа и дистрибьюции, чтобы обеспечить бесперебойную работу приложений для пользователей.

Crashlytics-это средство оповещения о сбоях в Firebase в реальном времени, который позволяет разработчикам отслеживать проблемы, расставлять приоритеты и решать их. Функция Crashlytics может быть использована для предотвращения проблем со стабильностью работы. (36)

Пользователи Firebase могут использовать функции Google Analytics, которая уже интегрирована с Firebase. Пользователи могут использовать аналитику для построения неограниченного количества отчетов по событиям Firebase SDK. Разработчики могут принимать более эффективные решения, анализируя поведение пользователей с помощью аналитики. (37)

  • Мониторинг Производительности

Мониторинг Производительности (Performance Monitoring) Firebase-это сервис, который помогает вам получить информацию о характеристиках производительности ваших iOS, Android и веб-приложений. (38)

Вы используете мониторинг производительности SDK для получения данных о производительности вашего приложения. Это поможет вам понять, где именно и в какие моменты производительность вашего приложения может быть улучшена, вы сможете использовать эту информацию для устранения проблем связанных с производительностью.

  • Лаборатория для Испытаний

Лаборатория для Испытаний (Test Lab) Firebase это облачная инфраструктура для тестирования приложений. Она позволяет пользователям тестировать свои iOS и Androidприложения на разных устройствах и при различных конфигурациях. (39)

Пользователи также могут просматривать результаты тестирования, включая скриншоты, журналы и видео в консоли Firebase.

Дистрибутивы Приложений (App Distribution) Firebase, это функция, которая предлагает всестороннее представление о программе, находящейся на бета-тестировании, на платформах Android и iOS. Пользователи могут получить полезную обратную связь еще до начала нового выпуска. (40)

Пользователь может отправлять ранние версии приложений, используя сервера CI или консоль. Установка приложений также становится проще для тестировщиков. 

Инструменты для вовлечения firebase

Вовлечение (Engage), это набор функций Firebase, который позволяет владельцам приложений и разработчикам взаимодействовать с клиентами и привлекать их. У него есть продвинутые инструменты для улучшения процесса вовлечения пользователей в работу с приложением.

Удаленная настройка относится к облачному решению, которая позволяет пользователям изменять поведение и внешний вид приложений без его глобального обновления. Пользователи также могут создавать конфигурацию приложения по умолчанию для установления его поведения и внешнего вида. (41)

Прогнозирование (Predictions) от Firebase, это полезная функция, которая использует преимущества машинного обучения для получения данных при разработки динамических пользовательских частей, работающих на основе поведения. Автоматическим прогнозированием можно воспользоваться при использовании функций Удаленной Настройки Firebase, Обмена Сообщений, A/B Тестирования и Системой Уведомлений Firebase. (42)

A/B-тестирование, это функция Firebase, которая помогает разработчикам улучшить взаимодействие пользователей с приложением за счет улучшения управляемости, масштабирования и анализа работы приложения. Пользователи могут быстро протестировать и оценить изменения, внесенные в интерфейс, функции и кампании, еще до запуска приложения. (43)

Динамические ссылки (Dynamic Links) Firebase — это умные URL-адреса, которые позволяют администраторам приложений направлять потенциальных и текущих пользователей в различные части Android или iOS приложений. Эта функция может работать вне зависимости от установки и позволяет новым пользователям получать доступ к контенту при начальном запуске приложения. (44)

Обмен Сообщениями (In-App Messaging), это функция Firebase для вовлечения активных пользователей приложений с помощью сообщений. Пользователи могут выполнять определенные действия в приложении для получения доступа к различным функциям или разблокировки определенных предложений. (45)

История firebase

История Firebase довольно увлекательна, и, как у многих стартапов, имеет за своей спиной много взлетов и падений. Firebase берет свое начало от компании Envolve, созданной в 2021 году Эндрю Ли и Джеймсом Тэмплином. (2, 3, 4)

Компания предложила разработчикам API для облегчения интеграции онлайн-чатов для сайтов. После этого основатели Envolve обнаружили, что их чат-сервис используется для передачи сообщений, не связанных с чатами.

Разработчики использовали платформу для синхронизации данных приложений в режиме реального времени. Ли и Тэмплин решили отделить архитектуру, используемую для синхронизации в реальном времени, от системы чатов, что привело к созданию Firebase в 2021 году. Сама платформа была публично запущена в апреле 2021 года.

Первым запущенным продуктом Firebase стала база данных Firebase Realtime. Это API для синхронизации данных приложений, работающих на устройствах Android, Web и iOS. Разработчики приложений могут использовать эту платформу для создания совместимых с различными платформами приложений в реальном времени.

Firebase изначально получила финансирование в размере более 1 миллиона долларов в 2021 году от спонсоров, включая такие компании как Greylock Partners, New EnterpriseAssociates, Flybridge Capital Partners и Founder Collective. Компания также получила финансирование серии А в размере 5,6 миллиона долларов в июне 2021 года от компаний Flybridge Capital Partners и Union Square Ventures. (5)

Firebase Authentication и Firebase Hosting были запущены в 2021 году компанией Firebase, став лидирующей компанией, предоставляющих сервис разработки для мобильных устройств (MBaaS).

Firebase стала частью компании Google в октябре 2021 года. Затем технологический гигант приобрел компанию Divshot, платформу для веб-хостинга, после чего она была объединена с Firebase. (6)

Особенности подключения fa

Чтобы настроить на своем проекте аналитику, вам нужно четко следовать данной документации. Есть уже встроенный в Android Studio плагин, который делает за вас половину работы. Если у вас все в первый раз, то процесс займет не более 15 минут. Хотите API?

А вот и оно, довольно короткое и вроде понятное.После настойки FA через Android Studio Assistant у себя в проекте вы заметите появление нового файла google-services.json. Это специальный файл, в котором прописаны все идентификаторы и пути, которые необходимы для работы в вашем приложении различных гугловских сервисов, в данном случае — для работы FA.Также в ваш корневой build.gradle добавилась такая строчка:

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
    // ...
}

Собственно google-services — это специальный плагин, который распарсивает google-services.json, преобразуя его в обычные строчки, используемые FA. А также google-services добавляет все необходимые зависимости для используемых гугловских сервисов (в нашем случае только для FA). Правда, для этого нужно в app/build.gradle в самом конце добавить:

apply plugin: 'com.google.gms.google-services'

В google-services.json находится вся необходимая информация для подключения вашего проекта к Firebase, причем не только к аналитике, но и ко всем инстументам.

Вот как выглядит примерный google-services.json:
{
  "project_info": {
    "project_number": "887654601522",
    "firebase_url": "https://fir-test3-4bab3.firebaseio.com",
    "project_id": "fir-test3-4bab3",
    "storage_bucket": "fir-test3-4bab3.appspot.com"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:887654601522:android:9c6c1c11f784b956",
        "android_client_info": {
          "package_name": "com.example.matsyuk.firebasetest3"
        }
      },
      "oauth_client": [
        {
          "client_id": "887654601522-o8rolth1g5mq5qq650844chk07mib2un.apps.googleusercontent.com",
          "client_type": 1,
          "android_info": {
            "package_name": "com.example.matsyuk.firebasetest3",
            "certificate_hash": "82f13b732dec32c5ebd4498c3a7acf4bda23a846"
          }
        },
        {
          "client_id": "887654601522-4riqkg424gb236q6mqehksn03u4hoqqg.apps.googleusercontent.com",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "AIzaSyAYRPNTcgxWP7qUzI__kx9gSwxnIgc3iBo"
        }
      ],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "appinvite_service": {
          "status": 2,
          "other_platform_oauth_client": [
            {
              "client_id": "887654601522-4riqkg424gb236q6mqehksn03u4hoqqg.apps.googleusercontent.com",
              "client_type": 3
            }
          ]
        },
        "ads_service": {
          "status": 2
        }
      }
    }
  ],
  "configuration_version": "1"
}

С помощью плагина google-services данный json преобразуется в набор строчек, сгенерированных в файл your_projectappbuildgeneratedresgoogle-servicesdebugvaluesvalues.xml:

События fa. «гладко было на бумаге, да забыли про овраги»

Вы обратили внимание, что как-то подозрительно много говорится про предопределенные названия событий и параметров. И в показательных примерах обычно посылаются именно такие события с параметрами. А это ведь неспроста. Допустим, вы посылаете событие с десятью кастомными параметрами. И тогда в консоли по вашему событию вы увидите следующее (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub
«Но где же все мои параметры?» — спросите вы. А нет их на консоли, вот так вот.
Дело в том, что все красивые графики и прочее строятся, только если вы используете предопределенные названия. Используете свое, «кастомное», ничегошеньки не увидите. Только «количество событий» да «количество пользователей».
И до I/O 17 это было прям страшной болью. Графики можно было строить, играя, например, с параметром Value, как в этой статье. Но это, конечно, все не то.

И тут, конечно же, пора бы вспомнить про GA, где все для людей, строй всякие там фильтры по чему угодно и сколько душе угодно.Но и тут маленькая засада. Стандартные отчеты — да, стройте без проблем. Но в большинстве случаев нам нужны и кастомные отчеты.

Дополнительный анализ:  Марк Гойхман: экспертное мнение по теме Весь рынок от 24 августа 2021 | Страница 1

Например, добавить Secondary dimension, чтобы отсортировать события по моделям устройств. И вот тут всплывает страшное слово «Sampling».В зависимости от отчета алгоритм сэмплирования в GA различается. То, как конкретно считается семпл для каждого отчёта, «Гугл» не раскрывает, но в целом все практики уже известны.

Обычно это hi-based-сэмплирование или cookie-based-сэмплирование. В первом случае берется рандомная выборка из всех записей (событий, просмотров и т.д.), во втором — рандомная выборка по всем пользователям (размеченным кукам или gaid/idfa, если это мобильное приложение).

Поэтому нельзя достоверно говорить об ошибке по каждому полю.По практике говорят, что при выборке больше 5% ошибка в абсолютных числах в отчетах по событиям составляла меньше 2,5%.За предоставление информации о сэмплировании хочу выразить благодарность Александру Сергееву из «Яндекса».

События fa. продолжение

Да уж. Все непросто с этими «Событиями». И на самом деле FA идет навстречу пожеланиям простого люда.
Во-первых, никакого сэмплинга в FA нет. Там доступны все данные.
И это очень круто, так как стоимость Google Analytics 360 (платной версии GA без сэмплинга) весьма немаленькая. А в FA вы можете ваши данные выгрузить в BigQuery и там делать с ними все что угодно.
Во-вторых, после I/O 17 появилась возможность строить отчеты и по кастомным параметрам.
Вам прямо на экране конкретного события предлагается зарегистрировать кастомные параметры (рисунок кликабельный):
quickstart-unity/readme.md at master · firebase/quickstart-unity · GitHub

Но учтите, что всего для данного приложения вы можете зарегистрировать до 50 таких параметров (10 текстовых и 40 числовых). Пробовал лайфхак для обхода данного ограничения: регистрировал для разных событий кастомные параметры с одинаковыми именами.

Не помогло, все равно делается «плюс один».Кроме того, если вы ожидаете увидеть сразу готовые отчеты, спешу вас разочаровать. Отчеты строятся накопительным образом. Допустим, есть у вас «event_1» с кастомным параметром «custom_1», для которого вы хотите построить отчет.

В консоли вы настроили, чтобы строился данный отчет в момент времени X. Так вот в отчет попадут все события «event_1», которые придут после момента времени X. А все «event_1» до момента X, увы, не будут обработаны. Так что будьте внимательны.То есть вроде бы лучше стало, но не сильно.

Что еще обидно, вы не можете эти отчеты как-то совмещать друг с другом. Но, пожалуй, мы слишком многого хотим от консоли. Если уж вы хотите делать с данными все что угодно, то добро пожаловать в удивительный мир BigQuery. Давайте немного приоткроем эту завесу таинства данных.

События. fa другая аналитика

Думаю, в каждом приложении есть как минимум два аналитических инструмента. Обычно их гораздо больше. Аналитики тоже прогрессивные люди и не стоят на месте. Но нам все это поддерживать. Да и плюс трафик. Так что же лучше сделать?Есть очень хорошая гугловская статья, которая уже была упомянута мною, где описываются различные варианты.

Кратко представлю их, чтобы вы имели представление:

  1. Просто отдельно слать разные аналитики. В коде вы, скорее всего, создадите некий универсальный фасад, который и будете использовать везде.
    Минусы, я думаю, понятны. Больше трафика и кода.
  2. Google Tag Manager.
    Данный менеджер подключается через консоль и там же настраивается. Суть в том, что в коде вы вообще ничего не делаете дополнительно (за исключением build.gradle и добавления конфигурационных файлов), просто шлете FA-события — и все. А уже на своей стороне Google Tag Manager трансформирует FA-события по заданным вами правилам в события аналитик, которые вам нужны (GA, AppsFlyer и прочие партнеры Google Tag Manager). Там же вы можете настраивать все возможные триггеры, по которым события FA будут попадать в другие аналитики (например, для какой-то аналитики нужны только строго определенные события).
    Звучит прям очень круто и гибко. Сам, к сожалению, не пробовал, так как нужно определенное время, чтобы погрузиться и разобраться, что есть что там. Если у кого есть опыт, пишите, будет очень круто более подробно расписать Google Tag Manager. Пока же кину статью, с которой можно попробовать начать.
    Но есть минусы. Первое — необходимо время, чтобы настроить все тэги для всех событий, да и вообще просто разобраться. Второе — вы не можете использовать FA и Google Tag Manager для отправки в GA ecommerce data.
  3. BigQuery.
    Это относится, конечно же, к GA и FA, когда вам необходимо совместить данные. Но выгрузить данные с GA в BigQuery вы сможете, только если у вас Google Analytics 360.

Стоимость услуг firebase

Firebase предлагает бесплатный план, на котором можно реально работать, для своих пользователей. Однако не существует фиксированного и единого тарифного плана для пользователей, на котором вы могли бы остановиться и начать работу. (7)

ПланОписание
Spark
(БесплатныйПлан)
План Spark от Firebase доступен абсолютно бесплатно и включает хостинг 10 ГБ, SSL сертификат, несколько сайтов, личный домен и несколько других предложений. Он имеет включает многие полезные службы, такие как Firebase ML, Realtime Database, Cloud Firestore и Test Lab. Существует достаточное количество вариантов, как можно использовать план Firebase Spark.  
Blaze
(Плати заРеальноепотребление)
План Blaze от Firebase доступен в рамках модели ценообразования с оплатой за использование. Он поставляется со всеми функциями плана Spark, а также некоторыми дополнительными функциями, которые улучают разработку. На этом плане пользователи должны платить 0.026$ за 1 ГБ хостинга и столько же за каждый ГБ хранилища. Многие ограничения плана Spark снимаются использованием плана Blaze. Калькулятор плана Blaze доступен на сайте Firebase, он может быть удобным инструментом для расчета примерного объема будущих расходов. 

Бесплатный план имеет определенные ограничения и, например, не дает разработчикам доступа к Облачным Функциям.

Blaze, это тарифный план с оплатой за использование каждого сервиса по отдельности, например, Cloud Firestore, Облачные Функции, Аутентификация, Хостинг, Машинное Обучение Firebase, Realtime Database, и Хранилище.

  • Firebase Всегда Предоставляет Бесплатные Сервисы

Firebase всегда предоставляет Множество Бесплатных сервисов, которые дают возможность разработчикам начать работу над своими проектами.

Эти услуги бесплатны, независимо от того, какой план вы выберете. Посмотрите на различные услуги, предлагаемые на платформе, которые являются бесплатными.

  • Использование приложений для тестирования. 
  • Индексация приложений поисковыми системами
  • Использование нескольких версий приложений для A/B тестирования
  • Прогнозирование производительности приложений и формирование отчетов
  • Выстраивание общения с клиентами приложений посредством интегрированных сообщений
  • Автоматические уведомления и обмен сообщениями пользователей через Android, iOS и веб-приложений с помощью Firebase Cloud
  • Мониторинг производительности приложений от Firebase
  • Выявление сбоев в приложениях с помощью Firebase Crashlytics
  • Редирект пользователей между различными платформами с помощью динамических ссылок
  • Удаленная настройка приложения
  • Использование Машинного Обучения от Firebase позволяет прогнозировать количество возвращающихся пользователей. 

На вкладке Usage консоли Firebase можно проверить статус оплаты плана и информацию, связанную с использованием различных служб Firebase.

  • Вкладка Хранилище (Storage)— На вкладке «Хранилище» отображается общий объем данных в базе данных, кроме данных, хранящихся в других сервисас Firebase. 
  • Вкладка Подключения (Connections)— Вкладка Подключения содержит информацию об общем количестве подключений в режиме реального времени, включая WebSockets. 
  • Вкладка Загрузка (Load)— Эта вкладка содержит графическое отображение загрузки приложения и показывает эти данные пользователям в течение определенного промежутка времени. 
  • Вкладка Загрузки (Downloads)— содержит информацию, относящуюся к общему объему данных, загруженных из базы данных.

Для получения более подробной информации о ценообразовании Firebase читайте здесь.

Fa. выводы

Немаленькая у нас в итоге получилась статья. Давайте попробуем подвести итоги.

Плюсы:

  1. FA — это активно развивающийся продукт. Примерно с февраля я наблюдаю за его развитием и должен отметить, что команда разработки старается максимально реализовывать первоочередные потребности пользователей.
  2. FA events BigQuery. Это прямо главное преимущество FA. У вас есть доступ ко всем событиям вашего приложения практически бесплатно. И если в вашей команде есть спец по BigQuery, то вам чертовски повезло. Кроме того, сами «события» в FA намного более гибкие и удобные в использовании.
  3. Минимализм. В консоли, по сути, только самое необходимое. Акцент делается на «события». В GA же все-таки много всего намешано, и далеко не все нам нужно.
  4. Интеграция с другими проектами Firebase. Будь то сбор крашей или RemoteConfig. Продукты действительно дополняют друг друга, и это открывает новые возможности.

Минусы:

  1. Ребятам еще много работать, особенно в консоли. Но мы верим в них =)
  2. Разбросанность информации. Это то, о чем я говорил в самом начале статьи. Каждый вопрос или уточнение нужно искать и ресерчить. Отсутствие упорядоченности тоже сбивает вначале. Но данная статья в принципе призвана устранить данный недостаток.

Меня часто спрашивают, так стоит ли использовать FA или нет. Может, вполне достаточно GA? Или сразу обе аналитики не достойны места в вашем продукте?Однозначного ответа нет. Все очень зависит от потребностей ваших аналитиков и маркетологов. А также зависит от способностей ваших аналитиков осилить BigQuery.

Оцените статью
Аналитик-эксперт
Добавить комментарий

Adblock
detector