Как настроить и подключить Amplitude в проект на React Native — Expo
Эта статья описывает моё виденье того, как можно подключить Amplitude — комплексное программное обеспечение для анализа продуктов для web и мобильных устройств в проекты React Native созданные с использованием Expo Cli.
1. Настройка проекта
1.1 Установка зависимостей
Установка Amplitude в проект, созданный на Expo CLI, выполняется следующим образом:
expo install expo-analytics-amplitude
1.2 Настройка окружения amplitude в проекте
1.2.1 Перейдем в корень проекта и создадим там папку amplitude
1.2.2 В папке amplitude создадим 4 файла:
- index.js
- config.js
- events.js
- utils.js
1.2.3 В config.js экспортируем константу apiKey, пока ей будет присвоена пустая строка, мы вернемся к ней ниже
// amplitude/config.js
export const apiKey = ‘’;
1.2.4 В utils.js пропишем функцию normalizeTrackingOptions. Эта функция служит для создания объекта — опции, который содержит дополнительную информации о событии, передаваемом в Amplitude. Именно такой код рекомендует expo.io в своем примере, можете просто скопировать код ниже
// amplitude/utils.js
export function normalizeTrackingOptions(options) { if (!options) { return null; } const { usernameOrEmail, ...rest } = options; if (usernameOrEmail) { if (usernameOrEmail.includes('@')) { rest.email = usernameOrEmail; } else { rest.username = usernameOrEmail; } } return rest;}export default { normalizeTrackingOptions};
1.2.5 Файл events.js необходим для хранения и стандартизации наименований тех событий, которые мы хотим логировать в Amplitude. Например, мы хотим логировать вход пользователя в приложение, для этого создадим константу LOG_IN, которою будем передавать в функцию логирования. Таким же образом можно логировать ошибки.
// amplitude/events.js
export default {
ERROR_EVENT: 'ERROR_EVENT',
LOG_IN: 'LOG_IN'
};
1.2.6 В файл index.js импортируем Amplitude из expo-analytics-amplitude, apiKey из config.js, normalizeTrackingOptions из utils.js и eventAction из events.js
// amplitude/index.js
import * as Amplitude from 'expo-analytics-amplitude';import { apiKey } from './config';import { normalizeTrackingOptions } from './utils';import eventActions from './events';
И сразу экспортируем events, это нужно для удобного доступа к ним.
// amplitude/index.js
export const events = eventActions;
1.2.7 Теперь создадим фикцию инициализации Amplitude, она необходима для авторизации в сервисе по apiKey
Она будет вызывать метод initialize у Amplitude с нашим apiKey, это выглядит так:
// amplitude/index.js
export function initialize() {
Amplitude.initialize(apiKey);
}
1.2.8 Создадим функцию identify для идентификации наших пользователей приложения в Amplitude по их данным, например, получаемых с api.
Она будет принимать id пользователя (id, который присвоен вашему пользователю при регистрации в вашем приложении, если такой есть) и options (дополнительная информация о пользователе, например имя, email, дата рождения и др.). Выглядит следующим образом:
// amplitude/index.js
export function identify(id, options) {
// Инициализируем Amplitude
initialize(); // формируем properties через заранее подготовленную
// функцию normalizeTrackingOptions
const properties = normalizeTrackingOptions(options);
if (id) {
// Если есть возможность идентифицировать пользователя по id,
// устанавливает пользователю его id в Amplitude.
// В обратном, Amplitude присвоит пользователю случайный id)
Amplitude.setUserId(id); if (properties) {
// Устанавливаем пользователю properties
Amplitude.setUserProperties(properties);
} } else { Amplitude.clearUserProperties(); }}
1.2.9 Создадим фикцию logEvent для логирования событий в приложении
// amplitude/index.js
export function logEvent(event, options) { // Инициализируем Amplitude
initialize(); // формируем properties через заранее подготовленную
// функцию normalizeTrackingOptions
const properties = normalizeTrackingOptions(options); if (properties) { Amplitude.logEventWithProperties(
event,
{ event: properties }
); } else { Amplitude.logEvent(event); } console.log('Amplitude logEvent: ', event);}
1.2.10 В завершении, экспортируем events, initialize, identify, logEvent из index.js
// amplitude/index.js
export default { events, initialize, identify, logEvent,};
Целиком index.js выглядит так:
// amplitude/index.js
import * as Amplitude from 'expo-analytics-amplitude';
import { apiKey } from './config';
import eventActions from './events';
import { normalizeTrackingOptions } from './utils';export const events = eventActions;export function initialize() {
Amplitude.initialize(apiKey);
}export function identify(id, options) {
initialize();
const properties = normalizeTrackingOptions(options);
if (id) {
Amplitude.setUserId(id);
if (properties) {
Amplitude.setUserProperties(properties);
}
} else {
Amplitude.clearUserProperties();
}
}export function logEvent(event, options) {
initialize();
const properties = normalizeTrackingOptions(options);
if (properties) {
Amplitude.logEventWithProperties(
event,
{ event: properties }
);
} else {
Amplitude.logEvent(event);
}
}export default {
events,
initialize,
identify,
logEvent,
};
1.3 Подключение логера Amplitude в компонент приложения
1.3.1 Импортируем logEvent и events в компонент, действия которого необходимо логировать, например в App.js
// App.js
import { logEvent, events } from '../amplitude';
1.3.2 В App.js создадим тестовую кнопки LogIn и Error. LogIn будет имитировать вход в приложение. Error — соответственно, будет имитировать ошибку. А так же создадим хендлер onPressHandler для LogIn кнопки и errorHandler для Error кнопки. В них мы будем вызывать logEvent с событиями, которые мы подготовили в файле events.js
// App.js
import * as React from 'react';
import { StyleSheet, View, Button } from 'react-native';
import { logEvent, events } from './amplitude';export default function App() {
const user = { userName: 'Jack', email: 'Jack@Jack.com' };
const error = { code: 400, message: 'Not Found' }; const apiLogIn = () => {
// Имитация запроса к серверу
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('user', user);
identify(user.id, user);
resolve(user);
}, 1000)
});
} const onPressHandler = () => {
const apiUser = await apiLogIn();
logEvent(events.LOG_IN, apiUser);
}; const errorHandler = () => {
logEvent(events.ERROR_EVENT, error);
}; return (
<View style={styles.container}>
<Button onPress={onPressHandler} title="LogIn" />
<Button
onPress={errorHandler}
color="orangered"
title="Error"
/>
</View>
);
}const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
}
});
На этом настройка нашего приложения завершена, теперь необходимо настроить аккаунт в Amplitude.
2 Создание и настройка аккаунта и проекта в Amplitude
2.1 Регистрация
2.1.1 Переходим на сайт https://amplitude.com/ и жмем Explore demo now
2.1.2 Вводим email
2.1.3 Выбираем направленность вашего приложения, например Media и жмем Next
2.1.4 Вводим свои данные
На данный момент открыта демо версия с различными метриками. Метрики подобраны под направленность компании, которая была выбрана ранее (Media). Тут можно изучить как работает Amplitude, увидеть систему в рабочем состоянии на demo данных.
2.1.5 Далее, идем в почту, находим письмо от Amplitude, переходим по ссылке, подтверждаем валидность email, вводим данные в форму и жмем Activate
2.1.6 Теперь, когда мы уже все проверили, изучили и подтвердили, в самом верху страницы жмем кнопку Set up on the Free Plan.
2.1.7 Вводим имя организации (будет отображаться в системе), url по которому будет доступен ваг аккаунт Amplitude и жмем Create
Поздравляю, теперь у вас есть аккаунт на Amplitude, давайте его настроим
2.2 Настройка проекта
2.2.1 Жмем Create Project, вводим имя проекта и жмем Create
2.2.2 Это главная страница проекта, на ней нас интересует API Key. Копируем его в файл сonfig.js и жмём Add Data Source
2.2.3 Выбираем iOS SDK и жмём Next и снова Next
Сейчас Amplitude ждёт события от приложения. Как только событие будет отправлено, Amplitude получит его и укажет здесь.
2.2.4 Теперь запускаем наше приложение в симуляторе iPhone и жмем кнопку Login, чтобы отправить первый ивент после чего Amplitude должен получить событие и выдать такое окно. Дальше, жмём Finish
2.2.5 Чтобы добавить Android, проделайте подобное (2.2.3–2.2.5) для Android SDK и симулятором Android.
На этом всё, Amplitude добавлен в ваш проект на React Native — Expo.
Теперь вам остаётся только настроить нужные для вас метрики и мониторинг.
Например, чтобы посмотреть информация о событии LOG_IN или ERROR_EVENT, которые мы создали выше, можно перейти на страницу https://analytics.amplitude.com/ИМЯ_ВАШЕЙ_КОМПАНИИ/activity и увидеть статистику
На этом всё.
Спасибо всем, кто читал!
Надеюсь, эта статья была вам полезна.
Буду рад обратной связи в комментариях.
Ссылка на репозиторий: https://github.com/gthrm/amplitude_to_react_native_expo_example