Войти

Android

Подключите MyTracker SDK для Android. В качестве примера вы можете использовать готовые демо-приложения на Java и Kotlin.

Минимальные требования

  • Минимальная поддерживаемая версия Android — 5.0 (API Level 21).

  • Для приложений Google Play обязательно наличие в проекте библиотек  Google Play Services (модуль com.google.android.gms:play-services-ads-identifier) и Google Play Install Referrer (модуль com.android.installreferrer:installreferrer).

  • Для приложений Huawei AppGallery обязательно наличие в проекте библиотеки Huawei Media Services (модуль com.huawei.hms:ads-identifier), чтобы MyTracker мог получить OAID.

Интеграция

С использованием Gradle

Добавьте в файл build.gradle вашего проекта в секцию dependencies зависимость:

dependencies {
    //... другие зависимости
    implementation 'com.my.tracker:mytracker-sdk:3.3.+'
}

Вручную

  • Скачайте последнюю версию MyTracker.aar.

  • Добавьте скаченный aar-файл как зависимость в проект.

  • Добавьте в файл build.gradle вашего приложения следующие зависимости:

    dependencies {
    ...
    implementation 'com.android.installreferrer:installreferrer:2.2'
    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.0'
    implementation 'com.google.android.gms:play-services-appset:16.0.1'
    }
  • (Опционально или в случае использования jar) Если вы используете Proguard, добавьте исключение:

    -keep class com.my.tracker.** { *; }
    -dontwarn com.my.tracker.**
    -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {
        com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context);
    }
    -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {
        java.lang.String getId();
        boolean isLimitAdTrackingEnabled();
    }
    -keep class com.android.installreferrer.** { *; }
    -keep class com.android.vending.billing.** { *; }
    -keep class com.android.billingclient.api.** { *; }
  • (Опционально или в случае использования jar) Добавьте в файл AndroidManifest.xml вашего приложения в секцию manifest необходимые разрешения:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        ...
         >
        ...
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
        ...
    </manifest>

Инициализация

Для корректной работы MyTracker SDK настройку и инициализацию трекера необходимо производить в классе Application вашего приложения, в методе onCreate. Для инициализации трекера необходимо указать ваш SDK_KEY, но перед этим следует выполнить необходимые настройки (конфигурации, трекинга пользователей, диплинков и пр.).

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

public class YourApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();

        // При необходимости, настройте конфигурацию трекера
        MyTrackerParams trackerParams = MyTracker.getTrackerParams();
        MyTrackerConfig trackerConfig = MyTracker.getTrackerConfig();
        // …
        // Настройте параметры трекера
        // …
        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this);
    }
}
class YourApplicationClass : Application()
{
    override fun onCreate()
    {
        super.onCreate()

        // При необходимости, настройте конфигурацию трекера
        val trackerParams = MyTracker.getTrackerParams()
        val trackerConfig = MyTracker.getTrackerConfig()
        // ...
        // Настройте параметры трекера
        // ...

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this)
    }
}

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

public class YourActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);


        // При необходимости, настройте конфигурацию трекера
        MyTrackerParams trackerParams = MyTracker.getTrackerParams();
        MyTrackerConfig trackerConfig = MyTracker.getTrackerConfig();
        // ...
        // Настройте параметры трекера
        // ...
        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, getApplication());
        MyTracker.trackLaunchManually(this);
    }
}
class YourActivity : Activity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)

        // При необходимости, настройте конфигурацию трекера
        val trackerParams = MyTracker.getTrackerParams()
        val trackerConfig = MyTracker.getTrackerConfig()
        // ...
        // Настройте параметры трекера
        // ...

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, getApplication())
        MyTracker.trackLaunchManually(this)
    }
}

Сбор идентификаторов устройств

Начиная с версии SDK 3.0.10, в автоматическом режиме MyTracker собирает только сбрасываемые идентификаторы устройства:

  • GAID (для приложений в Google Play);
  • App Set ID (для приложений в Google Play);
  • OAID (для приложений в Huawei App Gallery).

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

Если ваше приложение не размещено в Google Play или для целей проекта требуется сбор дополнительных идентификаторов, вы можете передать их в MyTracker, используя соответствующий метод SDK:

MyTrackerParams trackerParams = MyTracker.getTrackerParams();
trackerParams.setCustomParam("custom_param_key", "custom_param_value");
val trackerParams = MyTracker.getTrackerParams()
trackerParams.setCustomParam("custom_param_key", "custom_param_value");

