Перейти к содержанию

Использование UX Rocket SDK в мобильных приложениях

Решение UX Rocket позволяет настраивать сбор данных о поведении пользователя в мобильном приложении, проводить А/В-тестирование и персонализировать внешний вид страниц под целевые группы пользователей.

При сборе данных мобильное приложение передаёт в UX Rocket информацию об открытии страниц, нажатии кнопок, кликах в меню, переходах по ссылкам, покупках и других событиях, а UX Rocket сохраняет поток событий на сервере и предоставляет маркетологу инструменты для построения отчётов и исследования данных.

Image title

При А/В-тестировании и персонализации мобильное приложение сообщает UX Rocket об открытии новых страниц, а UX Rocket возвращает данные о перечне визуальных элементов мобильного приложения, которые надо изменить, и новых значениях свойств для этих элементов. Список тестируемых кампаний и результаты тестирования можно посмотреть в личном кабинете в режиме реального времени.

Image title

Важно помнить

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

Для удобства работы с API UX Rocket разработан SDK, который решает следующие задачи:

  • Автоматическое заполнение большинства параметров устройства;
  • Кеширование обращений к API при отсутствии Интернета и последующая передача данных в фоновом режиме.

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

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

Основные функции SDK

  • Сбор сведений о поведении пользователя в мобильном приложении: переходы между экранами и взаимодействие с элементами интерфейса;
  • Персонализация отображаемого контента в разрезе целевых групп пользователей;
  • Сбор сведений о взаимодействии с персонализированным контентом и связанных с этим целевых действиях (например, покупка в приложении).

Поддерживаемые платформы

SDK поддерживает работу на платформах и поставляется в следующих форматах:

  • Android – AAR
  • iOS – Swift Package Manager

Начало работы с SDK

  1. Для подключения к API необходимо узнать URL (service_url) по которому оно расположено. Если UX Rocket развёрнут на локальных серверах вашей компании, то адрес для подключения нужно выяснить у системного администратора. Если используется облачная подписка UX Rocket, то адрес для подключения: https://api.uxrocket.ru/mobile Описание методов приведено в Swagger: {service_url}/swagger

  2. Для получения списка всех доступных параметров пользователя, которые нужно передавать в API, вызовите сервис {service_url}/GetParams. Как правило набор этих параметров фиксированный и редко дополняется, поэтому нет необходимости вызывать метод из приложения. Достаточно получить список параметров и их коды при подключении SDK и отслеживать появление новых параметров при выпуске новых версий мобильного приложения.

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

Подключение библиотеки SDK

Android

В build.gradle (Module) добавить:

1) в раздел "repositories":
repositories {
  google()
  mavenCentral()
  ...
  maven {
    url = uri('https://git.uxrocket.ru/api/v4/projects/3/packages/maven')
  }
}

2) в раздел "dependencies" :
dependencies {
  ...
  implementation 'com.uxrocket:android-sdk:{version}' // Здесь {version} - это, например, 1.0.15 или другой номер версии библиотеки
}

iOS

SPM (Swift Package Manager)

В Xcode:

  1. File → Add Packages
  2. Указать адрес репозитория https://git.uxrocket.ru/sdk/ux-rocket-sdk-ios
  3. Dependency Rule минимальная версия 1.0.5
  4. Нажать Add Package

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

Для инициализации SDK необходимо вызвать метод SDK configure, передав в него параметры авторизации:

  • authKey – код Клиента, который является уникальным для каждого. В примере 2JIJ67L7CS
  • appRocketId – идентификатор вашего приложения, в примере test_ios_sdk_uxrocket и test_android_sdk_uxrocket
  • serverEnvironment – строка подключения к API UX Rocket

Android

override fun onCreate() {
        super.onCreate()
        instance = this
        UXRocket.configure(
            authKey = "2JIJ67L7CS",
            appRocketId = "test_android_sdk_uxrocket",
            serverEnvironment = UXRocketServer.develop(),
            appContext = applicationContext
        )
    }

iOS

func application(application: UIApplication, didFinishLaunching
    WithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UXRocket.configure(
            withAuthKey: "2JIJ67L7CS", 
            rocketAppID: "test_ios_sdk_uxrocket", 
            serverEnvironment: .develop)
            enabledAutoTrack: false
        return true
    }

Установка значений по умолчанию

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

  • Метод setParams принимает id и value для params, которые будут сохранены в SDK и устанавливаться по умолчанию в методах, если параметры с соответствующими id не заполнены.
  • Данные хранятся в пределах сессии
  • После завершения сессии сохраненные значения удаляются
  • Можно сохранять при помощи метода любые значения и переменные
  • Корректность значений методом не проверяется

Входные данные от МП:

Параметр Описание Тип данных
id Идентификатор параметра int
value Значение параметра varchar

