AppMetrica в React Native: как настроить и подключить инструмент

AppMetrica в React Native
Задача
Хаотичные данные, баги, недостверная информация
Решение
Управляемая предсказуемая система, точные отчеты

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

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

 

Но инструмент — это лишь половина дела. Мы сосредоточимся на том, как его использовать, чтобы построить систему со следующими свойствами: 

Масштабируемость: Добавление нового события — это декларативное изменение в одном файле, а не императивный поиск по всему проекту. 

Compile-time безопасность: Мы заставим TypeScript работать на нас. Он будет нашим главным ревьюером, который отловит ошибки в именах и параметрах событий еще до того, как код попадет в CI. 

Единый источник правды: Наш конфигурационный файл станет живой документацией и формальным контрактом между разработкой и аналитиками. 

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

Шаг 1: Подготовка плацдарма в AppMetrica

Прежде чем писать код, нужно создать для нашего приложения «проект» в веб интерфейсе AppMetrica. 

  1. Открываем панель AppMetrica и входим с Яндекс ID. 
  2. Нажимаем «Добавить приложение». 
  3. Заполняем базовую информацию: название, URL в сторах (если есть) и, что важно, часовой пояс для корректного отображения отчетов. 
  4. Принимаем условия и завершаем создание.

Важный нюанс: если ваше приложение работает и на iOS, и на Android, используйте для обеих платформ один и тот же API-ключ. Это позволит консолидировать данные в едином отчете, что значительно упростит анализ. 

Шаг 2: Получение API-ключа

Сразу после создания приложения система сгенерирует API-ключ. Его следует скопировать. Если вы пропустили этот шаг, ключ всегда можно найти в настройках приложения в разделе «Основное». В реальном проекте этот ключ, разумеется, стоит хранить в переменных окружения, а не хардкодить.

Шаг 3: Установка зависимостей

Теперь переходим к коду. Устанавливаем пакет стандартным способом: 

# npm 

npm install @appmetrica/react-native-analytics —save 

# yarn 

yarn add @appmetrica/react-native-analytics 

Для iOS не забываем установить нативные зависимости: 

cd ios 

pod install 

Android, как правило, не требует дополнительных танцев с бубном благодаря автолинкингу.

Шаг 4: Инициализация SDK

SDK нужно активировать один раз при старте приложения. Чтобы не загрязнять корневой компонент, вынесем всю логику, связанную с аналитикой, в отдельный сервисный модуль, например, services/metrica.ts

Функция активации

// services/metrica.ts 

import AppMetrica from ‘@appmetrica/react-native-analytics’

/** 

* Инициализирует AppMetrica SDK. 

* Вызывается один раз при старте приложения.

*/ 

export const activateMetrica = () =>

AppMetrica.activate({ 

apiKey: ‘abcde-abcde-abcde-abcde-abcde’, // В проде забираем из env 

sessionTimeout: 120, // Таймаут сессии в секундах 

logs: __DEV__, // Очень полезно для отладки: выводит в консоль все вызовы SDK 

}); 

}; 

Вызов в корневом компоненте

// App.tsx 

import React, { useEffect } from ‘react’

import { activateMetrica } from ‘./services/metrica’

const App = () =>

useEffect(() =>

activateMetrica(); 

}, []); 

// … 

}; 

export default App;

Шаг 5: Проектирование схемы событий

Это сердце нашей архитектуры. Мы создадим единый объект-конфигурацию, который станет декларативным описанием всей нашей аналитики. Каждое событие будет иметь общее имя (`eventName`), которое увидят аналитики, и функцию `buildPayload` — фабрику, отвечающую за корректную структуру параметров.

// services/metrica.ts 

// Типизируем параметры для строгости и автодополнения 

type TaskSource = ‘Мои’ | ‘Участвую’ | ‘Контролирую’ | ‘Сегодня’

type SectionTab = ‘Сегодня’ | ‘Контролирую’ | ‘Участвую’ | ‘Мои’; type RegulationTab = ‘Изучить’ | ‘Все’

// Наш единый источник правды 

export const ANALYTICS_EVENTS =

sections: {

openTasks:

eventName: ‘Раздел’

buildPayload: () => ({ ‘Задачи’: ‘(открытие)’ }), 

}, 