Метод поддерживает следующие значения custom_param_key:

  • android_id — уникальный несбрасываемый идентификатор мобильного устройства, используемый в сторонних магазинах приложений. SDK не собирает идентификатор android_id автоматически.
  • Согласно политике конфиденциальности Google Play, android_id нельзя использовать вместе с GAID. Но он может быть передан в случае размещения приложения в альтернативных магазинах приложений.

  • imei — уникальный несбрасываемый идентификатор мобильного устройства, используемый в магазинах приложений, отличных от Google Play. SDK не собирает imei автоматически.
  • Согласно политике конфиденциальности Google Play, imei нельзя использовать вместе с GAID. Но он может быть передан в случае размещения приложения в альтернативных магазинах приложений.

  • mac — идентификатор сетевого оборудования мобильного устройства, используемый в некоторых видах атрибуции в MyTracker. SDK не собирает mac автоматически.

Передача перечисленных идентификаторов является опциональной.

Пример инициализации MyTracker с передачей дополнительных идентификаторов:

public class YourApplicationClass extends Application
{
    // Метод получения Android ID
    static @Nullable String getAndroidId(Context context)
    {
        try
        {
            ContentResolver cr = context.getContentResolver();
            if (cr != null)
            {
                return Settings.Secure.getString(cr, Settings.Secure.ANDROID_ID);
            }
        }
        catch (Throwable e) {}

        return null;
    }

    // Метод получения MAC
    static @Nullable String getMac()
    {
        try
        {
            List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface nif : all)
            {
                if (!nif.getName().equalsIgnoreCase("wlan0"))
                {
                    continue;
                }

                try
                {
                    byte[] macBytes = nif.getHardwareAddress();
                    if (macBytes == null)
                    {
                        return null;
                    }

                    StringBuilder result = new StringBuilder();
                    for (byte b : macBytes)
                    {
                        result.append(String.format("%02X:", b));
                    }

                    int length = result.length();
                    if (length > 0)
                    {
                        result.deleteCharAt(length - 1);
                    }

                    return result.toString();
                }
                catch (Throwable e) {}
            }
        }
        catch (Throwable e) {}

        return null;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();

        // Настройте конфигурацию трекера
        MyTrackerParams trackerParams = MyTracker.getTrackerParams();

        // Настройте передачу дополнительных идентификаторов
        trackerParams.setCustomParam("android_id", getAndroidId(getApplicationContext()));
        trackerParams.setCustomParam("mac", getMac());

        MyTrackerConfig trackerConfig = MyTracker.getTrackerConfig();
        // …
        // Настройте параметры трекера
        // …

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this);
    }
}
class YourApplicationClass : Application()
{
    override fun onCreate()
    {
        super.onCreate()

        // Настройте конфигурацию трекера
        val trackerParams = MyTracker.getTrackerParams()

        // Настройте передачу дополнительных идентификаторов
        trackerParams.setCustomParam("android_id", getAndroidId(applicationContext))
        trackerParams.setCustomParam("mac", getMac())

        val trackerConfig = MyTracker.getTrackerConfig()
        // …
        // Настройте параметры трекера
        // …

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this)
    }

    // Метод получения Android ID
    fun getAndroidId(context: Context): String?
    {
        try
        {
            val cr = context.contentResolver
            if (cr != null)
            {
                return Settings.Secure.getString(cr, Settings.Secure.ANDROID_ID)
            }
        } catch (e: Throwable)
        {
        }
        return null
    }

    // Метод получения MAC
    fun getMac(): String?
    {
        try
        {
            val all: List<NetworkInterface> = Collections.list(NetworkInterface.getNetworkInterfaces())
            for (nif in all)
            {
                if (!nif.name.equals("wlan0", ignoreCase = true))
                {
                    continue
                }
                try
                {
                    val macBytes = nif.hardwareAddress ?: return null
                    val result = StringBuilder()
                    for (b in macBytes)
                    {
                        result.append(String.format("%02X:", b))
                    }
                    val length = result.length
                    if (length > 0)
                    {
                        result.deleteCharAt(length - 1)
                    }
                    return result.toString()
                }
                catch (e: Throwable)
                {
                }
            }
        }
        catch (e: Throwable)
        {
        }
        return null
    }
}

API

Конфигурация трекера

Конфигурацию трекера можно произвести через экземпляр класса MyTrackerConfig, который доступен через метод MyTracker.getTrackerConfig(). Параметры трекера — через экземпляр класса MyTrackerParams, через метод MyTracker.getTrackerParams(). Можно настраивать следующие параметры:

