Интеграция AppsFlyer SDK — Unity. Информация для разработчиков

  • Рекламодатели
  • Разработчики

Official_unity_logo.png

Текущая версия SDK для Unity:  v4.20.1
Создан на основе SDK для Android версии 4.10.0 и SDK для iOS версии 4.10.0

1. Обзор

SDK AppsFlyer для Unity позволяет регистрировать установки приложений и события в проектах Unity для платформ Android и iOS. Можно регистрировать установки приложения, обновления и сеансы, а также другие события после установки (в том числе покупки в приложении, уровни игры и т.п.), что позволяет оценивать ROI и уровень вовлеченности пользователей.

В мобильные приложения, созданные на платформе Unity, можно интегрировать SDK AppsFlyer и использовать его для атрибуции установок приложений, предназначенных как для Android, так и для iOS. Это руководство содержит подробные инструкции по интеграции SDK AppsFlyer в проекты Unity и для iOS, и для Android.

 Примечание

AppsFlyer поддерживает интеграцию с Unity версии 5 и выше

 Важно!

Google Play Install Referrer API поддерживается, начиная с плагина Unity версии 4.16.0. Для использования нового Referrer API обновите плагин до 4.16.0 или более поздней версии.

 Совет

  • Для БАЗОВОЙ интеграции SDK, то есть для использования только функции атрибуции установок, необходимо ОБЯЗАТЕЛЬНО выполнить действия, описанные в пунктах 2 и 3.
  • Использование функций, описанных в пункте "Регистрация внутренних событий приложения", НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ.
  • Остальные функции, описанные в этой статье, использовать НЕОБЯЗАТЕЛЬНО, хотя некоторые из них могут оказаться полезными для вашего приложения в зависимости от логики его функционирования. Например, использование при первом запуске приложения таких функций, как регистрация доходов или получение данных о конверсиях, может оказать существенную помощь в его продвижении.

2. Начало работы

2.1 Загрузка плагина AppsFlyer для Unity

Этот плагин можно загрузить на веб-сервисе Github по ссылке https://github.com/AppsFlyerSDK/Unity

Далее даны инструкции по интеграции плагина AppsFlyer для использования с платформой Unity.

2.2 Установка плагина

Далее даны инструкции по установке плагина AppsFlyer:

  1. Выполните импорт пакета AppsFlyerUnityPlugin.unitypackage в свой проект Unity.
  2. Последовательно выберите Assets >> Import Package >> Custom Package
  3. Выберите файл AppsFlyerUnityPlugin.unitypackage.

2.3 Обязательные настройки для Android и iOS

Настройки для Android


Настройка ресивера AF и разрешений для AndroidManifest.xml:

<!-- receiver should be inside the <application> tag -->
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>
<!-- Mandatory permission: -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />


Настройка требуемых разрешений

Файл AndroidManifest.xml должен содержать следующие разрешения:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional : -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />


Настройка BroadcastReceiver в AndroidManifest.xml

Есть два варианта реализации приемника широковещательных сообщений об источнике установки (параметр referrer):

Использование одного Broadcast Receiver Использование нескольких Broadcast Receiver

Если в файле AndroidManifest.xml для INSTALL_REFERRER не зарегистрирован приемник, добавьте следующий приемник в тег <application>:

<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
  <intent-filter>
     <action android:name="com.android.vending.INSTALL_REFERRER" />
   </intent-filter>
</receiver>

Настройки для iOS


Linked Frameworks and Libraries


После создания проекта в Unity для xCode необходимо добавить Security.Framework в разделLinked Frameworks and Libraries xCode, если данная структура не была добавлена ранее.


iOS Apple Search Ads

Добавьте такие файлы:

AdSupport.framework
AppsFlyer выполняет сбор идентификаторов IDFA только при наличии в проекте приложения этой инфраструктуры. Без этой инфраструктуры невозможно атрибутировать установки, выполненные в Facebook, Twitter и большинстве других рекламных сетях.
iAd.framework

Настоятельно рекомендуется включить эту инфраструктуру в проект приложения, т.к. она необходима для атрибуции в сети Apple Search Ads.

3. Инициализация SDK

В методах Start / Init выполняется настройка ключа разработчика AppsFlyer и уникальных ID приложений, используемых в iTunes и Google Play.  Примите во внимание, что при задании ID приложений для iOS здесь нужно использовать только цифры без префикса "id".

Добавьте следующий код:

