Нейминг приложений

Привет, я Lukos, разработчик мобильных приложений и автор Telegram канала «Про Mobile». В одной из своих статей, я рассказывал, как интегрировать диплинки в ваше приложение. Однако сегодня диплинками уже никто не пользуется, а для атрибуции используют т.н. нейминг. Собственно, в сегодняшней статье пойдет речь о том, как же это интегрировать в свое приложение.

Что такое нейминг в приложениях?

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

Интеграция нейминга в свое приложение

На самом деле, реализовать нейминг не так уж и сложно. Все SDK уже давно написаны, вам остается лишь интегрировать их в свой код.
Разные команды используют различные SDK, но чаще всего это: Branch, Appsflyer или Adjust. Я рассмотрю реализацию нейминга через Appsflyer, так как его используют чаще всего. К тому же, там есть тестовый период бесплатного использования, и, скорее всего, вы убьете приложение раньше, чем придется платить. Отличный вариант, для таких жидов как мы экономии бюджета. 

Собственно, расписываю шаги поэтапно:

  1. Идем на сайт AppsFlyer.com и регистрируемся.

    Нейминг приложений
    В качестве информации можно писать что угодно, но e-mail должен быть настоящим, т.к туда придет подтверждение активации аккаунта и ключ для API.
  2. Дальше вам на почту придет Dev Key. Его необходимо сохранить, потому что он нам понадобится в дальнейшем.

    Нейминг приложений
  3. После этого, заходим в аккаунт Appsflyer и добавляем туда имя пакета нашего приложения.

    Нейминг приложений
  4. Далее идём в Configuration > Integrated Partners и выбираем Facebook.

    Нейминг приложений
    И активируем его, как партнера, при этом вставляя ID приложения FB.

    Нейминг приложений

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

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

implementation 'com.appsflyer:af-android-sdk:6.2.3'
implementation 'com.android.installreferrer:installreferrer:2.2'


В манифесте добавляем следующее:

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


Appsflyer SDK добавлен в наш проект. Все, что нам остается
это получить аттрибуцию. Делать это мы будем в активити (в официальной документации, рекомендуется это делать на уровне класса, который наследуется от Application).
Для начала создаем переменную, в которой будет храниться наш Devkey.

Нейминг приложений

После этого создаем метод, в котором мы будем имплементировать интерфейс Appsflyer.

fun appsflyerIntegrationExample(){

    val appsflyer = AppsFlyerLib.getInstance()
    appsflyer.setMinTimeBetweenSessions(0)
    appsflyer.setDebugLog(
true)

    val conversionListener: AppsFlyerConversionListener =
        object : AppsFlyerConversionListener {
            override fun
onConversionDataSuccess(conversionData: Map<String, Any>) {

            }

            override fun
onConversionDataFail(errorMessage: String) {

                Log.d(«LOG_TAG», «error getting conversion data: $errorMessage«)

            }

            override fun
onAppOpenAttribution(attributionData: Map<String, String>) {
                for (attrName in attributionData.keys) {
                    Log.d(
                        «LOG_TAG»,
                        «attribute: » + attrName + « = » + attributionData[attrName]
                    )
                }
            }

            override fun
onAttributionFailure(errorMessage: String) {
                Log.d(«LOG_TAG», «error onAttributionFailure : $errorMessage«)
            }
        }

    appsflyer.init(devKey, conversionListener, this)
    appsflyer.start(this)

}


Здесь, по сути, копипаста из официальной документации, и можно сильно не вникать. 

Нас интересует onConversionDataSuccess. Там мы создаем переменную status, в которую принимаем значение исходя из того, является ли наш трафик органическим, или нет. В случае, если вы интегрировали все правильно, в LogCat’e увидите, что пришел ответ 200, и дальше выполнится данный callback. Если же вы не добавили имя пакета приложения Appsflyer, или же Devkey оказался неверным, то прилетят ошибки 400 и 404.

val status = Objects.requireNonNull(conversionData[«af_status»]).toString()


После чего проверяем источник трафика. И если трафик является не органическим, мы сохраняем имя адсета и кампании.

if (status == «Non-organic») {

    if (conversionData[«adset»] != null) {
        builder?.appendQueryParameter(
            «adset»,
            conversionData[«adset»].toString()
        )
    }

    if (conversionData[«campaign»] != null) {

        builder?.appendQueryParameter(
            «campaign»,
            conversionData[«campaign»].toString()
        )

 

    }

}


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

По итогу весь метод будет выглядеть следующим образом. 

fun appsflyerIntegrationExample(){

    val appsflyer = AppsFlyerLib.getInstance()
    appsflyer.setMinTimeBetweenSessions(0)
    appsflyer.setDebugLog(true)

    val conversionListener: AppsFlyerConversionListener =
        object : AppsFlyerConversionListener {
            override fun onConversionDataSuccess(conversionData: Map<String, Any>) {

                val status = Objects.requireNonNull(conversionData[«af_status»]).toString()

                if (status == «Non-organic») {

                    if (conversionData[«adset»] != null) {
                        builder?.appendQueryParameter(
                            «adset»,
                            conversionData[«adset»].toString()
                        )
                    }

                    if (conversionData[«campaign»] != null) {

                        builder?.appendQueryParameter(
                            «campaign»,
                            conversionData[«campaign»].toString()
                        )

                    }

                }
            }

            override fun onConversionDataFail(errorMessage: String) {
       
                Log.d(«LOG_TAG», «error getting conversion data: $errorMessage«)

            }

            override fun onAppOpenAttribution(attributionData: Map<String, String>) {
                for (attrName in attributionData.keys) {
                    Log.d(
                        «LOG_TAG»,
                        «attribute: « + attrName + « = » + attributionData[attrName]
                    )
                }
            }

            override fun onAttributionFailure(errorMessage: String) {
                Log.d(«LOG_TAG», «error onAttributionFailure : $errorMessage«)
            }
        }

    appsflyer.init(devKey, conversionListener, this)
    appsflyer.start(this)


Дальше просто все параметры из Builder’a добавляем к нашей линке, которая ведет на оффер.

url += builder.toString()


Т.е в данном случае, если имя нашего campaign test_test_test и adset myAdset, то финальная линка получится такая: https://example.com/?campaign=test_test_test&adset=myAdset

В логике своей клоаки стоит учесть, что Appsflyer работает не в главном потоке, и если вы не дождетесь его выполнения, то в url, которое будет открываться в WebView, вы не передадите параметры. Также, желательно обрабатывать слушатель onAttributionFailure. Если ваше приложение проживет дольше, чем тестовый период Appsflyer, то именно в эту ошибку вы и будете упираться

Собственно, на этом все. Как можно понять из примера выше, интеграция нейминга не самая сложная задача, с которой может справиться каждый.


Если у вас появятся вопросы или комментарии, можете писать мне в Telegram-канал «Про Mobile». Там отвечаю на вопросы и регулярно делюсь полезной инфой.

Есть что рассказать об арбитраже трафика?
Стань автором ZorbasMedia!
Оставить заявку