Важно помнить

При корректном сохранении в SDK значений по умолчанию возвращается код «ОК», в противном случае «Error».

Android

UXRocket.setDefaultsParams(
    listOf(
        AttributeParameter("2", "Красный"),
        AttributeParameter("3", "Черный")
    )
)

iOS

UXRocket.setDefaultParameters(
    [
          .init(id: 1, value: "Желтый"),
          .init(id: 2, value: "true"),
          .init(id: 3, value: "false")
    ]
)

Геолокация

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

  • Метод принимает значения city и country, когда их надо сменить при смене геолокации.
  • Данные хранятся в пределах сессии
  • После завершения сессии сохраненные значения удаляются
  • Корректность значений методом не проверяется

Android

UXRocket.setCountryAndCity("Russia", "Moscow")

iOS

UXRocket.setCountryAndCity("Russia", "Moscow")

Сбор сведений о поведении пользователя в мобильном приложении

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

Android

Регистрация события:
UXRocket.logEvent(
    itemIdentificator = "идентификатор или имя элемента",
    itemName = "надпись на элементе",
    event = "контекст события",
    parameters = List<AttributeParameter> //массив параметров
)

iOS

Регистрация события:
UXRocket.logEvent(
    event: "контекст события",
    itemName: "надпись на элементе",
    itemIdentificator: "идентификатор или имя элемента",
    parameters: [AttributeParameter] = [] //массив параметров
)

Описание параметров

Контекст события

Значение event определяет тип события. В параметр event передается строка, отражающая тип логируемого события. Перечень типов событий согласовывается на этапе внедрения SDK.

Примеры контекста события:

Значение Описание
install Установка приложения
update Обновление приложения
openpage Открытие очередного экрана приложения
buttons Нажатие на кнопку

Набор атрибутов события

Большинство параметров собирает сам SDK, они описаны в таблице ниже. Ряд событий, связанных с таргетингом, нужно передавать явно при вызове метода logEvent. Значение parameters является массивом пар ключ (int) и значение (string). Массив может принимать до 30 пар ключ-значение. Метод logEvent следует вызывать при взаимодействии пользователя с элементом интерфейса. Перечень отслеживаемых элементов согласовывается с маркетологом на этапе внедрения SDK. Примеры вызова:

iOS

UXRocket.logEvent(
                  event: "button",
                  itemName: "buttonTitle",
                  itemIdentificator: "itemIdentifier",
                  parameters: [.init(id: 2, value: "Красный")]
        )

Android

UXRocket.logEvent(
                            itemIdentificator = "nav_search_button",
                            itemName = "Nav search button pressed",
                            event = ContextEvent.MAIN_MENU,
                            parameters = listOf(
                                      AttributeParameter("2", "Красный"),
                                      AttributeParameter("3", "Черный")
                                )
                        )

Список параметров, которые необходимо передавать явно

Значение Описание
itemIdentificator Идентификатор элемента в интерфейсе МП
itemName Надпись на элементе МП, если применимо (например, надпись на кнопке)
event Тип действия. Допускаются любые строковые значения, могут быть настроены пользовательские значения событий
parameters Необязательное поле. Заполняется массивом параметров, если необходимо их сохранение для дальнейшего анализа

Список параметров, собираемых SDK автоматически

Значение Описание
app_rocket_id Идентификатор приложения для UX Rocket
captured_dt Дата-время наступления события
device_id Для IOS – IFV. Для Android – google_aid
os_name Имя операционной системы на устройстве пользователя
os_version Версия операционной системы на устройстве пользователя
device_model Модель устройства (например, Galaxy S6)
device_type Тип устройства. Возможное значение:phone
device_locale Язык интерфейса устройства. Например, en_us
app_version_name Версия приложения в виде, как указана разработчиком
app_package_name Имя пакета для Android или Bundle ID для Ios
connection_type Тип подключения устройства. Возможное значение: wifi
operator_name Имя оператора сотовой связи
resolution Разрешение экрана пользователя

Передача данных при работе с корзиной

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

  • productCode – идентификатор товара
  • productPrice – цена товара
  • productCount – количество товара
  • cartSum – сумма товаров в корзине

Указанные параметры также требуют явной передачи в методе UXRocket.logEvent и позволяют реализовать различные сценарии работы с корзиной – добавление товара в корзину, удаление товара из корзины, очистка корзины, оплата товаров и прочее. Примеры вызова:

iOS

// добавление товара в корзину
UXRocket.logEvent(
            event: "add_to_cart",
            itemName: "add_item_button pressed",
            itemIdentificator: "add_item_button",
            productCode: newItem.name,
            productPrice: newItem.price,
            productCount: items.count,
            cartSum: total)