Плагин Unity 4.15.1 и выше Плагин Unity 4.14.3 и ниже
void Start () {
/* Mandatory - set your AppsFlyer’s Developer key. */
AppsFlyer.setAppsFlyerKey ("YOUR_APPSFLYER_DEV_KEY");
/* For detailed logging */
/* AppsFlyer.setIsDebug (true); */
#if UNITY_IOS
  /* Mandatory - set your apple app ID
   NOTE: You should enter the number only and not the "ID" prefix */
  AppsFlyer.setAppID ("YOUR_APP_ID_HERE");
  AppsFlyer.trackAppLaunch ();
#elif UNITY_ANDROID
  /* Mandatory - set your Android package name */
  AppsFlyer.setAppID ("YOUR_ANDROID_PACKAGE_NAME_HERE");
  /* For getting the conversion data in Android, you need to add the "AppsFlyerTrackerCallbacks" listener.*/
  AppsFlyer.init ("YOUR_APPSFLYER_DEV_KEY","AppsFlyerTrackerCallbacks");
#endif
}

 Важно!

  • В коде для ОС Android метод AppsFlyer.init включает в себя вызов trackAppLaunch. Поэтому не включайте вызов trackAppLaunch в сборку плагина Unity для Android.
  • В iOS отклик на вызов для получения данных о конверсиях инициируется в классе AppsFlyerTrackerCallbacks.cs.

4. Регистрация внутренних событий приложения

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

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

 Примечание

Название события внутри приложения должно содержать не более 45 символов. Названия, в которых более 45 символов, не отображаются на панели управления. Их можно увидеть только в необработанных данных, полученных с помощью Push и Pull API.


Пример регистрации события:

System.Collections.Generic.Dictionary<string, string> purchaseEvent = new  
System.Collections.Generic.Dictionary<string, string> ();
purchaseEvent.Add ("af_currency", "USD");
purchaseEvent.Add ("af_revenue", "0.99");
purchaseEvent.Add ("af_quantity", "1");
AppsFlyer.trackRichEvent ("af_purchase", purchaseEvent);

 Примечание

Начиная с SDK для Unity версии 4.15.1, AppsFlyer поддерживает не только английские символы для событий внутри приложения и всех других API для SDK.

5. Настройка диплинкинга

Для глубоких ссылок следуйте указаниям для вашей операционной системы.

AndroidiOS
Добавьте в файл манифеста следующие строки:

<activity android:name="com.appsflyer.GetDeepLinkingActivity" android:exported="true">
 <intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="your_scheme" />
 </intent-filter>
</activity>

Для получения данных диплинкинга необходимо применить обратный вызов метода onAppOpenAttribution (входит в состав класса AppsFlyerTrackerCallbacks), который вызывается из SDK AppsFlyer. Этот вызов возвращает параметры ссылки Onelink или ссылки атрибуции, которые используются для запуска приложения. Затем можно проанализировать значения и применить логику для вызова соответствующей страницы приложения.

public void onAppOpenAttribution(string validateResult) {
	print ("AppsFlyerTrackerCallbacks:: got onAppOpenAttribution = " + validateResult);
}

6. Регистрация данных о доходах

Используйте параметр события AFInAppEvents.REVENUE для подсчета выручки как части события внутри приложения. Этому параметру можно присвоить любое числовое значение — положительное или отрицательное.

 Примечание

AFInAppEvents.REVENUE (равносильно использованию af_revenue) — это ЕДИНСТВЕННЫЙ параметр события, который учитывается в AppsFlyer как реальный доход и отображается в необработанных данных и в дашборде. Подробные сведения см. здесь.

 Пример

Событие внутри приложения, которое содержит сумму выручки
AppsFlyer.trackRichEvent(AFInAppEvents.LEVEL_ACHIEVED, new Dictionary<string, string>(){
	{AFInAppEvents.CONTENT_ID, "1234567"},
	{AFInAppEvents.CONTENT_TYPE, "category_a"},
	{AFInAppEvents.REVENUE, "1.99"},
	{AFInAppEvents.CURRENCY, "USD"}
});

 Важно!

Для значений выручки НЕЛЬЗЯ применять какое бы то ни было форматирование. В них не должны использоваться запятые-разделители, знаки валюты или текст. Значение выручки должно иметь, например, такой формат: 1234.56.

Регистрация отрицательного дохода

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

AppsFlyer.trackRichEvent(AFInAppEvents.PURCHASE, new Dictionary<string, string>(){
	{AFInAppEvents.CONTENT_ID, "1234567"},
	{AFInAppEvents.CONTENT_TYPE, "category_a"},
	{AFInAppEvents.REVENUE, "-1.99"},
	{AFInAppEvents.CURRENCY, "USD"}
});

 Примечание

