Jump to content

Подключение Yandex AppMetrica для FGX Native приложений для iOS


Yaroslav Brovin

1,309 views

Всем хорошей рабочей недели!

Год назад мы поделились руководством по подключению популярного сервиса платформы для аналитики и маркетинга приложения Yandex AppMetrica для Android. В этой статье с мы рассмотрим, как начать использовать этот же сервис для iOS платформы. 

Подключение FGX Native приложения для Android платформы рассмотрено в другой статье: 

Для того, чтобы начать использовать AppMetrica в вашем приложении нужно выполнить два шага:

  1. Зарегистрировать ваше приложение на стороне Yandex
  2. Подключить библиотеку Yandex AppMetrika и выполнить инициализацию ключом API.  

Регистрация приложения в Yandex AppMetrika

1. Создаем новый проект в учетной записи AppMetrika и даем ему название:

image.png

Затем далее и добавить. По окончании добавления сервис отобразит ваш API ключ, который нужно запомнить. Он будет использовать для взаимодействия вашего приложения и сервиса Yandex AppMetrika.

image.png

Теперь переходим к настройкам вашего проект, путем нажатия на кнопку настройки проекта в левой панели.

image.png

Теперь нам необходимо связать наш проект с iOS приложением. Среди большого числа настроек нас интересует вкладка "Основное" -> "Universal Link". Нам необходимо заполнить поля Bundle ID и App Prefix на основании данных вашего iOS приложения, зарегистрированного в портале Apple Developer.

image.png

  • AppPrefix - это уникальный префикс, выданный Apple при участии в программе iOS разработчиков. Он же добавляется к названию пакета iOS приложения, тем самым формируя уникальное название приложения. Его можно найти в личном кабинете Apple на вкладке Membership:
    image.png
  • Bundle ID - это идентификатор пакета вашего FGX Native приложения. Если приложение уже зарегистрировано, то вы можете найти название пакета на сайте Apple в разделе Identifiers
    image.png

После того, как вы указали все данные, необходимо включить "Использовать Universal Link" - это специальная технология, которая призвана обезопасить передачу статики с устройств пользователя на сервера Yandex.

image.png

Чтобы закончить настройку, необходимо включить поддержку Universal Link на стороне профиля разработчика Apple. Для этого необходимо открыть настройки приложения в консоли Apple и включить поддержку "Associated Domains".

image.png

Теперь ваш профиль приложения сконфигурирован для приема статистики с вашего приложения. Переходим к подключению Yandex AppMetrica к FGX Native приложению. 

Подключение и инициализация Yandex AppMetrica в FGX Native приложении

1. Скачиваем статическую версию AppMetrica SDK.
Yandex SDK 3.17.0.zip

2. Скачиваем заголовочные файлы для Delphi. 

Yandex.Api.MobileMetrica.iOS.pas

3. Скачиваем модуль регистрации и инициализации AppMetrica. Этот модуль содержит код по регистрации вашего приложения в сервисе Yandex для iOS и Android.

Yandex.AppMetrica.pas

4. Добавляем модуль в ваш проект и в проектном файле вызываем метод инициализации InitYandexMetrika указанием API ключа, выданном на этапе регистрации проекта в Yandex.

program YandexMetrika;

uses
  FGX.Application,
  FGX.Forms,
  Form.Main in 'Form.Main.pas' {Form.Main: TfgForm},
  Yandex.AppMetrica in 'Yandex.AppMetrica.pas';

{$R *.res}


begin
  InitYandexMetrika('Ваш API ключ');

  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  Application.Run;
end.

5. Настраиваем линковку проекта с Yandex AppMetrica SDK.

5.1. Добавляем в настройках среды переменную окружения "YandexMetrica": "Tools" -> "Options" -> "IDE" -> "Environment Variables". Указываем путь к месту, где у вас распакован AppMetrica SDK.

image.png

5.2 В настройках проекта указываем пути для линковки. "Project" -> "Options..." -> "Building" -> "Delphi Compiler" -> "Search Path".

Выбираем конфигурацию "All Configuration -> iOS Deice 64-bit platform" и указываем следующие пути в "Search Path":

$(YandexMetrica)\YandexMobileMetrica.framework;
$(YandexMetrica)\YandexMobileMetricaCrashes.framework

5.3 В настройках линковки передаем дополнительный ключ "-ObjC" линковки: "Project" -> "Options..." -> "Building" -> "Linking" -> "Options passed to the LD linker".

6. Все. Теперь выполняем сборку приложения и запуск на устройстве. В результате ваше приложение должно успешно стартовать, а через некоторое время вы увидите статистику в личном кабинете AppMetrica.

image.png

 

  • Like 6
  • Thanks 2

10 Comments


Recommended Comments

Ярослав, большое спасибо за подробную инструкцию!

Отдельно хочу отметить, что при использовании в приложении компонента TFDConnection с драйвером SQLite (TFDConnection.DriverName=SQLite), по-умолчанию устанавливается режим статической привязки движка SQLite. Что в свою очередь, после интеграции YandexMetrica, приводит к падению iOS-приложения при запуске.