//отправка корзины в оплату
UXRocket.logEvent(
            event: "cart_checkout",
            itemName: "checkout_button pressed",
            itemIdentificator: "checkout_button",
            productCode: "All Items",
            productPrice: nil,
            productCount: items.count,
            cartSum: total)

Android

// добавление товара в корзину
private fun addItem() {
        val countItems = cartItems.count() + 1
        val newItem = Item("New Item$countItems")
        cartItems.add(newItem)
        adapter.notifyDataSetChanged()

        UXRocket.logEvent(
            itemIdentificator = "add_item_button",
            itemName = "add_item_button pressed",
            event = "add_to_cart",
            cartSum = cartItems.sumOf { item: Item -> item.price},
            productCode = newItem.name,
            productCount = countItems,
            productPrice = newItem.price,
        )
    }

//отправка корзины в оплату
UXRocket.logEvent(
            itemIdentificator = "checkout_button",
            itemName = "checkout_button pressed",
            event = "cart_checkout",
            cartSum = cartItems.sumOf { item: Item -> item.price},
            productCode = "All Items",
            productCount = cartItems.count(),
            productPrice = null,
        )

Применение вариантов таргетинга

При отрисовке страницы мобильного приложения необходимо получить варианты таргетинга. Для этого надо вызвать метод «getUIConfiguration» и проанализировать его ответ. В ответе содержится несколько массивов variantAttrs. Из этих массивов нужно взять данные для персонализации. Для дальнейшего поиска элементов, изменение которых требуется отслеживать, разработчик должен назначить им персональные идентификаторы, например id или name. Перечень отслеживаемых элементов согласовывается с маркетологом на этапе внедрения SDK. Для каждого элемента массива на странице ищется элемент интерфейса с идентификатором равным значению поля item. Если такой элемент найден, то его атрибутам следует присвоить значения, содержащиеся во вложенном массиве attributes.

Пример:

[
    {
        "id": 7,
        "variants": [
            {
                "id": 50,
                "element_id": 24,
                "variant_attrs": [
                    {
                        "item": "FourthVC_LeftButton",
                        "attributes": [
                            {
                                "attribute": "text",
                                "value": [
                                    {
                                        "value": "Много текста, держи еще два,
                                        "state": ["highlighted"]
                                    },
                                    {
                                        "value": "Тут будет не так много текста"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "id": 52,
                "element_id": 25,
                "variant_attrs": [
                    {
                        "item": "FourthVC_RightButton",
                        "attributes": [
                            {
                                "attribute": "text",
                                "value": "Push me, please!"
                            },
                            {
                                "attribute": "text-color",
                                "value": "#000000"
                            }
                        ]
                    }
                ]
            }

        ],
        "actions": [
            {
                "id": 23,
                "name": "ClickButton",
                "item": "ViewController_FirstButton",
                "action_type": 1,
                "counting_type": 1
            },
            {
                "id": 24,
                "name": "SecondSumLabel",
                "item": "FourthVC_SecondSumLabel",
                "action_type": 0,
                "counting_type": 2
            },
            {
                "id": 25,
                "name": "ClickImage",
                "item": "FourthVC_ImageView",
                "action_type": 1,
                "counting_type": 1
            }
        ]
    }
]

В указанном примере, помимо прочего, для элемента интерфейса с идентификатором «FourthVC_RightButton» необходимо:

  • атрибуту "text" присвоить значение "Push me, please!"
  • атрибуту "text-color" присвоить значение"#000000"

Аналогичным образом необходимо обработать пришедшие в ответе метода массивы «actions». Каждый элемент массива указывает на целевое действие (например, тап по кнопке), настроенное маркетологом для сохранения.

Важно помнить!

Перечень отслеживаемых действий согласовывается с маркетологом на этапе внедрения SDK.

Примеры:

Android

val params = listOf(AttributeParameter(id = "1", value = "190"))
val customizingItems = listOf(binding.homeBannersButton, binding.addCustomBannerButton)
val fragmentName = "HomePage"
UXRocket.getUIConfiguration(
            activityOrFragmentName = fragmentName,
            parameters = params,
            callback = {
                UXRocket.customizeItems(
                    items = customizingItems,
                    campaigns = it,
                    activityOrFragmentName = fragmentName
                )
                UXRocket.processActions(
                    items = customizingItems,
                    campaigns = it,
                    activityOrFragmentName = fragmentName,
                    parameters = params
                )
})

iOS

UXRocket.getUIConfiguration(
                forItem: vcIdentifier,
                parameters: [.init(id: 2, value: "2")]
            ) { response in
                self.alert.dismiss(animated: true)

                guard let response = response else { return }

                UXRocket.customizeItems(elementsToCustomize, with: response)
                UXRocket.logCampaignEvent(viewControllerID: vcIdentifier, totalValue: Int(self.secondSumLabel.text ?? "150") ?? 150)
            }