Обратите внимание на приведенный выше код:

  1. Перед значением дохода стоит знак минус.
  2. Имя события имеет уникальное значение "cancel_purchase", которое позволяет легко найти события отрицательного дохода на панели управления и в отчетах о необработанных данных.

7. Получение данных о конверсиях

AppsFlyer предоставляет вам доступ к данным о конверсиях пользователей в реальном времени на уровне SDK. Это позволяет персонализировать целевую страницу — ту, которую видит пользователь, открывая приложение в первый раз после установки.

Для загрузки данных о конверсиях с серверов AppsFlyer выполните следующие действия:

  1. Добавьте пустой объект GameObject
  2. Прикрепите к нему файл AppsFlyerTrackerCallbacks.cs, который входит в проект (этому объекту gameobject необходимо присвоить имя AppsFlyerTrackerCallbacks).
Плагин Android для Unity > 4.15.1 Плагин Android для Unity < 4.14.3 iOS
/*Для получения данных о конверсиях в Android необходимо добавить listener в метод init()*/
AppsFlyer.init ("YOUR_DEV_KEY","AppsFlyerTrackerCallbacks");


В Android можно переместить методы из AppsFlyerTrackerCallbacks.cs в другой класс и вызвать данный класс в вашем listener.

Необходимо использовать точно такой же метод пространств имен, который указан в AppsFlyerTrackerCallbacks.

8. Идентификаторы пользователя

Получение AppsFlyer Device ID

Для каждой новой установки приложения AppsFlyer создает уникальный ID устройства. Для получения уникального ID из AppsFlyer используйте следующий API:

public String getAppsFlyerId();


Пример использования

string AppsFlyerUID = AppsFlyer.getAppsFlyerId();

Установка Customer User ID

Установите ID пользователя, используемый приложением. 

Чтобы задать ID пользователя, вызовите следующий метод:

AppsFlyer.setCustomerUserID("someId");

 Примечание

Идентификатор customerUserID ДОЛЖЕН быть задан перед trackAppLaunch/init. Рекомендуется установить свой клиентский User ID как можно скорее, так как только этот идентификатор будет связываться с событиями, включаемыми в отчеты после его установки. Customer User ID можно также использовать для интеграции с аналитическими платформами (такими, как Mixpanel и Swrve).

 Важно!

ОС iOS: ID клиента необходимо обязательно устанавливать при каждом запуске приложения перед вызовом trackAppLaunch.

Подробные сведения о Customer User ID см. здесь.

Google Advertising ID

AppsFlyer SDK, начиная с версии 4.15.1, автоматически выполняет сбор идентификаторов рекламы Google google_advertising_id. Требование включать сбор идентификаторов рекламы Google относится только к версиям SDK ниже 4.15.1.

IMEI и Android ID

Если устройство работает под управлением ОС версии выше KitKat (4.4) и использует службы Google Play, то по умолчанию SDK не проводит сбор данных IMEI и Android ID (при использовании SDK для Unity версии 4.16.4 или более ранней определенным приложениям требуется GPS). 

Чтобы отправить эти идентификаторы в AppsFlyer, разработчики могут использовать такие API:

AppsFlyer.setAndroidIdData(string)
AppsFlyer.setImeiData(string)

Если службы Google Play в приложении НЕ используются, сбор данных IMEI и Android ID выполняется с помощью SDK. Однако приложения, использующие службы Google Play, не должны выполнять сбор данных IMEI, так как это противоречит политике Google Play.

Для отмены сбора данных IMEI и Android ID разработчики могут использовать такие API:

AppsFlyer.setCollectAndroidID(bool) 
AppsFlyer.setCollectIMEI(bool)

 Предупреждение

Для правильной атрибуции НЕОБХОДИМО получить данные хотя бы одного из этих идентификаторов устройства: GAID, Android ID или IMEI.

IDFA и IDFV

Если в приложение включен файл AdSupport.framework, то AppsFlyer автоматически выполняет сбор данных IDFA (ID для рекламодателей) и IDFV (ID для продавцов).

9. Дополнительные возможности

Измерение количества удалений приложений

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

Android - FirebaseAndroid - GCMiOS
1.  Скачайте Firebase SDK для Unity по адресу: https://firebase.google.com/docs/unity/setup
2.  Импортируйте FirebaseMessaging.unitypackage в проект.
3.  Импортируйте google-services.json в проект (полученный с помощью консоли Firebase)

 Примечание

Firebase SDK для Unity должен автоматически добавить приемники, заданные в манифесте.


4.  В класс Unity, управляющий кодом AppsFlyer, добавьте следующее:
using Firebase.Messaging;
using Firebase.Unity;