Для исправления проблемы необходимо:
1. вместе с TFDConnection разместить компонент TFDPhysSQLiteDriverLink;
2. установить динамическую привязку SQLite: TFDPhysSQLiteDriverLink.EngineLinkage=slDynamic;
3. в модуле, который использует TFDConnection, из uses удалить FireDAC.Phys.SQLiteWrapper.Stat

Обратите внимание!
Все вышеописанное справедливо ТОЛЬКО для iOS!

Для Android необходима статическая привязка движка SQLite!

Чтобы ваше приложение на Android смогло работать с БД, необходимо пойти по одному из вариантов:
1. для Android использовать отдельный модуль данных со статической привязкой SQLite;
2. перед сборкой Android-приложения вернуть значение TFDPhysSQLiteDriverLink.EngineLinkage=slStatic.

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

Edited by Roman
  • Thanks 2
Link to comment

Ярослав, спасибо за инструкцию, жаль только, что  в связи с моей геолокацией, это не поможет.

Было бы очень интересно посмотреть пример использования GoogleMap.framework На IOS.

У меня, увы, не получилось.

Спасибо.

Link to comment
12 минут назад, gandalf сказал:

А где можно увидеть версию для Android?

Добрый день, gandalf!

В самом начале этой статьи есть ссылка на статью, описывающую интеграцию в Android-приложение:

 

Link to comment

Я вижу там плашку "Извините, но мы не можем отображить этот контент, у вас нет прав на просмотр.". Что мне нужно сделать, чтобы увидеть материал?

Link to comment
  • Administrators

Добрый вечер,

Статья для Андроида доступна только пользователям с подпиской. 

Link to comment

Хорошо... попробуем ios версию. При попытке сборки получаю такую ошибку. Решается удалением YandexMobileMetricaCrashes, но это как-то не комильфо.

Checking project dependencies...
Compiling demo.dproj (Release, iOSDevice64)
dcciosarm64 command line for "demo.dpr"
  d:\home\user\bin\embarcadero\studio\22.0\bin\dcciosarm64.exe -$D0 -$L- -$Y- --no-config -M -Q -AGenerics.Collections=System.Generics.Collections;
  Generics.Defaults=System.Generics.Defaults -DRELEASE -E..\bin\iOSDevice64\Release -I"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK
  3.17.0\YandexMobileMetrica.framework";"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK 3.17.0\YandexMobileMetricaCrashes.framework";
  d:\home\user\bin\embarcadero\studio\22.0\lib\iOSDevice64\Release -LEC:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\iOSDevice64
  -LNC:\Users\Public\Documents\Embarcadero\Studio\22.0\Dcp\iOSDevice64 -NU..\dcu\iOSDevice64\Release -NSSystem;Xml;Data;Datasnap;Web;Soap;
  -O"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK 3.17.0\YandexMobileMetrica.framework";
  "D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK 3.17.0\YandexMobileMetricaCrashes.framework";
  d:\home\user\bin\embarcadero\studio\22.0\lib\iOSDevice64\Release -R"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK
  3.17.0\YandexMobileMetrica.framework";"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK 3.17.0\YandexMobileMetricaCrashes.framework";
  d:\home\user\bin\embarcadero\studio\22.0\lib\iOSDevice64\Release -U"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK
  3.17.0\YandexMobileMetrica.framework";"D:\home\user\src\delphi\demo\trunk\lib\Yandex SDK 3.17.0\YandexMobileMetricaCrashes.framework";
  d:\home\user\bin\embarcadero\studio\22.0\lib\iOSDevice64\Release --syslibroot:C:\Users\user\Documents\Embarcadero\Studio\SDKs\iPhoneOS14.5.sdk
  --frameworkpath:C:\Users\user\Documents\Embarcadero\Studio\SDKs\iPhoneOS14.5.sdk\System\Library\Frameworks;
  C:\Users\user\Documents\Embarcadero\Studio\SDKs\iPhoneOS14.5.sdk\System\Library\PrivateFrameworks --linker-option:"-ObjC -arch arm64"
  -NO..\dcu\iOSDevice64\Release  demo.dpr   
