Перейти к содержанию
Fire Monkey от А до Я
  • 0

Отправка событий в Firebase Google Analytics - GA4


HelleR

Вопрос

Добрый день.

Я пытаюсь отправить события из написанного на Delphi 10.4.2 приложения в Firebase  Google Analytics [ GAv4 ]

Пытался работать по инструкции предложенной в посте, но пришлось переделать.

Использую com-google-android-gms.play-services-analytics-impl.16.0.8.jar и обвертку Androidapi.JNI.PlayServices

После запуска в логах приходит следующее:

04-23 15:03:50.835 30878 30878 I GAv4    : Google Analytics 12.4.51 is starting up. To enable debug logging on a device run:
04-23 15:03:50.835 30878 30878 I GAv4    :   adb shell setprop log.tag.GAv4 DEBUG
04-23 15:03:50.835 30878 30878 I GAv4    :   adb logcat -s GAv4
04-23 15:03:50.869 30878 30878 D GAv4    : setLocalDispatchPeriod (sec): 5
04-23 15:03:51.506 30878 30986 D GAv4    : Sending first hit to property: 269XX9293
04-23 15:03:51.508 30878 30986 D GAv4    : Hit delivery requested: ht=1619179430868, _s=0, _v=ma12.4.51, a=2027768350, adid=7b03fae1-XXXX-4820-892a-ba3983eb6b7e, aid=com.XXXXXXX, an=XXXXXXX, ate=1, av=1.0.1, cid=24213dea-e355-XXXX-8b91-17087584684a, ea=lo
gin, ec=login, el=login, ev=87, sr=1080x2030, t=event, tid=269XX9293, ul=ru-ru, v=1
04-23 15:03:51.737 30878 30986 D GAv4    : Hit sent to the device AnalyticsService for delivery

 

Добавил в AndroidManifest.xml

<receiver android:name="com.google.android.gms.analytics.AnalyticsReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
            </intent-filter>
        </receiver>
        <service android:name="com.google.android.gms.analytics.AnalyticsService"
            android:enabled="true"
            android:exported="false"/>

        <!-- Optionally, register CampaignTrackingReceiver and CampaignTrackingService to enable
             installation campaign reporting -->
        <receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>
        <service android:name="com.google.android.gms.analytics.CampaignTrackingService" />    
unit GoogleAnalytics;

interface

 uses
   System.SysUtils,

   System.Types, System.UITypes, System.Classes, System.Variants,
  {$IFDEF ANDROID}
      Androidapi.JNI.PlayServices,
      Androidapi.Helpers,
      Androidapi.JNI.JavaTypes,     
      Androidapi.JNI.GraphicsContentViewText,
  {$ENDIF}
   FMX.Types;

type
     TwGoogleAnalytics=class
       private
        FCollectDataPermission
                      : boolean;
        FGoogleAppId,
        fClient_Id
                      : String;
        {$IFDEF ANDROID}
          FTracker    : Janalytics_Tracker;
          FGoogleAId, JClient_Id  : JString;
        {$ENDIF}
       public
         {$IFDEF ANDROID}
            JGA : Janalytics_GoogleAnalytics;
            property CollectDataPermission: boolean read FCollectDataPermission write FCollectDataPermission;
         {$ENDIF}
          constructor Create;
          procedure SetParams(const aGoogleAppID, aClient_Id:string);
          
         property GoogleAppId:string read FGoogleAppId;
     end;

implementation


 constructor TwGoogleAnalytics.Create;
  begin
   FGoogleAppId := '';
   fClient_Id   := '';
  end;

  procedure TwGoogleAnalytics.SetParams(const aGoogleAppID, aClient_Id : String);
  var
    Map1      : JMap;
    Hit       : JHitBuilders_HitBuilder;
    EventHit  : JHitBuilders_EventBuilder;
    Loger     : Janalytics_Logger;
  begin
   {$IFDEF ANDROID}
    CollectDataPermission := true;//(Ini.CollectDataPermission = PERMISSION_YES);

    JGA   :=  TJanalytics_GoogleAnalytics.JavaClass.getInstance( TAndroidHelper.Context );
    JGA.setDryRun(false);
    JGA.reportActivityStart( SharedActivity );

    FGoogleAId  :=  StringToJString(aGoogleAppID);
    JClient_Id  :=  StringToJString(aClient_Id);
    FTracker    :=  JGA.newTracker(FGoogleAid);

    if FTracker <> nil then
    Begin
      FTracker.enableAutoActivityTracking(true);
      FTracker.enableAdvertisingIdCollection(true);

      EventHit:= TJHitBuilders_EventBuilder.Create;

      EventHit.setAction(StringToJString('login'));
      EventHit.setCategory(StringToJString('login'));
      EventHit.setLabel(StringToJString('login'));
      EventHit.setValue(87);

      Map1 := EventHit.build;


      FTracker.send(Map1);

      JGA.setLocalDispatchPeriod(5);
    End;
   {$ENDIF}
   FGoogleAppId:=aGoogleAppID;
  end;