5.  Добавьте в метод Start():
Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;

6.  Добавьте следующий метод:
public void OnTokenReceived
  (object sender, Firebase.Messaging.TokenReceivedEventArgs token) { 
    AppsFlyer.updateServerUninstallToken (token.Token);
}

 

 Предупреждение

Пользователям, которые используют Firebase SDK для Unity, не нужно добавлять следующий вызов метода в enableUninstallTracking(“SenderID”), поскольку Firebase SDK получает ID отправителя из файла google-services.json, который был добавлен ранее. Если добавить этот метод, то Android может выдать предупреждение об отладке.

Регистрация push-уведомлений

С помощью AppsFlyer можно выполнять измерения push-уведомлений при проведении кампании по ретаргетингу.

handlePushNotification(Dictionary<string, string> payload)

Данные должны включать в себя объект af и строку с соответствующим ключевым значением:

Пример:

{ 
  "data":{ 
   "score":"5x1",
   "time":"15:10",
   "af":{ 
     "c":"test_campaign",
     "is_retargeting":"true",
     "pid":"push_provider_int"
   }
  }
}

// with deep-linking
{
  "data":{
   "score":"5x1",
   "time":"15:10",
   "click_action":"com.example.someAction",
   "af":{
     "c":"test_campaign",
     "is_retargeting":"true",
     "pid":"push_provider_int"
   }
  }
}

 Примечание

Подробные сведения об измерении push-уведомлений см. здесь.

Атрибуция в кампаниях перекрестной рекламы

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

Подробные сведения см. в статье Атрибуция в кампаниях перекрестной рекламы.

Атрибуция приглашений пользователей

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

Подробные сведения см. в статье Атрибуция приглашений пользователей.

Установка кода валюты

Кроме кодов конкретных валют, которые используются в каждом внутри приложения, которое передается в AppsFlyer, можно установить код глобальной валюты. Код глобальной валюты используется в тех случаях, когда параметр af_currency

AFInAppEvents.CURRENCY

не передается вместе с данными события внутри приложения.

По умолчанию используется код USD. Коды валют по стандарту ISO см. здесь.

Чтобы установить код валюты, используйте этот API:

public void setCurrencyCode(String currencyCode);

Пример использования:

setCurrencyCode(string currencyCode)

Валидация покупок в приложении

Для реализации валидации чеков при покупках из приложения следуйте указаниям для вашей операционной системы.

Вызов в Android Вызов слушателя (Только в Android) Вызов в iOS
//To get the callbacks
//AppsFlyer.createValidateInAppListener ("AppsFlyerTrackerCallbacks", 
"onInAppBillingSuccess", "onInAppBillingFailure"); AppsFlyer.validateReceipt(string publicKey, string purchaseData,
string signature, string price, string currency, Dictionary additionalParametes);

 Примечания

  • Вызов validateReceipt автоматически создает внутри приложения событие af_purchase. Поэтому отправлять это событие самостоятельно не нужно.
  • Отклик на вызов при валидации покупки инициируется в классе AppsFlyerTrackerCallbacks.cs.

Анонимизация пользовательских данных

В AppsFlyer предусмотрен метод анонимизации идентификаторов определенных пользователей в аналитике AppsFlyer. Этот метод соответствует последним требованиям по защите личной информации и политикам Facebook в отношении обработки данных и конфиденциальности. Значение по умолчанию  — NO (НЕТ), то есть по умолчанию анонимизация не выполняется.

Для реализации явной анонимизации установок, событий и сеансов пользователя используйте этот API во время инициализации SDK:

public void setDeviceTrackingDisabled(boolean isDisabled);

Пример использования:

AppsFlyer.setDeviceTrackingDisabled(true);
Чтобы повторно запустить атрибуцию и регистрацию событий, снова вызовите функцию deviceTrackingDisabled со значением false.

 Предупреждение

Исключение пользователей СУЩЕСТВЕННО влияет на данные атрибуции.
Используйте данный параметр ТОЛЬКО для регионов, в которых законодательно запрещен сбор информации о пользователях.

Настройка временного интервала между сеансами

По умолчанию 2 сеанса учитываются как отдельные, если интервал между двумя запусками приложения составляет не меньше 5 секунд (см. дополнительные сведения об учете сессий).
Однако если необходимо установить свой вариант минимального интервала между сессиями, можно использовать этот API:
setMinTimeBetweenSessions(int seconds)


Пример использования:

AppsFlyer.setMinTimeBetweenSessions(10);

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

Фоновые сеансы для служебных приложений

В настоящее время в Unity это недоступно.

Атрибуция установок, не связанных с магазином

 Примечание