TrackingLaunchEnabled: сбор данных о запусках приложения. По умолчанию true.

@NonNull MyTrackerConfig setTrackingLaunchEnabled(boolean trackingLaunchEnabled)
fun setTrackingLaunchEnabled(trackingLaunchEnabled: Boolean): MyTrackerConfig

LaunchTimeout: интервал в секундах, в течение которого не будет засчитываться новый запуск и прерываться сессия при сворачивании приложения. По умолчанию 30 секунд. Можно установить значение в диапазоне 30-7200 секунд.

@NonNull MyTrackerConfig setLaunchTimeout(int seconds)
fun setLaunchTimeout(seconds: Int): MyTrackerConfig

BufferingPeriod: интервал в секундах, в течение которого события будут накапливаться на устройстве перед отправкой на сервер. По умолчанию 900 секунд. Можно установить значение в диапазоне 1-86400 секунд (1 день).

@NonNull MyTrackerConfig setBufferingPeriod(int seconds)
fun setBufferingPeriod(seconds: Int): MyTrackerConfig

ForcingPeriod: интервал в секундах после установки или обновления приложения, в течение которого события будут незамедлительно отправляться на сервер без локальной буферизации. По умолчанию 0 секунд (незамедлительная отправка выключена). Можно установить значение в диапазоне 0-432000 секунд (5 суток).

@NonNull MyTrackerConfig setForcingPeriod(int seconds)
fun setForcingPeriod(seconds: Int): MyTrackerConfig

AutotrackingPurchaseEnabled: автоматический сбор данных о платежах в приложении. По умолчанию true.

@NonNull MyTrackerConfig setAutotrackingPurchaseEnabled(boolean autotrackingPurchaseEnabled)
fun setAutotrackingPurchaseEnabled(autotrackingPurchaseEnabled: Boolean): MyTrackerConfig

LocationTrackingMode: отслеживание местоположения пользователя. По умолчанию NONE.

Если ваше приложение запрашивает доступ к местоположению пользователя, рекомендуем включить передачу данных для более точной аналитики. В описании приложения в Google Play не забудьте указать «Да» в вопросе про сбор данных о местоположении.

Доступные значения:

  • LocationTrackingMode.NONE — местоположение не отслеживается;
  • LocationTrackingMode.CACHED — трекинг местоположения из кеша;
  • LocationTrackingMode.ACTIVE — запрос текущего местоположения, если это возможно, и получение данных из кеша.

LocationTrackingMode действует с версии SDK 3.3.0 вместо TrackingLocationEnabled

@NonNull MyTrackerConfig setLocationTrackingMode(@LocationTrackingMode int locationTrackingMode)
fun setLocationTrackingMode(@LocationTrackingMode locationTrackingMode: Int): MyTrackerConfig

TrackingPreinstallEnabled: отслеживание предустановок с помощью метода System Properties. По умолчанию true. MyTracker отследит предустановку, если приложение передано производителю устройств вместе со специальным ключом-значением. Подробнее см. документацию на метод System Properties.

@NonNull MyTrackerConfig setTrackingPreinstallEnabled(boolean trackingPreinstallEnabled)
fun setTrackingPreinstallEnabled(trackingPreinstallEnabled: Boolean): MyTrackerConfig

ApkPreinstallParams: отслеживание предустановок в ретейле. MyTracker отследит предустановку, если приложение передано ретейлеру вместе со специальными APK параметрами. Подробнее см. документацию на метод ApkPreinstallParams.

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

@NonNull MyTrackerConfig setApkPreinstallParams(String apkPreinstallParams)
fun setApkPreinstallParams(apkPreinstallParams: String): MyTrackerConfig

Region: регион, где расположен сервер сбора статистики.

С 1 марта 2023г. параметр region недействителен. Вне зависимости от выбранного значения данные будут отправляться на серверы, расположенные на территории Российской Федерации. Чтобы выбрать другой регион, обратитесь в службу поддержки

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

  • Region.RU — сервер, расположенный на территории Российской Федерации

  • Region.EU — сервер, расположенный на территории Европы

@NonNull MyTrackerConfig setRegion(int region)
fun setRegion(region: Int): MyTrackerConfig

Вкл/выкл режима отладки

Включение/выключение режима отладки производится через статические методы класса MyTracker. По умолчанию false.

@AnyThread
void setDebugMode(boolean debugMode)
@AnyThread
            fun setDebugMode(debugMode: Boolean)

Трекинг пользователей