[DCC Error] E2597 Undefined symbols for architecture arm64:
    Error: "__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv", referenced from:      __ZNSt3__16vectorINS_10shared_ptrIN5swift8Demangle4NodeEEENS_9allocatorIS5_EEE9push_backERKS5_ in YandexMobileMetricaCrashes(Demangle.o);      __ZN5swift8Punycode14decodePunycodeEN4llvm9StringRefERNSt3__16vectorIjNS3_9allocatorIjEEEE in YandexMobileMetricaCrashes(Punycode.o);      __ZNSt3__16vectorIjNS_9allocatorIjEEE6insertENS_11__wrap_iterIPKjEERS5_ in YandexMobileMetricaCrashes(Punycode.o);
      Error: "__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv", referenced from:      _YMM__ksdm_demangleSwift in YandexMobileMetricaCrashes(KSDemangle_Swift.o);      __ZNK4llvm9StringRef3strEv in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZNSt3__119__shared_weak_count14__release_weakEv", referenced from:      __ZN5swift8Demangle4NodeD2Ev in YandexMobileMetricaCrashes(Demangle.o);      __ZNSt3__123enable_shared_from_thisIN5swift8Demangle4NodeEED2Ev in YandexMobileMetricaCrashes(Demangle.o);      __ZN5swift8Demangle20demangleSymbolAsNodeEPKcmRKNS0_15DemangleOptionsE in YandexMobileMetricaCrashes(Demangle.o);      __ZN5swift8Demangle12nodeToStringENSt3__110shared_ptrINS0_4NodeEEERKNS0_15DemangleOptionsE in YandexMobileMetricaCrashes(Demangle.o);      __ZN5swift8Demangle22demangleSymbolAsStringEPKcmRKNS0_15DemangleOptionsE in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_19Demangler28demangleSpecializedAttributeEv in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_19Demangler14demangleGlobalEv in YandexMobileMetricaCrashes(Demangle.o);      ...
    Error: "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKc", referenced from:      __ZN12_GLOBAL__N_19Demangler28demangleSpecializedAttributeEv in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_19Demangler16demangleTypeImplEv in YandexMobileMetricaCrashes(Demangle.o);      __ZL13archetypeNameyy in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbb in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc", referenced from:      __ZN12_GLOBAL__N_19Demangler18demangleIdentifierEN4llvm8OptionalIN5swift8Demangle4Node4KindEEE in YandexMobileMetricaCrashes(Demangle.o);      __ZL13archetypeNameyy in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_110NameSource9readUntilEcRNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbb in YandexMobileMetricaCrashes(Demangle.o);      __ZZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbbENK3$_0clEbbN4llvm9StringRefE in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter12printContextENSt3__110shared_ptrIN5swift8Demangle4NodeEEE in YandexMobileMetricaCrashes(Demangle.o);      __ZN5swift8Punycode18decodePunycodeUTF8EN4llvm9StringRefERNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE in YandexMobileMetricaCrashes(Punycode.o);      ...
    Error: "__ZNSt3__119__shared_weak_countD2Ev", referenced from:      __ZNSt3__120__shared_ptr_pointerIPN5swift8Demangle4NodeENS_14default_deleteIS3_EENS_9allocatorIS3_EEED1Ev in YandexMobileMetricaCrashes(Demangle.o);      __ZNSt3__120__shared_ptr_pointerIPN5swift8Demangle4NodeENS_14default_deleteIS3_EENS_9allocatorIS3_EEED0Ev in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm", referenced from:      __ZN12_GLOBAL__N_19Demangler16demangleTypeImplEv in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_19Demangler28getDependentGenericParamTypeEjj in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbb in YandexMobileMetricaCrashes(Demangle.o);      __ZZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbbENK3$_0clEbbN4llvm9StringRefE in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter17printFunctionTypeENSt3__110shared_ptrIN5swift8Demangle4NodeEEE in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter35printFunctionSigSpecializationParamENSt3__110shared_ptrIN5swift8Demangle4NodeEEEj in YandexMobileMetricaCrashes(Demangle.o);      __ZN12_GLOBAL__N_111NodePrinter13printChildrenENSt3__111__wrap_iterIPNS1_10shared_ptrIN5swift8Demangle4NodeEEEEES9_PKc in YandexMobileMetricaCrashes(Demangle.o);      ...
    Error: "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEm", referenced from:      __ZN12_GLOBAL__N_19Demangler18demangleIdentifierEN4llvm8OptionalIN5swift8Demangle4Node4KindEEE in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZNSt11logic_errorC2EPKc", referenced from:      __ZNSt12length_errorC1EPKc in YandexMobileMetricaCrashes(Demangle.o);      __ZNSt12length_errorC1EPKc in YandexMobileMetricaCrashes(Punycode.o);
      Error: "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_", referenced from:      __ZN12_GLOBAL__N_111NodePrinter5printENSt3__110shared_ptrIN5swift8Demangle4NodeEEEbb in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm", referenced from:      __ZN12_GLOBAL__N_111NodePrinter13isSwiftModuleENSt3__110shared_ptrIN5swift8Demangle4NodeEEE in YandexMobileMetricaCrashes(Demangle.o);
      Error: "__ZTINSt3__119__shared_weak_countE", referenced from:      __ZTINSt3__120__shared_ptr_pointerIPN5swift8Demangle4NodeENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE in YandexMobileMetricaCrashes(Demangle.o);
  ld: symbol(s) not found for architecture arm64
[DCC Fatal Error] F2588 Linker error code: 1 ($00000001)
Failed
Elapsed time: 00:00:04.0

Link to comment
  • Administrators

Данное решение предложено для использования в связке FGX Native. И это работает отлично.

Link to comment

И еще момент не отраженный в статье. Для работы Universal Link необходимо задать параметр "com.apple.developer.associated-domains", который Delphi IDE задать не позволяет. Приходится подменять шаблон Entitlement.TemplateiOS.xml на рукописный.

Link to comment
1 час назад, Yaroslav Brovin сказал:

Данное решение предложено для использования в связке FGX Native. И это работает отлично.

Вы проверяли его под Delphi 11?

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...