Магазин по умолчанию — это Google Play. Если ваше приложение есть только в Google Play, этот раздел можно пропустить.

Для регистрации установок, не связанных с магазином Google Play, пропишите в файле AndroidManifest.xml своего приложения канал или магазин. При этом для каждого файла APK необходимо задать уникальное имя канала или любое имя магазина. Значение CHANNEL чувствительно к регистру.

Пример:

<meta-data android:name="CHANNEL" android:value="Amazon" />
<meta-data android:name="CHANNEL" android:value="Standalone"/>
<meta-data android:name="CHANNEL" android:value="Verizon" />

 Примечание

Значение CHANNEL задается на панели управления AppsFlyer во время настройки приложения.

Тег метаданных необходимо поместить перед тегом </application>.

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

Отказ от использования данных

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

AppsFlyer.stopTracking(true);

В любом случае SDK можно активировать повторно путем вызова того же API с передачей значения "false".

Есть несколько различных сценариев, которые владелец приложения может применить для прекращения отслеживания пользователя. Настоятельно рекомендуется строго следовать инструкциям сценария, применимого для вашего приложения.

 Предупреждение

Используйте этот API только в тех случаях, когда необходимо полностью исключить данного пользователя из всех процессов атрибуции и регистрации событий. Использование этого API СУЩЕСТВЕННО влияет на атрибуцию, сбор данных и механизм диплинкинга.

Настройка дополнительных пользовательских данных

API setAdditionalData необходим для интеграции на уровне SDK с несколькими внешними партнерским платформами, включая Segment, Adobe и Urban Airship. Используйте данный API, только если в статье об интеграции платформы специально обозначена необходимость использования API setAdditionalData.
Ниже приведен пример кода для использования setAdditionalData в приложениях, созданных в Unity:

Dictionary<string, string> CustomDataMap = new Dictionary<string, string>();
CustomDataMap.Add("custom_param_1", "value_of_param_1");
AppsFlyer.setAdditionalData(CustomDataMap);

Атрибуция для предустановленных приложений

Только для Android

В Unity можно программным путем задать предустановленный медиа-источник, используя этот API:

setPreinstallAttribution(string MediaSource, string Campaign, string Site_Id);

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

Разрешение упакованных URL-адресов глубинных ссылок

Если используются ссылки OneLink, которые поддерживают ссылки для приложений Android, и при этом упаковываются в сторонние универсальные ссылки, то для уведомления SDK AppsFlyer о том, какие домены CLICK, вызывающие приложение, нужно разрешить и использовать для извлечения базовой ссылки OneLink, можно применять API setResolveDeepLinkURLs. Это позволит поддерживать диплинкинг и атрибуцию при упаковке ссылки OneLink в стороннюю универсальную ссылку. Этот API нужно обязательно вызвать перед инициализацией SDK.

AppsFlyer.setResolveDeepLinkURLs("example.com", "click.example.com");

 Важно!

При использовании комплекта разработчика ПО AppsFlyer для Unity, избегайте

PlayerPrefs.DeleteAll()

10. Тестирование интеграции

Указания по тестированию для вашей операционной системы см.в статьях Тестирование в Android или Тестирование в iOS.

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

11. Известные проблемы

ProGuard

Если при использовании утилиты ProGuard для Android появляется предупреждение о нашем классе AFKeystoreWrapper, добавьте в свой файл правил ProGuard такой код:

-keep class com.appsflyer.** { *; }

IL2CPP

Чтобы исключить наш пакет SDK из управляемого удаления байткодов при использовании технологии IL2CPP, добавьте в файл link.xml следующий код:

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.AndroidJavaRunnableProxy" preserve="all" />
  </assembly>
</linker>

IMPL_APP_CONTROLLER_SUBCLASS

Если вы используете дополнительные плагины, для которых нужно переопределить AppControllerClassName, измените AppsFlyerAppController, как показано ниже (Objective-C):

+(void)load
{
  [AppsFlyerAppController plugin];
}

// Singleton accessor.
+ (AppsFlyerAppController *)plugin
{
  static AppsFlyerAppController *sharedInstance = nil;
  static dispatch_once_t onceToken;
  
  dispatch_once(&onceToken, ^{
    
    sharedInstance = [[AppsFlyerAppController alloc] init];
  });
  
  return sharedInstance;
}

//IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController)

12. Пример проекта на Unity.

Пример проекта на Unity см. здесь.

Была ли эта статья полезной?
Пользователи, считающие этот материал полезным: 4 из 12

Комментарии

0 комментариев

Войдите в службу, чтобы оставить комментарий.