openRegulations:

eventName: ‘Раздел’

buildPayload: () => ({ ‘Регламенты’: ‘(открытие)’ }), 

}, 

selectTasksTab:

eventName: ‘Раздел’

buildPayload: (tabName: SectionTab) => ({ ‘Задачи’: tabName }), }, 

}, 

task:

open:

eventName: ‘Задача’

buildPayload: (source: TaskSource) => ({ ‘(открытие)’: source }), }, 

createStart:

eventName: ‘Задача’

buildPayload: () => ({ ‘(создание)’: ‘(начало)’ }), 

}, 

} as const; // `as const` здесь — ключ к магии TypeScript, он делает тип неизменяемым 

Шаг 6: Статическая магия TypeScript

На первый взгляд эти типы могут показаться сложными, но их работа проста: они статически анализируют объект ANALYTICS_EVENTS и выводят из него все возможные ключи событий и типы аргументов для их buildPayload

// … после ANALYTICS_EVENTS 

// Генерирует все возможные ключи, например ‘sections.openTasks’ | ‘task.open’
type EventKey = { /* … */ }; 

// По ключу события определяет, какие аргументы ожидает его buildPayload type ArgsForEvent<K extends EventKey> = { /* … */ };

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

Шаг 7: Реализация универсального диспетчера reportEvent

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

// services/metrica.ts 

export const reportEvent = <K extends EventKey>

eventKey: K

args: ArgsForEvent<K> 

) =>

// 1. Находим нужную конфигурацию в нашей «схеме» 

const [groupKey, actionKey] = eventKey.split(.);
const config = (ANALYTICS_EVENTS as any)[groupKey]?.[actionKey]; 

if (!config) { 

console.warn(`Конфигурация для аналитического события «${eventKey}» не найдена.`); 

return

const { eventName, buildPayload } = config

// 2. Генерируем полезную нагрузку (payload) с помощью фабрики const payload = buildPayload(args); 

// 3. Отправляем событие, будучи уверенными в его корректности console.log(`Reporting event: «${eventName}«`, payload); 

AppMetrica.reportEvent(eventName, payload); 

}; 

Шаг 8: Использование в компонентах: чистота и безопасность

А теперь — вишенка на торте. Посмотрим, как элегантно и безопасно выглядит отправка событий из компонентов. 

import { reportEvent } from ‘./services/metrica’

import { Button, View } from ‘react-native’

const MyScreen = () =>

return

<View

{/* Пример 1: Вызов без параметров. Автодополнение подскажет ключ. */}

<Button 

title=«Открыть раздел Регламенты» 

onPress={() => reportEvent(‘sections.openRegulations’)} 

/> 

{/* Пример 2: Вызов с параметром. TypeScript проследит за его типом. */

<Button 

title=«Показать задачи на сегодня» 

onPress={() => reportEvent(‘sections.selectTasksTab’

‘Сегодня’)} 

/> 

{/* Любая из следующих строк вызовет ошибку еще на этапе написания кода, а не в продакшене: */

{/* 

// ОШИБКА: такого события не существует в нашей схеме 

reportEvent(‘sections.open_tasks’); 

// ОШИБКА: событие ‘selectTasksTab’ требует один аргумент, а мы не передали ничего 

reportEvent(‘sections.selectTasksTab’); 

// ОШИБКА: ‘НеверныйТаб’ не соответствует типу SectionTab 

(‘Сегодня’ | ‘Мои’ | …) 

reportEvent(‘sections.selectTasksTab’, ‘НеверныйТаб’); 

*/

</View

); 

};

Что мы получили в итоге? Мы трансформировали потенциально хаотичный процесс интеграции аналитики в управляемую и предсказуемую систему. Наш конфигурационный файл — это не просто объект, это «контракт», который обеспечивает консистентность данных. 

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

Оставить заявку

Проконсультируем по всем вопросам

Оставить заявку

Читать еще...

Бот для Макс
Бот для Telegram

Панель коммуникатора для автошколы Вектор

Система автоматизации контроля задач
Чат-бот

Как создать бота в мессенджере Макс?

Создание чат-бота в Максе на Laravel
Ошибки
Полезное

Сайт исчез из выдачи?

14 причин, по которым сайт может выпасть из Яндекса
Напишите нам