Краткий обзор. Добавьте SDK AppsFlyer в приложения для Android, чтобы измерять установки, внутренние события, медиа-источники и другие показатели.
1. Обзор
- Версия SDK: 6.2.3 (Примечания о выпуске)
- Устаревшие версии SDK
SDK AppsFlyer для Android позволяет приложениям Android регистрировать установки и внутренние события. SDK можно использовать с языками Java/Kotlin.
Встройте SDK в ваше приложение, чтобы регистрировать:
- установки приложения
- вовлеченность пользователей (например, сессии и внутренние события)
1.1 Интеграция SDK — порядок выполнения
Вкладка | Цель | Результат выполнения |
---|---|---|
Интеграция SDK (обязательно) |
Добавьте и настройте SDK |
|
Основные API (Рекомендуется) |
Измерение внутренних событий и дохода, активация диплинкинга и сбора данных о конверсиях. |
|
Дополнительные API |
Внедрение и использование дополнительных API. Например, измерение удалений приложения и атрибуция рефералов. |
|
Справочный документ по API SDK |
1.2. Совместимость SDK с платформами Android
- Запуск на Android V4.0
- Немобильные платформы на базе ОС Android, такие как Smart TV (в том числе Amazon Fire TV)
- Независимые торговые площадки с приложениями для Android, например Amazon и Baidu
2. Добавьте SDK в ваше приложение
В этом разделе описано, как добавить SDK AppsFlyer в проект Android.
Важно!
В Android SDK V6
есть существенные изменения по сравнению с более ранними версиями, касающиеся функций SDK и API, а также названий методов и устаревших компонентов. Узнайте больше о миграции с SDK V5.x.
2.1 Добавьте SDK в ваш проект
Чтобы добавить SDK к вашему приложению, используйте один из методов:
- [Рекомендуется] С помощью Gradle
- Добавление SDK вручную
- Добавьте этот код в /app/build.gradle на уровне модуля перед блоком
dependencies
:repositories { mavenCentral() }
- Добавьте последнюю версию SDK AppsFlyer как зависимость. Загрузить последнюю версию можно здесь.
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:6.0.0' }
- Синхронизируйте проект для получения зависимостей — см. снимок экрана ниже:
2.2 Добавление инициатора установки для Android к вашему приложению
Инициатор установки для Android повышает точность атрибуции, защищает от мошеннических установок, а также выполняет другие функции. Его поддержка в SDK AppsFlyer для Android предусмотрена начиная с версии 4.8.6.
Примечание
Google прекратил поддержку BroadcastReceiverв марте 2020 г.
- Это изменение не влияет на приложение.
- Возможно, вам по-прежнему понадобится BroadcastReceiver для атрибуции приобретенных не в магазине приложений. Проверьте это в магазине, в котором зарегистрировано приложение.
- Внедрение инициатора установки теперь является обязательным.
Добавить инициатор установки в приложение можно двумя способами:
- С помощью системы Gradle (рекомендуется)
- Добавьте инициатор установки вручную
Добавьте инициатор установки для Android как зависимость. Загрузить последнюю версию можно здесь.
-
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.+' implementation 'com.android.installreferrer:installreferrer:1.1' }
- Синхронизируйте проект для получения зависимостей — см. снимок экрана ниже:
Если вы используете утилиту ProGuard и хотите применять новый API Google API для отслеживания инициаторов, необходимо добавить в ProGuard правило: -keep public class com.android.installreferrer.** { *; }
- Загрузите файл инициатора установки в формате aar.
- Добавьте его в проект.
- Добавьте следующее разрешение в манифест:
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
.
2.3 Настройка необходимых разрешений
Добавление разрешения повышает показатель атрибуции на основе вероятностного моделирования. Кроме того, это позволяет SDK отправлять больше данных, таких как данные Wi-Fi и сети оператора связи. Эти данные можно получать из отчетов по сырым данным и использовать для анализа и оптимизации кампаний.
Добавление необходимых разрешений
- Добавьте в файл
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" />
2.4 Настройка BroadcastReceiver для получения данных из Google Play
Примечание
Google прекратил поддержку BroadcastReceiverв марте 2020 г.
- Это изменение не влияет на приложение.
- Возможно, вам по-прежнему понадобится BroadcastReceiver для атрибуции приобретенных не в магазине приложений. Проверьте это в магазине, в котором зарегистрировано приложение.
- Внедрение инициатора установки теперь является обязательным.
Приемник широковещательных сообщений BroadcastReceiver получает информацию из Google Play, которую AppsFlyer использует для атрибуции. Использование BroadcastReceiver повышает показатель атрибуции.
Есть два варианта реализации приемника широковещательных сообщений об источнике установки (параметр referrer):
Если в файле AndroidManifest.xml
не зарегистрирован приемник для INSTALL_REFERRER
, добавьте следующий приемник в тег application
:
<application>
<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
<application>
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
Совет
Если после добавления ресивера в файл AndroidManifest.xml выдается ошибка "Unresolved class SingleInstallBroadcastReceiver", это означает, что сначала нужно выполнить сборку приложения.
3. Внедрение и инициализация SDK
В этом разделе описана процедура внедрения и инициализации SDK.
3.1 Получение ключа разработчика (dev key)
AppsFlyer использует ключ разработчика в качестве уникального идентификатора вашей учетной записи. Ключ разработчика является обязательным, поскольку он позволяет SDK безопасно отправлять и получать данные, которые относятся к вашей учетной записи AppsFlyer.
Внимание! Использование чужого или некорректного ключа разработчика скажется на обработке всего трафика, направляемого из SDK, и приведет к проблемам с атрибуцией и отчетностью.
Чтобы получить ваш ключ разработчика:
- Перейдите на панель управления приложения.
- На дэшборде в разделе Configuration (Настройки) выберите App Settings (Настройки приложения).
- Скопируйте свой ключ разработчика.
3.2 Инициализация SDK
Зарегистрируйте глобальный класс application
В файле AndroidManifest.xml
внутри тега application
вставьте такую строку:
android:name="<APP.PACKAGE.NAME>.<AFApplication>"
-
<APP.PACKAGE.NAME>
— замените на имя пакета приложения. -
<AFApplication>
— замените на имя, присвоенное глобальному классу приложения.
Эта строка в манифесте manifest.xml сообщает приложению имя глобального класса application. Как уже было сказано, это обеспечивает глобальный доступ к SDK AppsFlyer в приложении.
Инициализируйте SDK
Рекомендуется инициализировать SDK в приложении внутри глобального класса application. Это обеспечит инициализацию SDK для всех сценариев, включая диплинкинг.
Перечисленные ниже действия выполняются внутри глобального класса application.
- Импортируйте в глобальный класс данного приложения указанные библиотеки.
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- Внутри глобального класса присвойте свой ключ разработчика переменной — рекомендуется присвоить этой переменной имя AF_DEV_KEY.
Важно: очень важно использовать правильный ключ разработчика при инициализации SDK. Использование чужого или некорректного ключа разработчика скажется на обработке всего трафика, направляемого из SDK, и приведет к проблемам с атрибуцией и отчетностью.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- Внутри глобального класса вставьте после вызова
super.onCreate()
код дляAppsFlyerConversionListener
. См. код, приведенный в пункте 4. - Внутри глобального класса после
ConversionListener
запустите инициализацию SDK с помощью методаinit()
.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; @Override public void onCreate() { super.onCreate(); 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)); } } @Override public void onConversionDataFail(String errorMessage) { Log.d("LOG_TAG", "error getting conversion data: " + errorMessage); } @Override public void onAppOpenAttribution(Map<String, String> attributionData) { for (String attrName : attributionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + attributionData.get(attrName)); } } @Override public void onAttributionFailure(String errorMessage) { Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage); } }; AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); } }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; override fun onCreate() { super.onCreate() val conversionDataListener = object : AppsFlyerConversionListener{ override fun onConversionDataSuccess(data: MutableMap<String, Any>?) { data?.let { cvData -> cvData.map { Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}") } } } override fun onConversionDataFail(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } override fun onAppOpenAttribution(data: MutableMap<String, String>?) { data?.map { Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}") } } override fun onAttributionFailure(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } } AppsFlyerLib.getInstance().init(devKey, conversionDataListener, this) } }
- Внутри глобального класса приложения вызовите
start()
.
AppsFlyerLib.getInstance().start(this);
AppsFlyerLib.getInstance().start(this)
3.3 Задержка инициализации SDK
Чтобы отложить инициализацию SDK, можно вызвать start из класса Activity.
Эту опцию можно использовать, например, если вам нужно отложить start до тех пор, пока вы не получите согласие пользователя в соответствии с требованиями GDPR, CCPA и др. законов о защите данных.
При вызове start в классе Activity:
- Обязательно передавайте экземпляр Activity в качестве аргумента, а не Application.
- Если вы планируете использовать диплинки, добавьте
start()
API к любой другой активности, на которую могут ссылаться диплинки и в которой нет start.
4. Протестируйте инсталлы
Теперь можно начинать тестирование интеграции SDK, имитируя органические и неорганические установки. После выполнения описанных здесь действий на дэшборде AppsFlyer появятся две установки — одна органическая и одна неорганическая.
Дополнительные сценарии тестирования и инструкции см. в разделе Тестирование интеграции SDK.
4.1 Регистрация тестового устройства
Прежде чем начать тестирование установок, зарегистрируйте тестовое устройство.
4.2. Моделирование органической установки
Органические установки — это неатрибутированные установки, которые обычно выполняются непосредственно из магазинов приложений.
Для имитации органической установки выполните следующие действия:
- Убедитесь, что к вашему компьютеру подключено мобильное устройство.
- В Android Studio вызовите Logcat.
- Установите приложение на устройство или эмулятор из Android Studio.
- Дождитесь запуска приложения.
- Найдите в журнале Logcat имя пакета своего приложения.
Вы увидите на экране такие строки:
Выделенная часть снимка экрана содержит строки, из которых видно, что SDK сообщило об органической установке. Эти данные получены из метода onConversionDataSuccess
класса AFApplication. Способ получения данных о конверсиях описан далее в этой руководстве.
Примечание: Начиная с SDK V5, имя метода для получения данных о конверсиях — onConversionDataSuccess
. Если у вас версия SDK ниже чем 5.0.0, метод называется onInstallConversionDataLoaded
. Мы рекомендуем обновить SDK до версии 5.0.0. Подробнее см. тут.
После этого сведения об органической установке должны появиться на обзорной странице панели управления приложения.
Если на панели управления приложения нет сведений об установке, см. наше руководство по поиску и устранению неисправностей в SDK.
4.3. Моделирование неорганической установки
Неорганическая установка — это атрибутированная установка, которая обычно происходит после взаимодействия с рекламой. Для имитации неорганической установки можно использовать ссылки атрибуции.
Для имитации неорганической установки:
- Найдите в манифесте имя пакета своего приложения, например com.company.app.
- В приведенном ниже URL-адресе замените <app_id> на имя пакета вашего приложения:
Например:https://app.appsflyer.com/<app_id>?pid=Test&c=Test
https://app.appsflyer.com/id0123456789?pid=Test&c=Test
- В параметре c указывается название кампании.
- Параметр pid указывает имя медиа-источника, которому атрибутирована установка.
- Если вы тестируете клик с компьютера, следует добавить рекламный идентификатор (GAID) (добавив
&advertising_id=<GAID>
в конец ссылки в шаге 1).
- В приведенном ниже URL-адресе замените <app_id> на имя пакета вашего приложения:
- Отправьте этот URL-адрес на устройство. Его можно отправить, например, по электронной почте или через WhatsApp.
- На устройстве нажмите на этот URL-адрес.
- Если приложение зарегистрировано в магазине приложений, произойдет перенаправление в магазин приложений. Не загружайте приложение из магазина приложений и не устанавливайте его. Перейдите к пункту 5.
- Если приложение все еще в разработке и не зарегистрировано в магазине приложений, на экране появится сообщение о том, что этого приложения в магазине приложений нет. Просто перейдите к пункту 5.
- В Android Studio вызовите Logcat.
- Подключите устройство к компьютеру с помощью USB-кабеля.
- Установите приложение на устройство из Android Studio.
- Найдите в журнале Logcat имя пакета своего приложения.
Вы увидите на экране такие строки:
После этого сведения о неорганической установке должны появиться на обзорной странице дэшборда приложения.
Примечание
Когда вы закончите тестирование и отладку интеграции SDK, отключите журналы SDK.
Известные проблемы с интеграцией SDK
Ознакомьтесь с приведенной информацией, чтобы узнать о возможных проблемах с интеграцией SDK и способах их разрешения.
Предупреждение ProGuard
Если вы используете ProGuard, и вы получаете предупреждение в связи с вашим классом AFKeystoreWrapper
, добавьте в ваш файл правил ProGuard такой код:
-keep class com.appsflyer.** { *; }
Правила резервного копирования
Если вы добавите android:fullBackupContent="true"
внутри тега <application> tag в AndroidManifest.xml, вы можете получить сообщение об ошибке:
Manifest merger failed : Attribute application@fullBackupContent value=(true)
Чтобы устранить эту ошибку, добавьте tools:replace="android:fullBackupContent"
в тег <application> tag в файле AndroidManifest.xml.
Если у вас определены собственные правила резервного копирования (android:fullBackupContent="@xml/my_rules"
), объедините их вручную с правилами AppsFlyer, добавив следующее правило:
<full-backup-content>
...//your custom rules
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
Недостающие файлы ресурсов
Если вы используете Android SDK версии 5 и выше, убедитесь, что в файле APK, помимо файлов classes.dex и resources , у вас есть папка com > appsflyer > internal с файлами a- и b-
Примечание: В SDK до версии 5.3.0 файлы называются a. и b.
Проверьте, что у вас есть нужные файлы, открыв ваш пакет APK в Android Studio. См. скриншот ниже.
Если этих файлов нет, SDK не может отправлять сетевые запросы на наш сервер, и вам нужно будет обратиться к своему менеджеру по работе с клиентами или в службу поддержки.
5. Регистрация внутренних событий приложения
Примечание. Эти указания предназначены для разработчиков. При этом крайне важно получить вводные от маркетолога, потому что именно он решает, какие события в приложении нужно регистрировать для определения качества пользователей.
Регистрация in-app событий приложения и данных о доходах позволит вам измерять качество ваших пользователей.
Отслеживая события внутри приложения, можно понять, что в нем происходит. Рекомендуется заранее определить, какие события нужно регистрировать. Регистрация внутренних событий приложения позволит измерять такие KPI, как ROI (окупаемость инвестиций) и LTV (суммарная прибыль от пользователя).
Есть несколько способов регистрации внутренних событий приложения. Наиболее распространенный способ — это отправка событий через SDK. Именно этот способ и рассматривается в этой статье. Сведения о других способах регистрации событий в приложении см. в нашем обзоре внутренних событий приложения.
Если ваше приложение относится к определенной сфере, например к сфере путешествий, игр, электронной коммерции и т. д., вы можете ознакомиться с полным списком рекомендованных событий для каждой сферы.
5.1. Имена внутренних событий в приложении и параметры
В SDK есть два интерфейса, связанных с внутренними событиями приложения:
- AFInAppEventType — константы для имен событий в приложении.
- AFInAppEventParameterName — константы для имен параметров событий в приложении.
Мы настоятельно рекомендуем использовать эти два интерфейса по следующим причинам:
- Стандартное именование позволяет AppsFlyer автоматически сопоставлять события с сетями типа SRN, такими как Facebook, Google, Twitter и Snapchat.
- Обратная совместимость — если AppsFlyer решит изменить имя какого-либо события или параметра события, ваши настройки останутся совместимыми.
Чтобы использовать эти два интерфейса, их нужно импортировать:
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
5.2. Регистрация данных о доходах
Данные о доходах можно отправлять с любым событием. Для того чтобы включить доход во внутреннее событие приложения, используйте параметр события af_revenue
(AFInAppEventParameterName.REVENUE
). Этому параметру можно присвоить любое числовое значение — как положительное, так и отрицательное.
af_revenue
— это единственный параметр события, который AppsFlyer учитывает как реальный доход и отображает в отчетах сырых данных и на панели управления. Подробные сведения см. здесь.
При отправке событий с доходом необходимо учитывать следующее:
- При установке кода местной валюты (см. пример ниже) необходимо использовать код валюты из 3 букв по стандарту ISO 4217. (значение по умолчанию — USD).
- Чтобы задать код валюты для всех событий, вызовите метод
AppsFlyer.setCurrencyCode("ZZZ")
Сведения о настройках валюты, отображении и конвертации валюты см. в нашем справочнике по валюте доходов. - В значениях дохода нельзя использовать запятые-разделители, знаки валюты или текст. Событие дохода должно иметь, например, такой формат: 1234.56.
Пример: событие покупки в приложении с доходом
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt")
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue)
Событие покупки, с которым связан доход 1234,56 долл. США, отображается на дэшборде как доход.
Регистрация отрицательного дохода
Возможны такие ситуации, когда нужно зарегистрировать отрицательный доход.
Например, пользователь получает возмещение за приобретенную у вас обувь.
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,-200);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"shoes");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"4875");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , "cancel_purchase" , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE, -200)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a")
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD")
AppsFlyerLib.getInstance().logEvent(applicationContext, "cancel_purchase", eventValue)
Примечание
Обратите внимание на приведенный выше код:
- Перед значением дохода стоит знак минус
- Имя события имеет уникальное значение "cancel_purchase", которое позволяет легко найти события отрицательного дохода на панели управления и в отчетах сырых данных.
5.3. Проверка покупок в приложении
При покупках в приложении SDK AppsFlyer выполняет валидацию чека на сервере. Чтобы проверить покупку, вызовите метод validateAndLogInAppPurchase
.
Если покупка проверена, этот запрос автоматически создает внутреннее событие приложения af_purchase
.
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
Параметры метода
- String publicKey — открытый ключ, полученный с помощью консоли разработчика Google.
- String signature — подпись транзакции (возвращает API Google после завершения покупки).
- String purchaseData — приобретенный товар в формате JSON (возвращает API Google после завершения покупки).
- Строка price — доход внутреннего события приложения, о котором необходимо сообщить в AppsFlyer.
- String currency — валюта внутреннего события приложения, о которой необходимо сообщить в AppsFlyer.
- HashMap<String, String> additionalParameters — дополнительные параметры внутреннего события приложения, которые отображаются в поле event_value отчета по необработанным данным о внутренних событиях приложения.
Обратные вызовы по результатам проверки покупки "Успешно" и "Ошибка"
Если нужно узнать результат проверки покупки, включите в класс application своего приложения прослушиватель registerValidatorListener. Этот прослушиватель содержит два блока обратного вызова — один для результата "Успешно", а второй для результата "Ошибка" (по любой причине, включая неудачную проверку).
AppsFlyerLib.getInstance().registerValidatorListener(this,new
AppsFlyerInAppPurchaseValidatorListener() {
public void onValidateInApp() {
Log.d(TAG, "Purchase validated successfully");
}
public void onValidateInAppFailure(String error) {
Log.d(TAG, "onValidateInAppFailure called: " + error);
}
});
AppsFlyerLib.getInstance().registerValidatorListener(this, object : AppsFlyerInAppPurchaseValidatorListener {
override fun onValidateInApp() {
Log.d(LOG_TAG, "Purchase validated successfully")
}
override fun onValidateInAppFailure(error: String) {
Log.d(LOG_TAG, "onValidateInAppFailure called: $error")
}
})
Пример применения проверки покупки
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> additional_event_values = new HashMap<>();
additional_event_values.put("some_parameter", "some_value");
String price= "10";
String currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(), PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
val additional_event_values = HashMap<String, String>()
additional_event_values.put("some_parameter", "some_value");
val price= "10";
val currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this, PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
Валидация покупки в приложении автоматически отправляет в AppsFlyer данные события о покупке. Ниже приведены примеры данных, которые передаются в параметре event_value:
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
Примечание
Вызов validateAndTrackInAppPurchase
автоматически создает внутри приложения событие af_purchase. При самостоятельной отправке этого события происходит дублирование данных о событии.
5.4. Ограничения для внутренних событий приложения
- Название события: до 45 символов
- Значение события: не более 1000 символов, более длинные сообщения могут быть урезаны
- В значениях цены и дохода можно использовать только цифры и десятичную точку, например 5 или 5.2.
- Значения цены и дохода могут иметь не более 5 знаков после десятичной точки, например 5.12345
- Неанглийские символы поддерживаются во внутренних события приложения и других SDK API, начиная с SDK для Android версии 4.8.1.
5.5. Примеры регистрации внутренних событий приложения
Для регистрации внутренних событий приложения используется вызов функции trackRichEvent
с именем события и значениями параметров. Подробные сведения см. в статье о in-app событиях.
Ниже приведен простой пример способа регистрации события покупки. Полный список готовых фрагментов кода для различных отраслей см. в нашем руководстве по насыщенным внутренним событиям приложения применительно к отраслям.
Пример: событие покупки в приложении
Map<String,Object> eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200);
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY");
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes");
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200)
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY")
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes")
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues)
5.6 Регистрация внутренних событий приложения в режиме оффлайн
Если пользователь инициирует событие, когда подключение к Интернету недоступно, Appsflyer все же сможет записать это событие. Вот как это происходит:
- SDK отправляет события на серверы AppsFlyer и ждет ответа.
- Если SDK не получит ответа «200», событие будет помещено в кэш.
- Если затем будет получен ответ «200», сохраненное событие отправляется на сервер повторно.
- Если в кэше хранится несколько событий, они отправляются на сервер одно за другим без перерывов.
Примечание
В кэше SDK можно хранить не более 40 событий. Это означает, что сохраняются только первые 40 событий, происходящих в автономном режиме. Все, что приходит после этого до следующего ответа «200», игнорируется.
Время события, которое отображается в сырых данных — это время события, которое отправляется в AppsFlyer после того, как устройство снова выходит в сеть. Это время не равнозначно времени, когда событие происходит.
5.7 Обработка успешных и неудачных попыток при регистрации внутренних событий приложения
При регистрации внутренних событий приложения вы можете установить прослушиватель. Прослушиватель позволяет вам определять логику для двух сценариев:
- Внутреннее событие приложения зарегистрировано успешно.
- При регистрации внутреннего события произошла ошибка.
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Event sent successfully");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Event sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
В случае возникновения ошибки во время записи внутреннего события отображается код ошибки и описание строки, как указано в таблице ниже.
Код ошибки | Описание строки |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" ("Время события истекло. Проверьте параметр 'minTimeBetweenSessions'") |
11 |
"Skipping event because 'isStopped' enabled" (Событие пропущено, т.к. включен параметр 'isStopped') |
40 |
Ошибка сети: описание ошибки предоставляет Android |
41 |
"No dev key" ("Нет ключа разработчика") |
50 |
"Status code failure" ("Ошибка кода статуса") + фактический код ответа от сервера |
6. Диплинкинг при помощи OneLink
Примечание. Эти указания предназначены для разработчиков. При этом крайне важно получить вводные от маркетолога, потому что у него есть доступ к дэшборду AppsFlyer, который необходим для настройки ссылки OneLink для диплинкинга.
Диплинкинг позволяет обеспечить пользователям более простой и удобный UX с рекламой и приложением.
OneLink — это решение AppsFlyer для многоплатформенной атрибуции, перенаправления и диплинкинга.
6.1. Идентификация устройств и перенаправление пользователей
При нажатии на ссылку OneLink определяется тип устройства и пользователь перенаправляется в соответствующий пункт назначения, например на портал Google Play, в магазин приложений для iOS, на независимую торговую площадку или веб-страницу.
В руководстве по настройке OneLink рассматривается атрибуция с использованием многоплатформенных ссылок (программирование SDK не требуется). Эти ссылки можно также использовать для диплинкинга.
6.2. Диплинкинг
Диплинкинг позволяет направлять пользователей на определенное действие в приложении, предоставляя им индивидуально подобранный контент. Такие возможности очень полезны при проведении ретаргетинговых кампаний.
Настройку диплинкинга при помощи Onelink должны совместно выполнять маркетолог с доступом к панели управления AppsFlyer и разработчик с доступом к приложению.
См. наше руководство по настройке диплинкинга при помощи OneLink.
6.3. Отложенный диплинкинг
Отложенный диплинкинг позволяет перенаправлять новых пользователей по глубинной ссылке и предоставлять им после установки приложения индивидуально подобранный контент. Этот метод отличается от обычного диплинкинга, который можно использовать, только если приложение уже установлено на устройстве пользователя.
Чтобы настроить отложенный диплинкинг при помощи OneLink, разработчику также необходим доступ к панели управления AppsFlyer.
Настройка отложенного диплинкинга выполняется так же, как и настройка обычного диплинкинга. Единственное отличие состоит в том, что для перенаправления пользователей по глубинной ссылке и предоставления им индивидуально подобранного контента после установки и запуска приложения необходимо добавить в приложение соответствующий код.
Дополнительные сведения см. в руководстве по отложенному диплинкингу.
6.4. Доступ к данным глубинных ссылок
SDK предоставляет данные о конверсии или вовлечении после каждого события установки или перехода по глубинной ссылке. Эти данные можно использовать для программной настройки контента и поведения приложения.
Чтобы получать данные по диплинкингу, когда используется прямой диплинк и открыто приложение, внедрите метод onAppOpenAttribution.
Чтобы получать данные по диплинкингу для повторного вовлечения вручную в любое время, внедрите метод performOnAppAttribution.Это позволяет получить доступ к данным по повторному вовлечению, не регистрируя новое повторное вовлечение.
Дополнительные сведения см. в руководстве по настройке диплинкинга.
6.5 Настройка разрешения диплинков в push-уведомлениях
Владельцы приложений могут использовать метод addPushNotificationDeepLinkPath
как гибкий интерфейс для настройки способа извлечения диплинков из полезной нагрузки push-уведомлений.
По умолчанию SDK ищет значение диплинка в ключе af
из полезной нагрузки JSON
push-уведомления. Однако многие поставщики push-уведомлений используют собственные схемы JSON
, которые SDK не может расшифровать без дополнительной настройки.
С помощью addPushNotificationDeepLinkPath
можно определить, в каком ключе в полезной нагрузке push-уведомления SDK будет искать значение диплинка.
Используйте этот метод, если вы интегрируете приложение с поставщиками push-уведомлений, которые не используют стандартную схему JSON
для push-уведомлений, ожидаемую SDK.
При вызове addPushNotificationDeepLinkPath
SDK проверяет, что:
- В полезной нагрузке присутствует необходимый ключ.
- Ключ содержит действительный URL OneLink.
addPushNotificationDeepLinkPath
необходимо вызвать перед вызовом метода start()
.
Базовая конфигурация
Проанализируйте следующий вызов addPushNotificationDeepLinkPath
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
и эти сценарии.
Сценарий 1
Приложение вызывается с помощью push-уведомления, которое содержит полезную нагрузку со следующей структурой.
{
...
"deeply": {
"nested": {
"deep_link": "https://yourdeeplink2.onelink.me"
}
}
...
}
В этом сценарии SDK извлекает значение deep_link
и продолжает выполнять диплинкинг.
Сценарий 2
Приложение вызывается с помощью push-уведомления, которое содержит полезную нагрузку со следующей структурой.
{
...
"deeply": {
"nested": {
"banana": "https://yourdeeplink2.onelink.me"
}
},
...
}
В этом сценарии при исполнении вызова SDK не находит ключ deep_link
в полезной нагрузке. Поэтому ничего не происходит.
Сценарий 3
Приложение вызывается с помощью push-уведомления, которое содержит полезную нагрузку со следующей структурой.
{
...
"deeply": {
"nested": {
"deep_link": "Corrupted url or regular string"
}
},
...
}
В этом сценарии SDK находит ключ deep_link
, но указанное в нем значение диплинка недействительно. Поэтому при выполнении вышеуказанного вызова ничего не происходит.
Расширенные настройки
Чтобы настроить несколько возможных структур полезной нагрузки метод addPushNotificationDeepLinkPath
вызывается несколько раз:
- Использоваться будет тот вызов, который первым вернет действительное значение диплинка.
- Другие вызовы игнорируются
Если ни одна из структур полезной нагрузки не подходит, или в полезной нагрузке не найден действительный URL-адрес OneLink, ничего не происходит.
Например, рассмотрим полезную нагрузку:
{
...
"deeply": {
"nested": {
“deep_link”: “https://yourdeeplink2.onelink.me”
}
},
“this”: {
“is”: {
"banana": "phone"
}
}
...
}
и следующие вызовы метода addPushNotificationDeepLinkPath
.
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
7. Получение данных о конверсиях
Вы получаете доступ к данным атрибуции пользователей для каждой новой установки в реальном времени на уровне SDK.
Таким образом, можно предоставлять пользователям персонализированный контент или направлять их на определенные действия в приложении (см. раздел Отложенный диплинкинг в этой статье). Это позволит значительно улучшить взаимодействие с вашим приложением.
Чтобы получить в AppsFlyer данные конверсии из SDK для Android, используйте функцию AppsFlyerConversionListener
.
import android.app.Application;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import java.util.Map;
import android.util.Log;
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
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));
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d("LOG_TAG", "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage);
}
};
AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, getApplicationContext());
AppsFlyerLib.getInstance().start(this);
}
}
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerLibCore.LOG_TAG
class AFApplication : Application() {
private val devKey = "qrdZGj123456789";
override fun onCreate() {
super.onCreate()
val conversionDataListener = object : AppsFlyerConversionListener{
override fun onConversionDataSuccess(data: MutableMap<String, Any>?) {
data?.let { cvData ->
cvData.map {
Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}")
}
}
}
override fun onConversionDataFail(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
override fun onAppOpenAttribution(data: MutableMap<String, String>?) {
data?.map {
Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}")
}
}
override fun onAttributionFailure(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
}
AppsFlyerLib.getInstance().init(devKey, conversionDataListener, applicationContext)
AppsFlyerLib.getInstance().start(this)
}
}
Самые важные API в интерфейсе AppsFlyerConversionListener
:
-
onInstallConversionData
— предоставляет данные о конверсиях для новых установок.
Примечание: Начиная с SDK V5, имя метода для получения данных о конверсиях —onConversionDataSuccess
. Если у вас версия SDK ниже чем 5.0.0, метод называетсяonInstallConversionDataLoaded
. Рекомендуется обновить SDK до версии 5.0.0. Подробнее см. тут. -
onAppOpenAttribution
— предоставляет данные о конверсиях ретаргетинга при запуске существующего приложения вручную либо с помощью глубинной ссылки.
Дополнительные сведения относительно данных о конверсиях см. в нашем руководстве по сценариям использования данных о конверсиях.
8. Атрибуция
Приложения для Android, приобретенные на независимых торговых площадках
AppsFlyer позволяет атрибутировать установки приложений для Android, приобретенных на независимых торговых площадках. Это дает возможность продвигать ваши приложения на рынках, где Google Play недоступен, и расширять аудиторию.
Подробные сведения об атрибуции установок приложений, приобретенных на независимых торговых площадках, см. здесь.
Предустановленные приложения
В ходе предустановочных кампаний изготовители устройств по просьбе владельцев приложений устанавливают эти приложения на устройства еще до их отправки в торговую сеть.
AppsFlyer позволяет легко атрибутировать установки предустановленных приложений. Когда пользователь в первый раз запускает приложение, AppsFlyer атрибутирует эту установку изготовителю как медиаисточнику.
Дополнительные сведения см. здесь.
Измерение количества удалений приложений
Инструкции по настройке измерения количества удалений см. здесь.
Настройка прослушивателя для запроса
Для получения подтверждения от серверов AppsFlyer о поступлении запроса можно использовать прослушиватель AppsFlyerTrackingRequestListener.
Метод обратного вызова onRequestSuccess()
выполняется каждый раз, когда в ответ на запрос атрибуции, посланный пакетом SDK, возвращается код 200
.
Для любого другого ответа выполняется метод обратного вызова onRequestFailure(String error)
и возвращается ответ в виде строки ошибки.
Пример использования
AppsFlyerLib.getInstance().start(getApplicationContext(), "devKey", new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully, got 200 response code from server");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().start(this, "devKey", object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
В случае возникновения ошибки во время работы прослушивателя запросов отображается код ошибки и описание строки, как указано в таблице ниже.
Код ошибки | Описание строки |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" ("Время события истекло. Проверьте параметр 'minTimeBetweenSessions'") |
11 |
"Skipping event because 'isStopped' enabled" (Событие пропущено, т.к. включен параметр 'isStopped') |
40 |
Ошибка сети: описание ошибки предоставляет Android |
41 |
"No dev key" ("Нет ключа разработчика") |
50 |
"Status code failure" ("Ошибка кода статуса") + фактический код ответа от сервера |
Настройка дополнительных пользовательских данных
API setAdditionalData
необходим для интеграции на уровне SDK с несколькими внешними партнерским платформами, включая Segment, Adobe и Urban Airship.
Используйте данный API только в тех случаях, когда в руководстве по интеграции платформы специально указана необходимость использования API setAdditionalData.
Пример кода setAdditionalData
:
HashMap<String,Object> CustomDataMap = new HashMap<>();
CustomDataMap.put("custom_param_1","value_of_param_1");
AppsFlyerLib.getInstance().setAdditionalData(CustomDataMap);
val customDataMap = HashMap<String, Any>()
customDataMap.put("custom_param_1","value_of_param_1")
AppsFlyerLib.getInstance().setAdditionalData(customDataMap)
Атрибуция сессий приложения, инициированных с собственных сайтов (доменов)
Владельцы приложений, использующие App Links для диплинкинга (без OneLink) и имеющие домен, связанный с их приложением, могут атрибутировать сессии, инициированные через этот домен, с помощью метода appendParametersToDeepLinkingURL
.
Например, пользователь ищет что-то в Google и кликает по ссылке на ваш домен www.example.com:
- Если у пользователя не установлено приложение, он перенаправляется на веб-сайт (www.example.com).
- Если приложение уже установлено на устройстве этого пользователя, диплинк приведет его в приложение, связанное с доменом www.example.com. Данная сессия атрибутируется медиа-источнику (параметр
pid
), указанному вappendParametersToDeepLinkingURL
.
Дополнительную информацию см. в материалах по Android SDK.
Заметьте: Смарт-баннеры помогают конвертировать посетителей сайта в пользователей мобильного приложения.
9. Сеансы
Настройка временного интервала между сеансами
По умолчанию два сеанса учитываются как отдельные, если интервал между двумя запусками приложения составляет не меньше 5 секунд (см. дополнительные сведения об учете сеансов).
Чтобы установить минимальный интервал между сеансами, используйте этот API:
AppsFlyerLib.setMinTimeBetweenSessions(int seconds);
Установка большого интервала между запусками может отрицательно сказаться на работе API, которые используют данные сеансов, например, для диплинкинга.
Фоновые сеансы для служебных приложений
Чтобы сообщить о новых сеансах пользователя, можно использовать этот метод SDK. Это может оказаться удобным, например, для служебных приложений, которые работают в фоновом режиме.
Используйте этот API в активности onCreate():
public void logSession(Context context);
Пример использования:
AppsFlyerLib.getInstance().logSession(context);
10. Собственные медиаканалы
Разрешение упакованных URL-адресов глубинных ссылок
Некоторые сторонние службы, такие как службы электронной почты упаковывают ссылки в электронных письмах в свои собственные домены регистрации кликов. Некоторые даже разрешают вам устанавливать свои собственные домены регистрации кликов. Упаковка ссылки OneLink в такие домены может привести к ограничению ее функциональных возможностей.
Чтобы преодолеть эту проблему, можно использовать API setResolveDeepLinkURLs
. Этот API позволяет получать ссылки OneLink от доменов кликов, которые запускают приложение. Этот API нужно обязательно вызвать перед инициализацией SDK.
Например, у вас есть три домена регистрации кликов, которые выполняют перенаправление на вашу ссылку OneLink по адресу https://mysubdomain.onelink.me/abCD. Используйте этот API для получения ссылки OneLink, на которую перенаправляют домены регистрации кликов. Этот метод API получает список доменов, разрешение которых выполняет SDK. Добавьте следующий код перед инициализацией SDK.
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
Приведенный выше код позволяет использовать домен регистрации кликов, сохраняя при этом функциональные возможности OneLink. Домены регистрации кликов выполняют запуск приложения. API, в свою очередь, получает от этих доменов ссылку OneLink, после чего данные этой ссылки OneLink можно использовать для диплинкинга и персонализации пользовательского контента.
Регистрация push-уведомлений
С помощью AppsFlyer можно выполнять измерения push-уведомлений при проведении кампаний по ретаргетингу.
Чтобы включить эту функцию, вызовите метод sendPushNotificationData
в каждой активности внутри метода onCreate
, которая запускается после нажатия на уведомление:
AppsFlyerLib.getInstance().sendPushNotificationData(this);
Подробные сведения об измерении push-уведомлений см. здесь.
Атрибуция приглашений пользователей
С их помощью уже имеющиеся пользователи могут приглашать своих друзей и знакомых в качестве новых пользователей вашего приложения, что может существенно способствовать его продвижению. С помощью AppsFlyer можно атрибутировать и регистрировать установки, источником которых являются приглашения, отправленные пользователями из вашего приложения.
Подробные сведения см. в статье Атрибуция приглашений пользователей.
Атрибуция кампаний перекрестной рекламы
Подробные сведения см. в статье Атрибуция в кампаниях перекрестной рекламы.
11. Идентификаторы пользователей
Получение AppsFlyer ID
Идентификатор AppsFlyer ID создается для каждой новой установки приложения. Вы можете использовать AppsFlyer ID для различных целей:
- Отправляйте внутренние события приложения от сервера к серверу.
- Сопоставляйте AppsFlyer ID с данными пользователей, зарегистрированных в ваших серверных системах.
- Сопоставляйте записи при объединении данных из Pull API и Push API.
Для получения уникального ID из AppsFlyer используйте следующие API:
public String getAppsFlyerUID(Context context);
Пример использования:
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
Установка Customer User ID
Для установки своего Customer User ID используйте такой код:
public void setCustomerUserId(String id);
Пример использования:
AppsFlyerLib.getInstance().setCustomerUserId("myId");
Рекомендуется установить свой ID клиента на раннем этапе продвижения приложения, так как после установки этого идентификатора только он привязывается к событиям, включаемым в отчеты:
- Если вызов
setCustomerUserId
выполняется перед вызовомstart
, идентификатор клиента будет отображаться в отчетах по сырым данным и для установок, и для событий. - Если установить ID клиента позже, он будет привязан только к событиям, зарегистрированным после установки этого идентификатора.
Получение Customer User ID:
Чтобы избежать необходимости повторно устанавливать значение ID клиента после первого запуска и многократно обращаться к серверу для его получения, проверьте, задано ли его значение, с помощью этого кода:
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
Для получения дополнительных сведений о Customer User ID щелкните здесь.
Задержка инициализации SDK для идентификатора customerUserID
Можно отложить инициализацию SDK до настройки идентификатора customerUserID.
Чтобы указать, что инициализацию SDK необходимо отложить до установки идентификатора клиента, выполните такой вызов:
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
непосредственно перед методом init(). Остальную часть инициализации SDK следует оставить без изменений.
После передачи customerUserID выполните вызов
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
чтобы передать SDK соответствующий идентификатор клиента User ID и запустить SDK.
Должен отобразиться следующий код:
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionDataListener =
new AppsFlyerConversionListener() {
...
};
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(AF_DEV_KEY, getConversionListener(), getApplicationContext());
AppsFlyerLib.getInstance().start(this);
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
//Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
}
}
class AFApplication: Application() {
private val afDevKey = ""
override fun onCreate() {
super.onCreate()
val conversionDataListener = object: AppsFlyerConversionListener {
...
}
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(afDevKey, conversionDataListener, this)
AppsFlyerLib.getInstance().start(this)
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
// Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this)
}
}
Дополнительные сведения об отсрочке инициализации SDK до получения идентификатора клиента см. здесь.
Предупреждение
Используйте данный API, только если он соответствует логике функционирования приложения. Использование данного API повышает вероятность расхождений и уязвимость приложения для мошенничества.
Google Advertising ID
AppsFlyer SDK, начиная с версии 4.8.0, автоматически выполняет сбор идентификаторов рекламы Google google_advertising_id
.
Требование включать сбор идентификаторов рекламы Google относится только к SDK версии 4.7.X или более старых версий.
OAID, IMEI и Android ID
Хотя бы один идентификатор устройства должен быть получен для целей атрибуции. Доступны следующие идентификаторы: GAID, Android ID, IMEI и OAID.
GAID - Google Advertising ID
Получается автоматически из приложений, содержащих Сервисы Google Play. Если GAID доступен, IMEI и Android ID НЕ ДОЛЖНЫ собираться приложением, чтобы избежать нарушения политики Google Play.
IMEI и Android ID
По умолчанию отключено. Можно собирать ТОЛЬКО для приложений, не включающих в себя Сервисы Google Play.
Заметьте: Начиная с Android 10 (уровень API 29), выпущенной в конце 2019 года, доступ к параметру IMEI ограничен.
Чтобы передавать эти идентификаторы в AppsFlyer:
- После запуска приложения соберите IMEI устройства и/или Android ID.
- Вызовите следующие API, ПРЕЖДЕ ЧЕМ вызывать метод
start
:
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Open Advertiser Identifier(Открытый идентификатор рекламодателя)
Отказ от сбора идентификатора устройства
Разработчики могут отказаться от сбора IMEI, Android ID и OAID, используя следующие API:
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. Защита конфиденциальной информации пользователей
Отказ от использования данных
В исключительных случаях может потребоваться полное отключение SDK для соблюдения норм законодательства и правил конфиденциальности. Для этого можно использовать API stop
. После вызова этого API пакет SDK прекратит работу и обмен данными с серверами AppsFlyer.
AppsFlyerLib.getInstance().stop(true, getApplicationContext());
AppsFlyerLib.getInstance().stop(true, applicationContext);
Есть несколько различных сценариев, которые владелец приложения может применить для прекращения отслеживания пользователя. Мы рекомендуем следовать инструкциям сценария, применимого для вашего приложения.
SDK можно активировать повторно, вызвав:
AppsFlyerLib.getInstance().stop(false, getApplicationContext());
AppsFlyerLib.getInstance().start(getApplicationContext(), <AF_DEV_KEY>);
AppsFlyerLib.getInstance().stop(false, applicationContext);
AppsFlyerLib.getInstance().start(applicationContext, <AF_DEV_KEY>);
Не вызывайте start
, если для параметра stop
установлено значение true
. Вы можете проверить текущее состояние SDK, вызвав:
AppsFlyerLib.getInstance().isStopped() // возвращает true, если SDK остановлен, и false, если запущен
AppsFlyerLib.getInstance().isStopped // возвращает true, если SDK остановлен, и false, если запущен
Предупреждение
Используйте API stop только в тех случаях, когда необходимо полностью исключить данного пользователя из всех процессов регистрации данных. Использование этого API оказывает существенное влияние на атрибуцию, сбор данных и механизм диплинкинга.
Анонимизация пользовательских данных
Для реализации явной анонимизации установок, событий и сеансов пользователя используйте этот API во время инициализации SDK:
public void anonymizeUser(boolean isDisabled);
Пример использования:
AppsFlyerLib.getInstance().anonymizeUser(true);
Регистрацию данных можно запустить снова, вызвав anonymizeUser
и установив значение false.
Предупреждение
Анонимизация пользователей СУЩЕСТВЕННО влияет на данные атрибуции.Используйте этот параметр ТОЛЬКО для регионов, в которых законодательно запрещен сбор информации о пользователях.
Прекратить предоставлять данные партнерам
В некоторых случаях рекламодатели должны прекратить передачу рекламным сетям / партнерам данных по определенным пользователям. Причины могут быть следующие:
- Политики конфиденциальности, такие как CCPA или GDPR.
- Отказ пользователей от предоставления данных
- Конкуренция с некоторыми партнерами (рекламными сетями, третьими сторонами)
AppsFlyer предоставляет два метода API для прекращения обмена данными с некоторыми или всеми партнерами:
- setSharingFilter: Используется рекламодателями, чтобы задать несколько сетей/интегрированных партнеров, которым нужно прекратить предоставлять данные.
- setSharingFilterForAllPartners: Используется рекламодателями, чтобы прекратить предоставлять данные всем сетям/интегрированным партнерам.
Эти методы фильтрации поддерживаются в SDK начиная с версии V5.4.1.
Метод фильтрации должен вызываться каждый раз при инициализации SDK, он влияет на всю сессию. Если требуется время, чтобы определить, нужно ли устанавливать фильтры общего доступа, то отложите инициализацию SDK.
Если метод активирован до первого вызова start:
- Пользователи из SRN атрибутируются как органические, и их данные не передаются интегрированным партнерам.
- Пользователи по кликам из рекламных сетей (не SRN) правильно атрибутируются в AppsFlyer, но их данные не передаются в рекламные сети через постбэки, API, отчеты по сырым данным или каким-либо другим способом.
В настоящее время данные об удалении приложения нельзя фильтровать с помощью этих методов. Однако вы можете прекратить отправку событий удаления партнерам, настроив это на их страницах настройки в AppsFlyer.
Справочник по Android SDK
getAppsFlyerUID
Описание |
Получение AppsFlyer ID. Подробные сведения см. здесь. |
Сигнатура метода |
|
Пример использования |
|
onAppOpenAttribution
Описание |
Получает данные с глубинными ссылками, когда приложение открывается по глубинной ссылке. |
Сигнатура метода |
|
onAttributionFailure
Описание |
Обработка ошибок получения данных по глубинным ссылкам. |
Сигнатура метода |
|
onConversionDataSuccess
Описание |
Получение данных о конверсии после установки. Полезно для отложенного диплинкинга. Примечание. В SDK |
Сигнатура метода |
|
onConversionDataFail
Описание |
Обрабатывает ошибки, когда не удается получить данные о конверсиях для установок. |
Сигнатура метода |
|
onDeepLinking
Описание |
Позволяет направить пользователей мобильных устройств — как уже установивших, так и еще не установивших ваше приложение — на конкретное внутреннее действие после открытия этого приложения. Узнать больше |
Сигнатура метода |
|
onRequestFailure
Описание |
Метод обратного вызова для AppsFlyerRequestListener. Вызывается в случаях, когда SDK не удается сообщить о запуске приложения. |
Сигнатура метода |
|
Пример использования |
См. раздел Настройка прослушивателя для запроса. |
onRequestSuccess
Описание |
Метод обратного вызова для AppsFlyerRequestListener. Вызывается, когда SDK успешно сообщает о запуске приложения. |
Сигнатура метода |
|
Пример использования |
См. раздел Настройка прослушивателя для запроса. |
performOnAppAttribution
Описание |
Эта функция позволяет разработчикам вручную перезапустить onAppOpenAttribution со специальной ссылкой (URI или URL), не регистрируя новое повторное вовлечение. Этот метод может потребоваться, если приложению необходимо перенаправить пользователей по указанной ссылке или получить короткий URL-адрес AppsFlyer, не сворачивая приложение. Это может потребоваться, поскольку стандартный обратный вызов onAppOpenAttribution вызывается, только если приложение было открыто по диплинку. |
Сигнатура метода |
|
Пример использования |
|
logSession
Описание |
Информирование о сеансах в том случае, если ваше приложение является служебным приложением, которое работает в фоновом режиме. |
Сигнатура метода |
|
Пример использования |
|
sendDeepLinkData (не рекомендуется с версии V5.3.0)
Описание |
Этот метод больше не используется, чтобы гарантировать, что вы получите данные об атрибуции, даже если пользователь перенаправлен по диплинку на определенную активность. Вместо этого убедитесь, что вызван метод start(). Подробные сведения см. здесь. |
Сигнатура метода |
|
Пример использования |
|
sendPushNotificationData
Описание |
Измерение и получение данных из кампаний с push-уведомлениями. Дополнительные сведения см. в разделе Измерение push-уведомлений. |
Сигнатура метода |
|
Пример использования |
|
setAdditionalData
Описание |
Добавление дополнительных данных для отправки на внешние партнерские платформы. |
Сигнатура метода |
|
Пример использования |
См. раздел Настройка дополнительных данных. |
setAndroidIdData
Описание |
Отправка Android ID в AppsFlyer. См. OAID, IMEI и Android ID. |
Сигнатура метода |
|
Пример использования |
|
setAppInviteOneLink
Описание |
Установка идентификатора шаблона OneLink, который используется для создания настраиваемых ссылок атрибуции для приглашений пользователей. |
Сигнатура метода |
|
Пример использования |
См. описание настройки ссылки OneLink для атрибуции приглашений пользователей. |
setCollectAndroidID
Описание |
Указание на необходимость отправлять Android ID в AppsFlyer. |
Сигнатура метода |
|
Пример использования |
setCollectIMEI
Описание |
Указание на необходимость отправлять IMEI в AppsFlyer. |
Сигнатура метода |
|
Пример использования |
setCustomerIdAndLogSession
Описание |
Инициирование SDK в тот момент, когда идентификатор Customer User ID становится доступным. Дополнительные сведения см. в пунктеЗадержка инициализации SDK для идентификатора customerUserID. |
Сигнатура метода |
|
Пример использования |
|
Установка Customer User ID
Описание |
Настройка Customer User ID. Дополнительные сведения см. в пунктеУстановка Customer User ID. |
Сигнатура метода |
|
Пример использования |
|
setDebugLog
Описание |
Включение журналов отладки. См. описание отладки для Android. |
Сигнатура метода |
|
Пример использования |
|
anonymizeUser
Описание |
Анонимизация установок, событий и сеансов пользователя. Дополнительные сведения см. в пунктеАнонимизация пользовательских данных. |
Сигнатура метода |
|
Пример использования |
|
setLogLevel
Описание |
Настройка уровня для журнала SDK AppsFlyer. |
Сигнатура метода |
|
Пример использования |
|
setMinTimeBetweenSessions
Описание |
Настройка минимального временного интервала между сеансами. Дополнительные сведения см. в пунктеНастройка временного интервала между сеансами. |
Сигнатура метода |
|
Пример использования |
|
setOaidData
Описание |
Отправка OAID в AppsFlyer. См. OAID, IMEI и Android ID. |
Сигнатура метода |
|
Пример использования |
|
setOutOfStore
Описание |
Указание независимого магазина приложений, из которого было загружено приложение. |
Сигнатура метода |
|
Пример использования |
|
setPartnerData
Описание |
Партнеры и рекламодатели могут включать дополнительные данные в события SDK. |
Сигнатура метода |
|
Пример использования |
|
setPreinstallAttribution
Описание |
Настройка SDK на информирование о предустановке при запуске предустановленного приложения. |
Сигнатура метода |
|
Пример использования |
См статью о кампаниях по предустановке приложений для Android. |
setResolveDeepLinkURLs
Описание |
Получение ссылки OneLink от доменов регистрации кликов. Дополнительные сведения см. в разделе Разрешение упакованных URL-адресов глубинных ссылок. |
Сигнатура метода |
|
Пример использования |
|
setSharingFilter
Описание |
Используется рекламодателями, чтобы задать несколько сетей/интегрированных партнеров, которым нужно прекратить предоставлять данные. Узнать больше |
Сигнатура метода |
|
Пример использования |
|
setSharingFilterForAllPartners
Описание |
Используется рекламодателями, чтобы прекратить предоставлять данные всем сетям/интегрированным партнерам.Узнать больше |
Сигнатура метода |
|
Пример использования |
|
начать
Описание |
Запуск SDK при открытии приложения. Подробные сведения см. в разделе обинициализации SDK. |
Сигнатура метода |
|
Пример использования |
|
stop
Описание |
Прекращение выполнения всех функций SDK. Подробные сведения см. в разделе озащите конфиденциальной информации пользователей, пункт "Отказ". |
Сигнатура метода |
|
Пример использования |
|
trackAppLaunch (не рекомендуется с версии V5.2.0)
Описание |
Данный метод устарел. Вместо него используйте start. Имеет две функции:
|
Сигнатура метода |
|
Пример использования |
|
logEvent
Описание |
Отправка в AppsFlyer внутренних событий приложения. Подробные сведения см. в разделе орегистрации внутренних событий приложения. |
Сигнатура метода |
|
Пример использования |
|
updateServerUninstallToken
Описание |
Для разработчиков, которые не используют Firebase для измерения количества удалений. Подробные сведения см. в статье Измерение количества удалений. |
Сигнатура метода |
|
Пример использования |
|
waitForCustomerUserId
Описание |
Задержка инициализации SDK до установки идентификатора клиента. |
Сигнатура метода |
|
Пример использования |
|
appendParametersToDeepLinkingURL
Описание |
Позволяет владельцам приложений использовать для диплинкинга App Links (без OneLink), чтобы атрибутировать сессии, инициированные через домен, связанный с их приложением. Вызовите этот метод до вызова start.
|
Сигнатура метода |
|
Пример использования |
|
addPushNotificationDeepLinkPath
Описание |
Настройте, как SDK будет извлекать значения диплинков из полезных данных push-уведомлений. |
Сигнатура метода |
|
Пример использования |
Этому вызову соответствует следующая структура полезной нагрузки:
|
Устаревшие API
Устаревший API означает, что этот метод будет заменен другим. Для разработчиков это подходящее время, чтобы обновить код.
Дата прекращения поддержки — это дата, после которой метод перестанет работать или будет иметь ограниченные функции.
API/имя интерфейса | Устарело с версии | Дата деактивации | Изменился на |
---|---|---|---|
trackAppLaunch |
5.2.0 |
2020-10-14 |
|
sendDeepLinkData |
5.3.0 |
2020-10-14 |
|
stopTracking |
6.0.0 |
|
stop |
setCustomerIdAndTrack |
6.0.0 |
|
setCustomerIdAndLogSession |
startTracking |
6.0.0 |
|
начать |
trackLocation |
6.0.0 |
|
logLocation |
reportTrackSession |
6.0.0 |
|
logSession |
trackEvent |
6.0.0 |
|
logEvent |
setDeviceTrackingDisabled |
6.0.0 |
|
anonymizeUser |
validateAndTrackInAppPurchase |
6.0.0 |
|
validateAndLogInAppPurchase |
isStopTracking |
6.0.0 |
|
isStopped |
trackAndOpenStore |
6.0.0 |
|
logAndOpenStore |
trackCrossPromoteImpression |
6.0.0 |
|
logCrossPromoteImpression |
trackInvite |
6.0.0 |
|
logInvite |
AppsFlyerTrackingRequestListener |
6.0.0 |
|
AppsFlyerRequestListener |
Комментарии
Войдите в службу, чтобы оставить комментарий.