...
end.

Но никакой информации в аналитику не приходит. Из описания наверняка не понятно что передается в параметре TrackingId (tid) поэтому передавал туда, все что было в google-services.json (перебирал варианты) и также идентификатор потока и id ресурса гугл аналитики. 

Возможно библиотека из дистрибутива delphi 10.4.2 [ com-google-android-gms.play-services-analytics-impl.16.0.8.jar ] устарела, а как обновить до 17.4.1 я не разобрался, везде предлагают gradle, но как получить в итоге jar я не понял. 

Буду рад любым мыслям, спасибо.

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Добрые люди подсказали, что GAv4 это совсем не GA4 Firebird, f 4 -ая версия универсальной аналитики, которая мне не подойдет, так как мне нужна аналитика только для приложений. А библиотеки под Firebase нет, только gradle...

Ссылка на комментарий
  • 0

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

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

Ссылка на maven репозиторий

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

После общения с поддержкой от Firebase (если сильно упростить), мне предложили изменить среду разработки. Но приложение уже было полностью готово для двух мобильных платформ, и мне пришлось искать другие SDK. 

Я перебрал многие, которые предлагали помимо установки с помощью Gradle, скачать SDK в виде файла jar или aar (из aar иногда можно добыть jar, но это только иногда, например в последних firebase его там нет)

Забыл сказать, что для всех манипуляций, обязательно нужна установленная и запущенная Android Studio, и подключенный телефон, на который Delphi устанавливает приложение. В Android Studio я собрал проект с таким же именем, как и у моего Delphi приложения, для удобства отладки и контроля логов logcat. В приложение на Android Studio я подключил через Gradle нужное мне SDK и проверил его работоспособность, скопировал логи правильной работы приложения, отследил результаты на сайте аналитики, увидел что они действительно появились, и все данные телефона (размер экрана, марка ...) пришли в аналитику. Включил режим debag на стороне аналитики. 

Эти действия я проделывал и с Firebase, приложение написанное на Android Studio запускалось без проблем, приложение написанное на Delphi, в силу отсутствия новой библиотеки jar не запускалось и сыпало в logcat целые "простыни" ошибок, никакие данные в аналитику не приходили.

Я пробовал вытащить нужную мне библиотеку Firebase из собранного в Android Studio dex файла, рабочего приложения. Затем вычленить из него нужные мне файлы и прикрепить их Delphiпроекту в виде jar библиотеки, но появлялась новая проблема, конфликты с уже установленными библиотеками на Delphi, отключение которых уже не позволяло собрать dex файл для Delphi проекта.

Остановился я на  SDK AppsFlyer, интеграция была возможна, так как сервис предлагал добавление SDK с помощью Gradle и возможность скачать и установить вручную. Саму библиотеку я подключил, но возникла проблема с получением событий, которые приходили например от google play

Вот пример того что не получилось сделать:

AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
            @Override
            public void onConversionDataSuccess(Map<String, Object> conversionData) {
            
                    for (String attrName : conversionData.keySet()) {
                    Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
                }
            }

Эти события, никак не удалось получить, и решить проблему не удалось, информации я не нашел.

Было принято решение попробовать другое SDK. На этот раз это была Yandex AppMetrica, эта интеграция получилась.

Для начала у них в доках по интеграции написано что есть возможность скачать jar и что все библиотеки (старые версии мне в дальнейшем тоже пригодились) есть в maven репозитории

Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи 

 

Screenshot_1.jpg.06cc15edf43e9e8c44962f28712cc063.jpg

Вот сама библиотека: com.yandex.androidmobmetricalib3.20.1.jar.7z

Файл мост я создавал с помощью утилиты java2op, которая находится в ... Embarcadero\Studio\21.0\bin\converters

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

Файл мост был создан. Android.JNI.Yandex.pas.7z

Осталось подключить его к моему приложению. Был создан класс, который работал с нужными мне методами SDK Yandex аналитики (Android.JNI.Yandex):

unit YandexAnalytics;

interface

 uses
   System.SysUtils,


   System.Types, System.UITypes, System.Classes, System.Variants,
  {$IFDEF ANDROID}
      Android.JNI.Yandex,
      Androidapi.Helpers,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNI.Os,
      Androidapi.JNI.App,
  {$ENDIF}
   FMX.Types;

