09 июня 2021 2 комментариев

Как вы прилу назовёте, так она и поплывет. О нейминге приложений

Привет, я 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». Там отвечаю на вопросы и регулярно делюсь полезной инфой.


Этот текст скопирован с сайта https://zorbasmedia.ru
Автор:

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

Избранные статьи
Как вы прилу назовёте, так она и поплывет. О нейминге приложений Привет, я Lukos, разработчик мобильных приложений и автор Telegram канала «Про Mobile». В одной из своих статей, я рассказывал, как интегрировать диплинки в ваше приложение. Однако сегодня диплинками уже никто не пользуется, а для атрибуции используют т.н. нейминг. Собственно, в сегодняшней статье пойдет речь о том, как же это интегрировать в свое приложение. Что такое […]...
Кейс как получить горячие 397% ROI на непопулярных КРИПТО ГЕО Дисклеймер: Кейс написан одним из партнеров CMaffiliates, пожелавшего остаться анонимным, если вы хотите узнать детали по работе с криптой, обращайтесь в поддержку, вам обязательно помогут. Выбор Офферов Партнерская сеть: CMaffiliates Офферы: Bitcoin Profit Greece BTC System Portugal Оба оффера с нативными КЦ Гео: Portugal + GreeceИсточник: FBАккаунты: Собственный Фарм Покупные Платежки: кастомное решение...
Кейс: Сливаем на CBD оффер в Канаде с ROI 110% Сегодня наблюдается тренд CBD офферов по США и Европе. Даже в глобальном плане, не только на рынке CPA-маркетинга. Европейцы очень лояльны к такому продукту. Плюс CBD офферы — это понятная целевая аудитория. Подходы аналогичны многим офферам в СНГ и знакомы, если вы уже работали с товаркой. Итак, представляем наш эксклюзивный кейс по сливу на CBD оффер в Канаде — CBD Gummies (CA) — естественное обезбол...
Комментарии
Анон
15 июня, 03:10
Переписана дока аф. Эксперты уровня /b/
Lukos
17 июня, 05:46
Да ваще мразота, на расстрел надо. И пофиг, что новички даже не понимают, что такое нейминг. 😉
Оставьте комментарий
Ответ на комментарий: ....
На этом сайте используются файлы cookie. Закрыв это сообщение и продолжая просмотр сайта, вы разрешаете их использование.