Для получения статистики не только по устройствам, но и по пользователям, установите параметр customUserId. Это уникальный идентификатор пользователя в вашем проекте, который вы присваиваете ему в момент регистрации. Он должен оставаться неизменным, даже если пользователь авторизуется на другом устройстве. Установив этот параметр, вы сможете оценить размер и активность аудитории приложения, вне зависимости от того, на скольких устройствах пользователя установлено ваше приложение. А также не будете терять историю накопленных по пользователю данных, если он решит сменить устройство. Подробнее см. раздел Трекинг.

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

public void setUserInfo()
{
    MyTrackerParams trackerParams = MyTracker.getTrackerParams();

    // Установите пользовательский идентификатор
     trackerParams.setCustomUserId("user_id");

}
fun setUserInfo()
{
    val trackerParams = MyTracker.getTrackerParams()

    // Установите пользовательский идентификатор
    trackerParams.setCustomUserId("user_id")

}

Если до установки customUserId в приложении уже сформирована база зарегистрированных пользователей, то MyTracker не сможет получить данные о времени их регистрации и произвести точный расчёт Lifetime метрик. Для таких пользователей Lifetime статистика будет считаться на дату первого полученного события с customUserId.

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

Трекинг событий

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

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

Событие регистрации. Метод должен быть вызван сразу после того, как пользователь зарегистрируется в приложении. Идентификатор пользователя должен быть передан в параметре userId.

Идентификатор userId — обязательный параметр начиная с SDK версии 2.0.8

@AnyThread
void trackRegistrationEvent(@NonNull String userId)
@AnyThread
fun trackRegistrationEvent(userId: String)

Событие авторизации. Метод должен быть вызван сразу после того, как пользователь успешно авторизуется в приложении. Идентификатор пользователя должен быть передан в параметре userId.

Идентификатор userId — обязательный параметр начиная с SDK версии 2.0.8

@AnyThread
void trackLoginEvent(@NonNull String userId)
@AnyThread
fun trackLoginEvent(userId: String)

Событие отправки приглашения. Дополнительный параметр eventParams позволяет задать произвольные параметры ключ-значение для события. Максимальная длина ключа и значения — 255 символов.

@AnyThread
void trackInviteEvent()
@AnyThread
void trackInviteEvent(@Nullable Map<String, String> eventParams)
@AnyThread
fun trackInviteEvent()

@AnyThread
fun trackInviteEvent(eventParams: Map<String, String>?)

Событие достижения уровня. Можно отправлять как с указанием номера уровня (параметр level), так и без. Дополнительный параметр eventParams позволяет задать произвольные параметры ключ-значение для события. Максимальная длина ключа и значения — 255 символов.

@AnyThread
void trackLevelEvent()
@AnyThread
void trackLevelEvent(@Nullable Map<String, String> eventParams)
@AnyThread
void trackLevelEvent(int level, @Nullable Map<String, String> eventParams)
@AnyThread
fun trackEvent(name: String)

@AnyThread
fun trackEvent(name: String, eventParams: Map<String, String>?)

Произвольное событие с заданным именем. Дополнительный параметр eventParams позволяет задать произвольные параметры ключ-значение для события. Максимальная длина имени, ключа и значения — 255 символов.

@AnyThread
void trackEvent(@Nullable String name)
@AnyThread
void trackEvent(@Nullable String name, @Nullable Map<String, String> eventParams)
@AnyThread
fun trackEvent(name: String)

@AnyThread
fun trackEvent(name: String, eventParams: Map<String, String>?)

Пример:

Map<String, String> eventParams = new HashMap<>();
eventParams.put("someParamKey1", "someParamValue1");
eventParams.put("someParamKey2", "someParamValue2");
MyTracker.trackEvent("eventName", eventParams);
val eventParams = HashMap<String, String>()
eventParams["someParamKey1"] = "someParamValue1";
eventParams["someParamKey2"] = "someParamValue2";
MyTracker.trackEvent("eventName", eventParams);

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

SDK для снижения нагрузки на канал и минимизации влияния на производительность приложения накапливает в буфер все события на устройстве перед отправкой на сервер и регулярно отправляет собранные данные сжатым пакетом. По умолчанию данные отправляются на сервер каждые 15 минут. Этот интервал можно настроить через параметр bufferingPeriod от 1 секунды до 1 суток. Если пользователь закрыл приложение, то отправка будет произведена при следующем запуске. Но некоторые события крайне важно получать в аналитику как можно раньше, особенно в первые сессии после установки приложения. В этом поможет метод flush().