type
  TYandexMetrica = class
   private

   public
     {$IFDEF ANDROID}
        YAC : JYandexMetricaConfig;
        YA  : JYandexMetrica;
     {$ENDIF}

     constructor Create;
     procedure SendEvent(Category, Action, LabelName : String; LabelValue : Integer);
end;

implementation

constructor TYandexMetrica.Create;
var
  AnKey,
  AnRepKey
             : JString;
begin
  try
     AnKey     := StringToJString('86e64a77-XXXX-XXXX-XXXX-XXXXXXXcbbc');
     AnRepKey  := StringToJString('20799a27-XXXX-XXXX-XXXX-XXXXXXX14180');

     YAC   := TJYandexMetricaConfig.JavaClass.newConfigBuilder(AnKey).withLogs().build;
     YA    :=  TJYandexMetrica.Create;

     TJYandexMetrica.JavaClass.activate(TAndroidHelper.Context, YAC);
     TJYandexMetrica.JavaClass.enableActivityAutoTracking( TAndroidHelper.Activity.getApplication );

     Log.d('================= TYandexMetrica.Created ======================');
  EXCEPT on E : Exception do
    Begin
      Log.d( E.ClassName + 'YandexMetrica.Create -> ' + E.Message );
    End;
  END;
end;

procedure TYandexMetrica.SendEvent(Category, Action, LabelName : String; LabelValue : Integer);
begin
 {$IFDEF ANDROID}
   try

      Log.d( 'TRY YandexMetrica.SendEvent -> ' + Category + ',' + Action + ',' + LabelName + ',' + LabelValue.ToString );
      TJYandexMetrica.JavaClass.reportEvent(StringToJString(Category),
              StringToJString('{"Action":"' + Action + '", "LabelName":"' + LabelName + '", "LabelValue":"' + LabelValue.ToString + '"}'));

      Log.d('================= Event Sended ======================');

   EXCEPT on E : Exception do
    Begin
      Log.d( E.ClassName + 'YandexMetrica.SendEvent -> ' + E.Message );
    End;
  END;
 {$ENDIF}
end;

end.

В событии приложения onCreate создал  экземпляр класса, и отправил событие
 

YA := TYandexMetrica.Create;
YA.SendEvent('AppEvent','Started',User.Client_Id, 0);

 

Было добавлено в файл AndroidManifest.template.xml (информация из яндекс документов по интеграции)

 <%services%>
   
		<service android:name="com.yandex.metrica.MetricaService" android:enabled="true" android:exported="true" android:process=":Metrica">
			<intent-filter>
				<category android:name="android.intent.category.DEFAULT" />
				<action android:name="com.yandex.metrica.IMetricaService" />
				<data android:scheme="metrica" />
			</intent-filter>
			<meta-data android:name="metrica:api:level" android:value="16" />
		</service>
		<receiver android:name="com.yandex.metrica.MetricaEventHandler" android:enabled="true" android:exported="true">
			<intent-filter>
				<action android:name="com.yandex.metrica.intent.action.SYNC" />
			</intent-filter>
			<intent-filter>
				<action android:name="android.intent.action.PACKAGE_ADDED" />
				<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
				<data android:scheme="package" />
			</intent-filter>
			<!-- Необходимо для трэкинга кампаний -->
			<intent-filter>
				<action android:name="com.android.vending.INSTALL_REFERRER" />
			</intent-filter>
		</receiver>

Пример логов из logcat, из которых видно что библиотека инициализирована, и отправлены два события [AppEvent] и [Balance]

2021-07-01 14:02:17.108 15138-15168/? I/AppMetrica: [ru.yandex.mobile.appmetrica] : [27889a6e-xxxx-xxxx-xxxx-xxxxxxxx3c64] Initializing of Metrica, Release type, Version 3.5.3, API Level 76, Dated 30.01.2019.
2021-07-01 14:58:48.979 18460-18460/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021.
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: Activate AppMetrica with APIKey 86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Enable activity auto tracking
2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"Started", "LabelName":"2905202123125", "LabelValue":"0"}
2021-07-01 14:58:49.034 18460-18531/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180
2021-07-01 14:58:49.233 18542-18567/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021.
2021-07-01 14:58:49.263 18542-18567/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180
2021-07-01 14:59:13.975 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"ProfilesDeleted", "LabelName":"alex", "LabelValue":"319"}
2021-07-01 14:59:31.368 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: Balance. With value: {"Action":"TrStart", "LabelName":"2905202123125", "LabelValue":"3"}

 

Вот такие данные пришли в аналитику. +1 пользователь

Screenshot_4.thumb.jpg.a31ee3d90cc969a973fd71d220fd02db.jpg

 

+2 события

Screenshot_5.thumb.jpg.628b6982051cf69f91ef64854e10c933.jpg

 

 

 

Изменено пользователем HelleR
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...