Jump to content

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


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

Год назад мы поделились руководством по подключению популярного сервиса платформы для аналитики и маркетинга приложения 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

Roman

Posted (edited)

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

Отдельно хочу отметить, что при использовании в приложении компонента 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
Stas

Posted

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

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

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

Спасибо.

gandalf

Posted

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

Roman

Posted

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

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

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

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

 

gandalf

Posted

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

  • Administrators
Yaroslav Brovin

Posted

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

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

gandalf

Posted

Хорошо... попробуем 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

  • Administrators
Yaroslav Brovin

Posted

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

gandalf

Posted

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

gandalf

Posted

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

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

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

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...