@AnyThread
void flush()
@AnyThread
fun flush()

Трекинг платежей

MyTracker собирает данные по in-app платежам и подпискам.

Google Play Billing Library

Если вы используете Google Play Billing Library, для автоматического отслеживания платежей необходимо вызвать соответствующий метод MyTracker из метода onPurchasesUpdated слушателя BillingClient.

private BillingClient client;
    ...
    client = BillingClient.newBuilder(context)
                     .setListener(new PurchasesUpdatedListener()
                     {
                        @Override
                        public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases)
                        {
                            MyTracker.onPurchasesUpdated(responseCode, (List) purchases);


                            // ваш код обработки платежей
                            // ...
                        }
                     })
                     .build();
    ...
private var client: BillingClient? = null
// ...
client = BillingClient.newBuilder(this)
                .setListener { billingResult, purchases ->
                    MyTracker.onPurchasesUpdated(billingResult.responseCode, purchases as List<Any>?)
                    // ...
                    // ваш код обработки платежей
                    // ...
                }
                .build()
// ...

Google Play In-App Billing API

Если вы используете собственную реализацию In-App Billing API, для автоматического отслеживания платежей необходимо вызвать соответствующий метод MyTracker из метода onActivityResult активности, запустившей процесс платежа.

public static final int PURCHASE_REQUEST_CODE = 1001;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
   super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == PURCHASE_REQUEST_CODE)
   {
        MyTracker.onActivityResult(resultCode, data);
        // ваш код обработки платежа
        // ...
   }
}
...
// ...
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
    super.onActivityResult(requestCode, resultCode, data)
    if (PURCHASE_REQUEST_CODE == requestCode)
    {
        MyTracker.onActivityResult(resultCode, data)
        // ...
        // ваш код обработки платежа
        // ...
    }
}
// ...
companion object
{
    const val PURCHASE_REQUEST_CODE = 1001
}

Ручной трекинг платежей в Google Play

Если вы хотите отслеживать платежи вручную, необходимо выключить автоматический трекинг параметром autotrackingPurchaseEnabled = false, и воспользоваться методами:

@AnyThread
void trackPurchaseEvent(@NonNull JSONObject skuDetails,
       @NonNull JSONObject purchaseData,
       @NonNull String dataSignature)
@AnyThread
void trackPurchaseEvent(@NonNull JSONObject skuDetails,
       @NonNull JSONObject purchaseData,
       @NonNull String dataSignature,
       @Nullable Map<String, String> eventParams)
@AnyThread
fun trackPurchaseEvent(skuDetails: JSONObject,
                       purchaseData: JSONObject,
                       dataSignature: String)

@AnyThread
fun trackPurchaseEvent(skuDetails: JSONObject,
                       purchaseData: JSONObject,
                       dataSignature: String,
                       eventParams: Map<String, String>?)

При включенном автоматическом трекинге платежей вызовы этих методов игнорируются. Обязательные параметры:

  • skuDetails — ответ на запрос getSkuDetails() платежа к google API, согласно документации.
  • purchaseData — объект JSON, который находится в ответе на запрос getBuyIntent(), в поле INAPP_PURCHASE_DATA, согласно документации.
  • dataSignature — строка, которая находится в ответе на запрос getBuyIntent(), в поле INAPP_DATA_SIGNATURE.

Ответы на getSkuDetails() и getBuyIntent() приходят в виде Bundle, поля в них имеют тип String, и их необходимо преобразовать в JSONObject перед отправкой.

Дополнительный параметр eventParams позволяет задать произвольные параметры ключ-значение для события. Максимальная длина ключа и значения — 255 символов.

public static final int PURCHASE_REQUEST_CODE = 1001;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
   super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == PURCHASE_REQUEST_CODE && resultCode == RESULT_OK)
   {
      try
      {
         final String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
         final String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");

         final JSONObject purchaseDataJson = new JSONObject(purchaseData);

         // Самостоятельное получение skuDetails
         final JSONObject skuDetailsJson = obtainSkuDetailJson(purchaseData);

         MyTracker.trackPurchaseEvent(skuDetailsJson, purchaseDataJson, dataSignature);


        // ваш код обработки платежа
        // ...
      }
      catch (Exception ignored)
      {
      }
   }
}
...
// ...
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
    super.onActivityResult(requestCode, resultCode, data)
    // Checking if the request code is PURCHASE_REQUEST_CODE
    if (PURCHASE_REQUEST_CODE == requestCode && RESULT_OK == resultCode && data != null)
    {
        try
        {
            val dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE") ?: return
            val purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA") ?: return

            // Самостоятельное получение skuDetails
            val skuDetailsJson = obtainSkuDetailJson(purchaseData)

            val purchaseDataJson = JSONObject(purchaseData)

            MyTracker.trackPurchaseEvent(skuDetailsJson, purchaseDataJson, dataSignature)
        }
        catch (_: Exception)
        {
        }
    }
}
// ...
companion object
{
    const val PURCHASE_REQUEST_CODE = 1001
}
// ...

S2S трекинг

Для передачи данных с вашего сервера на сервер MyTracker (например, неотслеживаемых данных, офлайн-событий и пр.), может понадобиться специальный идентификатор устройства — instanceId. Идентификатор представляет собой значение UUID v4, которое генерируется в момент первого запуска приложения и остаётся неизменным до удаления приложения (или данных приложения) с устройства.

Получить значение instanceId можно с помощью статического метода класса MyTracker (не следует использовать этот метод на главном потоке).

@WorkerThread
@NonNull String getInstanceId(@NonNull Context context)
@WorkerThread
fun getInstanceId(context: Context): String

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

Вместо instanceId в запросах к API можно указывать любой другой идентификатор устройства: gaid, androidId, appSetId, и/или идентификатор пользователя customUserID (в этом случае данные будут формировать статистику по пользователю). Подробнее

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

Обычные диплинки

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

public class SomeActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate();
        // ...
        String deeplink = MyTracker.handleDeeplink(getIntent());
        if(deeplink != null)
        {
            // Обработка диплинка
        }
    }


    @Override
    protected void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);
        // ...
        String deeplink = MyTracker.handleDeeplink(intent);
        if(deeplink != null)
        {
            // Обработка диплинка
        }
    }
}
class SomeActivity : Activity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        // ...
        val deeplink = MyTracker.handleDeeplink(intent)
        if (deeplink != null)
        {
            // ...
            // Обработка диплинка
            // ...
        }
    }

    override fun onNewIntent(intent: Intent?)
    {
        super.onNewIntent(intent)
        // ...
        val deeplink = MyTracker.handleDeeplink(intent)
        if (deeplink != null)
        {
            // ...
            // Обработка диплинка
            // ...
        }
    }
}

Отложенные диплинки

Для поддержки отложенных диплинков в своем приложении необходимо установить слушатель, реализующий интерфейс MyTracker.AttributionListener. Слушатель будет вызван только один раз, при первом запуске приложения, в случае, если для текущей установки был найден отложенный диплинк. В качестве параметра в метод onReceiveAttribution будет передан объект атрибуции MyTrackerAttribution, содержащий свойство deeplink. Значение свойства обязательно должно быть проверено на принадлежность именно вашему приложению, во избежание открытия стороннего приложения, при использовании перехода по Intent.

public class YourApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();


        // При необходимости, настройте конфигурацию трекера
        MyTrackerParams trackerParams = MyTracker.getTrackerParams();
        MyTrackerConfig trackerConfig = MyTracker.getTrackerConfig();
        // ...
        // Настройте параметры трекера
        // ...


        // Установите слушатель для получения отложенного диплинка
        MyTracker.setAttributionListener(new MyTracker.AttributionListener()
        {

            @Override
            public void onReceiveAttribution(MyTrackerAttribution attribution)
            {
                String deeplink = attribution.deeplink;
                // Обработка отложенного диплинка
                // ...
            }
        });

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this);
    }
}
class YourApplicationClass : Application
{
    override fun onCreate()
    {
        super.onCreate()

        // При необходимости, настройте конфигурацию трекера
        val trackerParams = MyTracker.getTrackerParams();
        val trackerConfig = MyTracker.getTrackerConfig();
        // ...
        // Настройте параметры трекера
        // ...

        // Установите слушатель для получения отложенного диплинка
        MyTracker.setAttributionListener { myTrackerAttribution ->
            val deeplink = myTrackerAttribution.deeplink
            // ...
            // Обработка отложенного диплинка
            // ...
        }

        // Инициализируйте трекер
        MyTracker.initTracker(SDK_KEY, this)
    }
}

При желании, при установке слушателя вы можете задать Handler потока выполнения методов слушателя c помощью метода setAttributionListener(AttributionListener attributionListener, Handler handler). Если при установке слушателя не был установлен хэндлер, метод onReceiveAttribution будет вызван в главном потоке.

Была ли эта статья полезна?